String和StringBuffer的区别

Posted njuptzheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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不同。

以上是关于String和StringBuffer的区别的主要内容,如果未能解决你的问题,请参考以下文章

String,StringBuilder,StringBuffer的区别

Java中的String,StringBuilder,StringBuffer三者的区别

Java中的String,StringBuilder,StringBuffer三者的区别

转载String和StringBuffer的区别,以及StringBuffer的常用方法介绍

Java——StringBuffer/StringBuilder以及和string区别

StringBuffer/StringBuilder/String的区别