黑马程序员技术交流社区

标题: . [打印本页]

作者: 冯祖焱    时间: 2011-12-30 10:46
标题: .
本帖最后由 冯祖焱 于 2017-8-16 09:40 编辑

                                                                                                     .
作者: yunqiangshan    时间: 2011-12-30 10:51
对象ab没有变,只是将str的指向变了,将str的指向从ab断开,指向新的对象abcd
作者: 刘基军    时间: 2011-12-30 10:58
str只是一个引用,它先指向“ab”,后有指向了“abcd”。
作者: 张绍成    时间: 2011-12-30 11:06
01   String str="ab";
02   str+="cd"; //这里难道不是修改了str变量的内容吗?
03   System.out.println(str);//输出:abcd

String  字符串中的内容是不可以改变的。
其实在第二行的时候,你并没有修改 str 中原来的内容,只是新建了一个字符串,这个字符串的内容就是 "abcd" .而在此时 str 从原来的指向转向新的字符串的指向(地址),表面上看起来结果是一样的,可是后面发生了很多,
这样改变字符串的值比较费资源,建议使用 StringBuffer  或者 StringBuilder .
作者: 冯祖焱    时间: 2011-12-30 11:23
上面的回答都很不错。

以下是用javap反编译出来的代码,可以看到“+=”实际导致调用的是 StringBuilder 的相关方法。
"+="的具体执行是这样的:
先创建一个空的StringBuilder,接着调用StringBuilder.append()方法追加左值,再追加右值。

  1.   public static void main(java.lang.String[]);
  2.     Code:
  3.        0: ldc           #2                  // String ab
  4.        2: astore_1
  5.        3: new           #3                  // class java/lang/StringBuilder
  6.        6: dup
  7.        7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
  8.       10: aload_1
  9.       11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  10.       14: ldc           #6                  // String cd
  11.       16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  12.       19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  13.       22: astore_1
  14.       23: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;
  15.       26: aload_1
  16.       27: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  17.       30: return
复制代码

作者: 付星    时间: 2011-12-30 17:34
字符串里有个字字符常量池这个存储地方
String str="ab";
str+="cd"; //这句话其实在内存又创建了一个"abcd"对象,再返回给str引用,地址是变的了
作者: 罗全涛    时间: 2011-12-30 17:46
回答这个问题首先必须要明白对象和引用变量的区别。String创建字符串对像不可改变,但String定义的引用可以改变的。引用仅仅存放的是对象的地址。下面就每句代码进行解释:
1:String str="ab";先在常量池中寻找“ab”,如果找到就将它的地址赋给str,如果没找到,会在常量池中创建一个String对象“ab”,并让str指向它。
2:str+="cd";这里将得到一个字符串“abcd”,同样会先去常量池中查找,没有则重新创建一个对象,原来的“ab”对象并没有改变,最后让str指向新创建的“abcd”对象。这里str仅仅是个引用,
3:System.out.println(str);//输出:abcd




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2