问答详情
源自:2-5 认识 Java 中的 StringBuilder 类

StringBuilder是在原有的地址里去改变原来的字符串吗?

解析里面说StringBuilder 不会额外创建一个对象,比如我先StringBuilder  str1 = new StringBuilder ("JAVA");   再StringBuilder  str2  =new StringBuilder(str1 + 'A');

那么按照解析里说的,不会额外产生临时的变量,那是直接在str1的地址上修改成了JAVAA?  我在eclipse里实验了一下,两个字符串的地址也不一样,也就是说,还是新开辟了一个地址,新产生了一个变量呀。有什么区别

提问者:CyberLiu 2015-09-17 13:44

个回答

  • _潇潇暮雨
    2015-09-17 19:20:56
    已采纳

    凡是new出来的都是对象。你new了2次,当然会产生新的对象(开辟新的地址)。我们说字符串具有不变性,指的是字符串一旦声明不可改变(存储在字符串常量池中)。例如:

    String str1 = 'abc';
    str1 += '123';

    实际上以上的代码会在常量池中产生2个字符串:abc和abc123,其中前者因为没有任何指向会在适当的时候被gc回收;而StringBuilder将字符串存放在缓冲区(提到缓冲区我们很自然可以想到可以提高效率)。整个的字符串操作都是在缓冲区中进行,最后调用toString()方法返回字符串(期间并没有产生临时字符串)