String,StringBuffer,StringBuilder的区别

首先String,StringBuffrt,StringBuilder都是用于操作字符串。


我们先说说String:String一种不可变类,即在给String类型的变量重新赋值的时候String的地址也会发生改变,所以会产生新的对象,而String变量的值如果相同,那么地址就是一样,也就是说他们指向都是一样的,所以重新赋值是生成一个新的对象然后指向新的对象。原来的指向的对象将会被当作来及被GC回收掉。

String str = "abc";
String str1 = "abc";
System.out.println(str == str1);//结果true  比较地址
str = "abcd";
System.out.println(str == str1);//结果false
这种别每次改变Stirng都要生成新的对象,然后在指向新的对象,效率非常低,操作少量字符串的时候可以使用。



再说StringBuffer:StringBuffer是一种可变类,任何改变它都不会生成新的对象,StringBuffer是支持并发操作,线程是安全的。

StringBuffer buffer = new StringBuffer(512);//512缓存字节
buffer.append("aaa");
System.out.println(buffer.hashCode());//488676694
buffer.append("bbb");
System.out.println(buffer.hashCode());//488676694
//比较两次值其实是相同的
两次比较相同,说明了StringBuffer是一种不可变类,没有分配新的地址,没有新的对象,适用于多线程。


然后说StringBuilder:StringBuilder通StringBuffer一样都是不可变类,任何改变都不会生成新的对象,但是StringBuilder是多线程不安全的,单线程StringBuilder比StringBuffer要快一些。

long startTime;
long endTime;
StringBuffer buffer = new StringBuffer(512);
startTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++){
	buffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println(endTime -startTime);//结果13
StringBuilder builder = new StringBuilder(512);
startTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++){
	builder.append(i);
}
endTime = System.currentTimeMillis();
System.out.println(endTime -startTime);//结果3

相比较而言StringBuilder确实比StringBuffer快,String就不比较了,肯定比其他两种更慢



总而言之,对字符串少量操作的时候使用Stiring比较方便,多线程使用StringBuffer,对字符有大量操作的时候但又不在多线程中时候可以使用StringBuilder,不然使用StringBuffer


  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值