A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

.

© 冯祖焱 黑马帝   /  2011-12-30 10:46  /  2718 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冯祖焱 于 2017-8-16 09:40 编辑

                                                                                                     .

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

6 个回复

倒序浏览
对象ab没有变,只是将str的指向变了,将str的指向从ab断开,指向新的对象abcd

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
str只是一个引用,它先指向“ab”,后有指向了“abcd”。
回复 使用道具 举报
01   String str="ab";
02   str+="cd"; //这里难道不是修改了str变量的内容吗?
03   System.out.println(str);//输出:abcd

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

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
上面的回答都很不错。

以下是用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
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
付星 黑马帝 2011-12-30 17:34:49
地板
字符串里有个字字符常量池这个存储地方
String str="ab";
str+="cd"; //这句话其实在内存又创建了一个"abcd"对象,再返回给str引用,地址是变的了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
罗全涛 黑马帝 2011-12-30 17:46:39
7#
回答这个问题首先必须要明白对象和引用变量的区别。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

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马