String和StringBuffer

要谈它们的区别,首先先说说它们之间的相同的地方,首先他们都是存储字符的集合,他们的最大长度是2G,他们在存储字符串数据结构都采用了字符数组,也就 是说他们内部都定义了一个字符型数组,用于存储字符串的值。
它们的不同点有以下几点:
1)  字符型数组固定长度和可变长度的区别:  
String型内部定义的数组是固定长度的,一旦使用者给字符串数组对象赋值后,它内部的字符型数组的长度就固定了;
StringBuff型数组内部数组也是固定长度的,但是在运行状态下,它能够自己动态的扩充字符型数组的容量。
2)  效率的区别:
String型数组在所有自身操作,都会比StringBuff效率高。但是如果做多字符串合并的操作时,StringBuff会比String效率高很 多。
其原因就是Stirng每次都是重新创建新的String对象然后进行全字符串拷贝。而StringBuff在没有达到他的容量极限时,它之后进行部分字 符串拷贝工作。
例如:String str1=”1234”;
Str1=str1+”5678”;
它要作的工作是,首先重新创建一个str1对象,它的长度是8,然后把”1234”拷贝到新的str1中,然后再把”5678”拷贝到新的str1中,这 种对于大字符串操作时效率是非常的底,同时还会出现内存溢出的情况,应为原来的str1垃圾回收器可能没有及时的回收进行内存释放。
例如:StringBuff buff1
Buff1.append(“11111”);
它的操作是,首先判断内部字符型数组对象value的容量是否能装载要合并的字符串,如果能直接将新的字符串“11111”,直接拷贝过来,如果不能也 要创建一个新的字符型数组对象,这个字符型数组对象是原来字符型数组对象value长度的两倍,然后把value内容拷贝过来,然后把新的字符串拷贝过 来,最后把这个扩容的字符型数组对象赋值给value。
在大容量字符串数组操作时,这个要比String效率高很多。
3)线程安全的。在多线程环境下,对StringBuff对象的操作都是线程安全的,也就是说每一时刻只有一个线程能够处理StringBuff对象。

posted on 2010-08-17 09:17  基斯盐  阅读(595)  评论(0编辑  收藏  举报

导航