一个是StringBuffer对象,一个是String对象("abc")
但那个String对象(即:"abc"比较特殊,它是在编译期确定的,所以会放到常量池中,如果在你的程序的其他地方以“显示的方式”出现"abc"的话,那这个"abc",将是同一个"abc")
例如:
StringBuffer A = new StringBuffer("abc");
String str = "abc";
String str2 = "abc";
这3个"abc"其实在编译后的class文件中,指向的是同一内存空间。
下面我来介绍一下StringBuffer类
StringBuffer是一个用于存放动态存放字符串数据的类,他继承自java.lang.AbstractStringBuilder这个类。
所谓动态存放是指:你无需考虑StringBuffer大小的问题。
当你利用StringBuffer的append方法向其自身添加字符串的时候,如果此时StringBuffer默认提供的空间大小不够用,
那么它会自动扩展自身的存储空间,以保证数据能够正常的放入到StringBuffer其中。
我们也可以手动的设置StringBuffer的空间大小
例如:
StringBuffer buf = new StringBuffer(10);
上面的意思是指:将StringBuffer的内部容量设置为10个字符(char)大小的长度。
StringBuffer默认的存储空间大小是16个字符,也就是说 new StringBuffer() 就等于 new StringBuffer(16)。
StringBuffer的底层是利用它的父类(AbstractStringBuilder)内部的一个默认长度为16的字符数组来存放数据的。(即:char value[];)
每当你利用 StringBuffer的append方法向其中添加一个字符串的时候StringBuffer都会调用其父类(AbstractStringBuilder)的append方法,
然后AbstractStringBuilder会判断其内部用于存放数据的那个char[]数组是否已经满了,
(1)如果没有满,就会将你传入的字符串转化为
字符并存入到那个字符数组中(即: str.getChars(0, len, value, count);)。
(2)而如果那个char[]数组已经满了,那么AbstractStringBuilder会创建一个大小为当前数组两倍的新的char[]数组。
然后利用System.arraycopy(value, 0, newValue, 0, count);将原始数据拷贝到这个新的数组中即可。
|