返回列表 发帖

[基本语法] String类创建的字符对象不可修改 如何理解?

呵呵,我总是问一些比较笨的问题...

String类创建的字符对象是不可修改的,这是我在书上看到的一句话(教科书)。
在使用String类的concat方法时,我有点不明白,如下小程序:

  1. public class TestString
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         String str1 = new String("mutou");
  6.         String str2 = new String("test");
  7.         str1 = str1.concat(str2);
  8.         System.out.println(str1);
  9.     }
  10. }
复制代码


输出: mutoutest

请问str1这个对象是否被修改?
还是说str1已经指向了一个新的对象?

提问赏金:10金币
获奖名单 : annie(10金币)    

是另外建立了一个对象,然后赋给str1,你用下边的程序测试就可以看出来:
public static void main(String[] args)
            {
                    String str1 = new String("mutou");
                    String str2 = new String("test");
                    String str3 = str1;
                    str1 = str1.concat(str2);
                    System.out.println(str3==str1);
            }
然后再把String改为StringBuffer对比:
public static void main(String[] args)
            {
                    StringBuffer str1 = new StringBuffer("mutou");
                    StringBuffer str2 = new StringBuffer("test");
                    StringBuffer str3 = str1;
                    str1= str1.append(str2);
                    System.out.println(str3==str1);
            }
结果是一个FALSE,一个TRUE. 也就是说一个是不可修改,一个是可修改的

[ 本帖最后由 annie 于 2009-6-19 22:32 编辑 ]
1

评分人数

  • heyitang

TOP

原帖由 annie 于 2009-6-19 22:08 发表
是另外建立了一个对象,然后赋给str1,你用下边的程序测试就可以看出来:
public static void main(String[] args)
            {
                    String str1 = new String("mutou");
                    String s ...



嗯,明白了。
谢谢你~~

TOP

String代表字符内容不可变的字符串,
StringBuffer、StringBuilder代表字符内容可变的字符串,其中StringBuilder是线程不安全的,而StringBuffer是线程安全的。
好像是这样,呵呵。
1

评分人数

TOP

在String中有个串池,串池中的数据时不可重复的,因为String这个类被声明为final,
串池中存放的有mutou  ,   test    ,mutoutest    3个字符串
1

评分人数

  • heyitang

TOP

你创建的这new String("mutou")对象确实没有被修改!!
但是 str1 = str1.concat(str2);这句话执行后str1重新引用了“ mutoutest”对象!!
原来的那个"mutou"对象没有变化,如果没有其它变量引用这个对象的话,这个对象会被垃圾回收器回收,从而释放内存空间!!
1

评分人数

TOP

原帖由 paris 于 2009-7-27 22:24 发表
在String中有个串池,串池中的数据时不可重复的,因为String这个类被声明为final,
串池中存放的有mutou  ,   test    ,mutoutest    3个字符串

String池中并没有mutoutest

TOP

原帖由 lijia245235993 于 2009-8-6 11:13 发表
你创建的这new String("mutou")对象确实没有被修改!!
但是 str1 = str1.concat(str2);这句话执行后str1重新引用了“ mutoutest”对象!!
原来的那个"mutou"对象没有变化,如果没有其它变量引用这个对象的话,这个对象会被垃圾 ...

字符串字面量是在内存的Perm区的,垃圾回收不长去关注的,所以很少出现“如果没有其它变量引用这个对象的话,这个对象会被垃圾……”这样的情况。
1

评分人数

TOP

TOP

sars说的详细
串池里皆对象
mutoutest串池里没有,创建了一个新对象。
即可说明String不可修改

TOP

返回列表