String,StringBuffer,StringBuilder的区别

来源:互联网 发布:淘宝的鞋子是正品吗 编辑:程序博客网 时间:2024/06/05 15:59

首先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());//488676694buffer.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);//结果13StringBuilder 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 3
原创粉丝点击