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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
""s2指向的内容中有两个对象abc、new 。""
虽然在调试中使用“==”equals试验过
可是s2为什么会是指向两个对象呢?
new 完不是用"abc"赋值了吗?那么s2不就应该是指向字符串"abc"了吗?
新人求解!:(


19 个回复

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

abc好比自行车,new一下,就好比出来个人 用了已经有的自行车,但是现在是俩了,人和自行车,比较自行车自然都是同一个。

评分

参与人数 1技术分 +2 收起 理由
lwj123 + 2 说的比较通俗易懂

查看全部评分

回复 举报
诺诺 发表于 2015-1-13 23:24
abc好比自行车,new一下,就好比出来个人 用了已经有的自行车,但是现在是俩了,人和自行车,比较自行车 ...

那是说abc是同一个,s1,s2是不同的对象吧
回复 举报
da_chuan 发表于 2015-1-13 23:50
那是说abc是同一个,s1,s2是不同的对象吧

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

对头...................
回复 举报
比喻的太好了!
回复 举报
应该是 s1 和S2 两个存储的空间不易呀
s2是new了一个新的存储地方 并不是赋值给s1
回复 举报
MR.J 发表于 2015-1-14 22:35
这应该是jdk1.5的新特性,自动装箱功能。就是String s1="abc";其实与String s1=new String("abc"),是一个 ...

String类不是基本数据类型,不存在自动装箱一说
回复 举报
我也没搞清楚这两个对象是什么意思
回复 举报
MR.J 中级黑马 2015-1-15 19:00:08
17#
Quasimodo 发表于 2015-1-15 14:30
String类不是基本数据类型,不存在自动装箱一说

http://www.jb51.net/article/31934.htm
你看看是不是?

评分

参与人数 1黑马币 +5 收起 理由
Quasimodo + 5

查看全部评分

回复 举报
这里的String是一个容器,但是也需要建立,这算一个,还有就是字符串,正好两个
回复 举报
new是一个对象, 在对象内还有一个对象"abc",所以是两个了
回复 举报
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类的所有方法,就不存在装箱一说了呀
回复 举报
您需要登录后才可以回帖 登录 | 加入黑马