黑马程序员技术交流社区

标题: 一个关于String小问题,但是困扰俺好久,,, [打印本页]

作者: 书生灬流年    时间: 2015-1-13 20:24
标题: 一个关于String小问题,但是困扰俺好久,,,
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
""s2指向的内容中有两个对象abc、new 。""
虽然在调试中使用“==”equals试验过
可是s2为什么会是指向两个对象呢?
new 完不是用"abc"赋值了吗?那么s2不就应该是指向字符串"abc"了吗?
新人求解!:(



作者: Piaoyu    时间: 2015-1-13 20:45
new String()创建一个对象         同样传入的“abc”也是一个对象
作者: 书生灬流年    时间: 2015-1-13 20:49
不是说String一旦被初始化变不可更改,放在方法区中的常量池中吗。new的对象不是放在堆里面吗?既然"abc"是一个对象了,这样不是冲突了吗?
作者: 诺诺    时间: 2015-1-13 23:24
书生灬流年 发表于 2015-1-13 20:49
不是说String一旦被初始化变不可更改,放在方法区中的常量池中吗。new的对象不是放在堆里面吗?既然"abc"是 ...

abc好比自行车,new一下,就好比出来个人 用了已经有的自行车,但是现在是俩了,人和自行车,比较自行车自然都是同一个。
作者: da_chuan    时间: 2015-1-13 23:50
诺诺 发表于 2015-1-13 23:24
abc好比自行车,new一下,就好比出来个人 用了已经有的自行车,但是现在是俩了,人和自行车,比较自行车 ...

那是说abc是同一个,s1,s2是不同的对象吧
作者: 诺诺    时间: 2015-1-13 23:53
da_chuan 发表于 2015-1-13 23:50
那是说abc是同一个,s1,s2是不同的对象吧

、、、、、、、、、、、、、、、是
作者: outsider1020    时间: 2015-1-14 10:16
使用new关键字的话会在堆中重新开辟内存空间,然后将"abc"放入到此空间中,s2此时指向的就是这块新开辟的内存空间。s1指向的是"abc"这个字符串常量所在的内存空间。
作者: 碎流    时间: 2015-1-14 11:08
我是这样理解的:  第一个就是a --- b ...   第二个就是a -----c-------b .
第一个直接直接创建了"abc"对象,放入常量池..而第二个,通过new String()获取到一个String对象,再通过"abc"指向常量池中"abc". 如果是new String();就是一个对象.
也不知道对不对,大家一起思考
作者: MR.J    时间: 2015-1-14 22:35
这应该是jdk1.5的新特性,自动装箱功能。就是String s1="abc";其实与String s1=new String("abc"),是一个意思。只不过创建形式不一样,你题里的s2其实也只是指向一个对象,不是两个对象。new 是创建对象,“abc"是传递的参数,String类型的参数,调用 的是String类中的String(String s);这个构造函数,jdk1.5支持自动装箱,其实也是调用的相同的构造函数,只是表现形式不同,不知对不对,我个人理解。
作者: 希冀    时间: 2015-1-14 22:49
学习了 感觉人和自行车的比喻比较恰当
作者: 郑豪    时间: 2015-1-14 23:10
我是来学习的。。。
作者: 诺诺    时间: 2015-1-15 12:22
碎流 发表于 2015-1-14 11:08
我是这样理解的:  第一个就是a --- b ...   第二个就是a -----c-------b .
第一个直接直接创建了"abc"对象, ...

对头...................
作者: 老外    时间: 2015-1-15 13:01
比喻的太好了!
作者: 没胡子的小眼睛    时间: 2015-1-15 13:07
应该是 s1 和S2 两个存储的空间不易呀
s2是new了一个新的存储地方 并不是赋值给s1
作者: Quasimodo    时间: 2015-1-15 14:30
MR.J 发表于 2015-1-14 22:35
这应该是jdk1.5的新特性,自动装箱功能。就是String s1="abc";其实与String s1=new String("abc"),是一个 ...

String类不是基本数据类型,不存在自动装箱一说
作者: xiaoyi    时间: 2015-1-15 16:07
我也没搞清楚这两个对象是什么意思
作者: MR.J    时间: 2015-1-15 19:00
Quasimodo 发表于 2015-1-15 14:30
String类不是基本数据类型,不存在自动装箱一说

http://www.jb51.net/article/31934.htm
你看看是不是?
作者: 不知道师叔    时间: 2015-1-15 19:15
这里的String是一个容器,但是也需要建立,这算一个,还有就是字符串,正好两个
作者: 小马范    时间: 2015-1-15 19:55
new是一个对象, 在对象内还有一个对象"abc",所以是两个了
作者: Quasimodo    时间: 2015-1-16 12:26
MR.J 发表于 2015-1-15 19:00
http://www.jb51.net/article/31934.htm
你看看是不是?

形式上相似,但本质上不一样吧,比如说Integer n = 3;这里3是基本数据类型,所以要先装箱成为Integer对象才能将引用给n。 其实是编译器帮调用了Integer的valueOf()方法。   
String str = "abc";这里的“abc”本身就是个String对象,能调用String类的所有方法,就不存在装箱一说了呀




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