黑马程序员技术交流社区
标题:
.
[打印本页]
作者:
冯祖焱
时间:
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()方法追加左值,再追加右值。
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String ab
2: astore_1
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6 // String cd
16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
26: aload_1
27: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
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