string和stringbuffer的区别_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
6
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2074 | 回复: 5   主题: string和stringbuffer的区别        下一篇 
westRing
注册用户
等级:少校
经验:1198
发帖:22
精华:0
注册:2015-4-9
状态:离线
发送短消息息给westRing 加好友    发送短消息息给westRing 发消息
发表于: IP:您无权察看 2015-8-25 7:48:32 | [全部帖] [楼主帖] 楼主

我希望用您的理解给我解释,谢谢大家,最好有实例




赞(0)    操作        顶端 
zhongwei.wang
注册用户
等级:中校
经验:1859
发帖:60
精华:1
注册:2013-12-23
状态:离线
发送短消息息给zhongwei.wang 加好友    发送短消息息给zhongwei.wang 发消息
发表于: IP:您无权察看 2015-8-25 9:37:11 | [全部帖] [楼主帖] 2  楼

楼主真早哇



赞(0)    操作        顶端 
i1314lovejoy
注册用户
等级:少校
经验:1234
发帖:69
精华:0
注册:2015-7-14
状态:离线
发送短消息息给i1314lovejoy 加好友    发送短消息息给i1314lovejoy 发消息
发表于: IP:您无权察看 2015-8-25 9:50:11 | [全部帖] [楼主帖] 3  楼

在Java中,String是不可变类型,所以对于字符串的操作提供了两个辅助类:StringBuffer和StringBuilder。这个两个类的主要区别在于:

  • StringBuilder的效率更高
  • StringBuffer是线程安全的,而StringBuilder不是

不过,需要注意的是,在利用+

对String对象直接进行拼接的时候,Java内部其实还是用StringBuilder来实现的,但是和显式地调用StringBuilder略有区别。考虑如下代码:

String[] strings = new String[]{"one", "two", "three", "four", "five"};
String resultStr = "";
StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < strings.length; i++) {
      resultStr += strings[i];
}
for (int i = 0; i < strings.length; i++) {
      resultBuilder.append(strings[i]);
}


在利用+

直接进行拼接时,每次循环都会生成一个新的StringBuilder对象,也就是说等同:

StringBuilder stringBuilder = new StringBuilder(resultStr);
stringBuilder.append(strings[i]);
resultStr = stringBuilder.toString();


这样运行的效率明显是低于显式调用StringBuilder的。

但是在有一种情况下,利用+

拼接的速度会远远快于用StringBuilder或者StringBuffer,考虑如下代码:

String str = "one" + "two" + "three";
StringBuilder strBuilder = new StringBuilder().append("one").append("two").append("three");


在这种情况下,JVM会直接把String str = "one" + "two" + "three";

理解为

String str = "onetwothree”;

,也就说不需要像通常情况下生成StringBuilder对象然后再拼接,速度自然快很多。不过需要强调的一点是,当然字符串来自其他对象的时候,JVM不会做这种特殊处理,也就说如下代码:

String one = "one";
String two = "two";
String three = "three";
String str = one + two + three;


效率仍然是非常低的。

--------------事实是这样---------------
String str = "one" + "two" + "three";



String one = "one";
String two = "two";
String three = "three";
String str = one + two + three;


的区别应该是,上面的代码在编译期进行了优化,直接将onetwothree字面量赋值给str。而下面的代码编译器没做优化。



赞(0)    操作        顶端 
hui.chen
注册用户
等级:大校
经验:6070
发帖:48
精华:4
注册:2014-2-7
状态:离线
发送短消息息给hui.chen 加好友    发送短消息息给hui.chen 发消息
发表于: IP:您无权察看 2015-8-25 9:52:42 | [全部帖] [楼主帖] 4  楼

1.三者在执行速度方面的比较:StringBuilder   >  String
2.String <(StringBuffer)的原因
String:字符串常量
StringBuffer:字符创变量
StringBuilder:字符创变量
从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码:

String s = "abcd";
s = s+1;
System.out.print(s);// result : abcd1


我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗
JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
3.一个特殊的例子:

1 String str = “This is only a” + “ simple” + “ test”;
3 StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);


你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:

String str = “This is only a” + “ simple” + “test”;


其实就是:

String str = “This is only a simple test”;


所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:

String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;


这时候JVM会规规矩矩的按照原来的方式去做。
希望能帮到你


u=2871144702,1362725177&fm=21&gp=0.jpg.gif


赞(0)    操作        顶端 
i1314lovejoy
注册用户
等级:少校
经验:1234
发帖:69
精华:0
注册:2015-7-14
状态:离线
发送短消息息给i1314lovejoy 加好友    发送短消息息给i1314lovejoy 发消息
发表于: IP:您无权察看 2015-8-25 10:09:04 | [全部帖] [楼主帖] 5  楼

http://segmentfault.com/a/1190000002683782这里面算是介绍的比较详细了,而且实例也多!!!



赞(0)    操作        顶端 
dream007
注册用户
等级:少校
经验:1086
发帖:53
精华:0
注册:2015-7-2
状态:离线
发送短消息息给dream007 加好友    发送短消息息给dream007 发消息
发表于: IP:您无权察看 2015-8-25 11:07:51 | [全部帖] [楼主帖] 6  楼

我希望用您的理解给我解释,谢谢大家,最好有实例
两句话解释就是:

一个加任何字符,一个限制字符的加入


赞(0)    操作        顶端 
总帖数
6
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论