黑马程序员技术交流社区

标题: 字符串初始化问题 [打印本页]

作者: 我是庄子    时间: 2016-1-27 09:26
标题: 字符串初始化问题
a:  String s1 ="abc";
b:   String s2 = new String("abc");

为什么a中s1指向内存中只有一个对象abc?
而b中s2指向的内容中有两个对象abc,new
作者: 参禅悟道    时间: 2016-1-27 11:15
你看的应该黑马免费视频,毕向东的java基础教程吧,你可以看一下JDK API 里面关于String这个类里面有一个构造方法:String(String original)
下面有截图,你仔细理解一下文字介绍,说的意思应该是:String s2=new String("abc");   "abc"这个对象本身没有变,又重新new 出来一个abc,也就是现在有两个abc,也就是JDK API里面所说的副本。我觉得应该是这样理解的

QQ截图20160127110712.png (173.72 KB, 下载次数: 7)

QQ截图20160127110712.png

QQ截图20160127110358.png (160.3 KB, 下载次数: 8)

QQ截图20160127110358.png

作者: 我爱睡觉    时间: 2016-1-27 15:43
楼上正解,再补充
如果要解释的话

需要 解释 JAVA 中
                        常量池
                          栈
                          堆
作者: 刺客015    时间: 2016-1-27 22:06
因为b中new一个新的对象abc
作者: dele    时间: 2016-1-27 22:39
"abc"是一个常量字符串对象,是存储在字符串常量池中的,且只有一个。
String s = "abc"中s是String类型的引用,指向在常量池中的字符串常量"abc",所以只有一个对象。

String s = new String("abc");首先通过new在堆中创建了一个String对象,并用s指向它。而"abc"则因是字符常量放在常量池中。所以有两个对象。另外这个构造函数的源码如下:
String是对一个字符串数组的封装,扩展其功能。String s = new String()实际上就是将"abc"中的内容copy给s所指向的字符串对象。

新建位图图像.jpg (146.62 KB, 下载次数: 9)

新建位图图像.jpg





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