1.String:
? 是对象不是原始类型.
? 为不可变对象,一旦被创建,就不能修改它的值.
? 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
? String 是final类,是不能被继承的。
2.StringBuffer:
? 是一个可变对象,对他进行修改时不需要重新创建对象。
? 需要以构造命令进行创建,StringBuilder sb = new StringBuilder();,不能通过赋值命令进行赋值。
? 对象被创建后,会在内存中分配一个内存空间并初始化null,可以通过append方法对他赋值:sb.append();
如此程序所示,String需要重新创建对象,原内容要被回收,影响性能。
String str = new String("welcome to ");
str += "here";
故我们可以将程序改为:
String str = new String("welcome to ");
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
String类重写了equals方法和hashcode方法,但是StringBuffer类没有重写equals方法和hashcode方法,所以请看下面的程序(摘自核心卷Ⅰ P171):
String s = "OK";
StringBuffer sb = new StringBuffer(s);
System.out.println(s.hashCode()+" "+ sb.hashCode());// 2524 1355531311
String t = new String("OK");
StringBuffer tb = new StringBuffer(t);
System.out.println(t.hashCode()+" "+ tb.hashCode());// 2524 1435804085
字符串s与t拥有相同的散列码,这是因为字符串的散列码是由内容导出的。而字符串缓冲sb和tb却有着不同的散列码,这是因为在StringBuffer类中没有定义哈市Code方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。考虑到因为创建StringBuffer时需要分配内存空间,造成 sb 和 tb hashCode不同。
原文:https://www.cnblogs.com/njuptzheng/p/11681592.html