本篇主要介绍了string和stringbuffer的区别,适用于初学者。
1、二者区别
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
所以,使用 String 类的场景为:在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算。
StringBuffer 每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
所以,使用 StringBuffer 类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用 StringBuffer,例如 XML 解析、HTTP 参数解析和封装。
例子:
public static void main(String[] args) {
StringBuffer s = new StringBuffer("abc");
s.append("dd");
s.insert(2, 3);
System.out.println(s.hashCode());
String s1 = "abc";
s1 = "dde";
s1 = s1.substring(0,2);
System.out.println(s1.hashCode());
}
对s的修改始终在原来内存单元进行,所有哈希码不变。S1的任何变化都会生成新的对象,所以哈希码会改变。
public static void main(String[] args) {
StringBuffer s = new StringBuffer("abc");
s.append("dd"); // 追加字符
s.insert(2, 3); // 插入
s.replace(0, 3, "A");// 替换
System.out.println(s);
String s1 = "abc";
s1.concat("def"); //链接字符串
s1.replace('a', 'z'); // 替换
s1.toUpperCase(); //转为大写
System.out.println(s1);
}
对s进行追加,插入等,会改变s的值。对s1进行操作,每次操作都会产生新的对象,而不会改变原来字符串本身。
2、构造方法
String s1 = “hello”;
String s2 = new String(“hello”);
StringBuffer s3= new StringBuffer(“hello”);
3、二者的方法——见API手册
注:哈希码
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
下面给出几个常用的哈希码的算法。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。