String和StringBuffer的区别

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不同。

posted @ 2019-10-15 22:29  梧桐更兼细雨_到黄昏  Views(413)  Comments(0Edit  收藏  举报