请问String和String Buffer的区别
好像是String定义后就不能改变,而String Buffer可以
但指的是值改变还是什么改变?
如我定义String a ="hello",貌似可以改变为a="word"的!小弟新手,希望各位大哥赐教,谢谢!
好像是String定义后就不能改变,而String Buffer可以
但指的是值改变还是什么改变?
如我定义String a ="hello",貌似可以改变为a="word"的!小弟新手,希望各位大哥赐教,谢谢!
和这个问题一样
public class Test {
public static void stringReplace (String text) {
text = text.replace('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.append("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
答案是 javajavaC这是因为第七行text = text.append ("C"),append方法会改变text中的值,而text与textBuffer指向的地址是相同的。因此会打印javaC再举个例子:String a = "a"; //假设a指向地址0x0001a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。因此String的操作都是改变赋值地址而不是改变值操作
不管你对String做什么强制修改,
他都会重新申请内存空间来存放这个修改过的String。
LZ说的String a ="hello"改变为a="word"
这样的话,a已经不在原来的地址了。。
原来存放hello的内存将会被垃圾回收。。
String s="<a>";
s+="<b>a</b>";
s+="<c>b</d>";
s+="<d>c</d>";
s+="</a>";
当这种操作多的时候,用String很慢的
用StringBuffer效率能提高好多 。
理解错误,String不可变是因为
1 类自身是final的
2 类里面的内容也是final的。比如最重要的保存字符串的部分
private final char value[];
而StringBuilder呢?
public StringBuilder() {
super(16);
}
在 AbstractStringBuilder 里面是
char value[];
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
可见,这个char是可以变化的。通过一个 expandCapacity的方法进行扩充容量。
这就是区别
StringBuffer为可变,每次改变对象内容不会产生新的对象,不浪费内存
private final char value[];
里边的字符数组一旦指定,是不能改变的,并不是说String对象的地址引用不能改变,
当String a="hello";
中的a又指定了一个a="world";这个时候又创建了新的String对象,而不是你原先的
String的字符数组value改变了,ok!
这样的话,a已经不在原来的地址了。。
原来存放hello的内存将会被垃圾回收。。String不可变,每次赋值都会产生新的对象,浪费内存 前者说存放hello的内存将会被垃圾回收 了 , 那就不存在占用内存的情况了 . 怎么10楼说 每次赋值都会产生新的对象,浪费内存 了呢?
打个比方:
String a="String"会为a分配一个内存区域存放字符串"String"
而a=a+“String2”这时候不是在原有的那个内存区域上改变,而是会产生一块新的内存区域,赋值给a。这才是改变的本质。而StringBuffer是可以改变的,进行append操作的时候是在原有内存上做扩展修改的。所以要做大量字符串修改的时候建议使用Stringbuffer,那样能提升效率
不知道我的回答是否正确
a = "world";
不可变是指第二条语句执行之后,是把a重新指向了另一个对象"world",而原来的对象"hello"(不可更改的)成为垃圾,也即是
a指向的存储空间变了,而不是a第一次指向的存储空间里的对象变了,因为第一次指向的对象不可变。 但是StringBuffer a = "hello";
StringBuffer a = "world";
则是指把a第一次指向的空间里的存储内容"hello"更改为"world",那么始终只有一个对象存在内存中
时,"hello"这个对象就会马上就被回收,java垃圾回收机制有许多算法,可以参见:
http://blog.csdn.net/great1681/archive/2009/04/05/4049618.aspx
String只要变化就重新申请内存空间,原来的等待被回收
StringBuffer为缓冲区域,修改的话就是对缓冲区大小、内容进行更改
如果string经常被修改、变化,用StringBuffer会更节约内存空间,速度更快
反之,固定不变的string用String
StringBuffer 是在内存中建立一个缓冲区这就导致了5楼所说的效率问题下面有一段代码能说明效率问题:
public class AppendStringTest{
public static void main(String [] args){
String text = " "; long beginTime = System.currentTimeMillis();
for(int i=0;i<100000;i++)
text = text+i;
long endTime =System.currentTimeMillis();
System.out.println("String方法的执行时间:"+(endTime-beginTime));
StringBuffer text2 = new StringBuffer(" ");
beginTime = System.currentTimeMillis();
for(int i=0;i<100000;i++)
text2.append(String.valueOf(i));
endTime =System.currentTimeMillis();
System.out.println("StringBuffer方法的执行时间:"+(endTime-beginTime));
}
}
不过,现在的计算机的运行速度越来越快了,不知道运行的结果是不是很能说明问题!
up