码迷,mamicode.com
首页 > 其他好文 > 详细

String和StringBuffer的区别

时间:2019-10-15 22:44:32      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:构造   默认   end   字符   new   print   ringbuf   不能   不同   

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的区别

标签:构造   默认   end   字符   new   print   ringbuf   不能   不同   

原文地址:https://www.cnblogs.com/njuptzheng/p/11681592.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!