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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 依然超级赛亚人 高级黑马   /  2014-7-12 19:15  /  1698 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问各位:

String s = new String("hello");和
String s = "hello";的区别在哪里?不是很清楚,好像说前者创建了两个对象而后者创建了一个对象,但只是记住结论而已,忘了所以然。还有,
String s1 = "hello";
String s2 = "hello";
用"=="比较s1和s2的结果请各位给解释一下原因。

14 个回复

倒序浏览
今天刚写了一个帖子,说的就是这个问题,你看看吧,这里不多解释
http://bbs.itheima.com/thread-129040-1-1.html
回复 使用道具 举报
"hello"是一个字符串对象,String str = "hello"是把对象“hello”的引用赋值给了str
new String("hello")是新创建一个对象记为A,并将“hello”的引用赋值给了A
所以String str = new String("hello")是将A的引用赋值给了str;
回复 使用道具 举报
二楼说的对啊,至于第二个是因为当s1="hello"时,常量池中就有了字符串“hello”,当s2=“hello”,因为系统中已经有了''hello“这时不会在创建新的对象了,而是让s2指向了”hello“,就是说两个引用指向同一个对象,其实就相当于是
String s1="hello";
String s2=s1;
System.out.println(s1==s2);
回复 使用道具 举报
"==" 是比较两个地址是否相同,
回复 使用道具 举报
字符串常量是字面量存储在常量池中,new出的对象存储在堆区。至于网上说的前者创建了两个对象,我看了很久JVM的书也没看到有说道这种情况。
回复 使用道具 举报
赵顺超 来自手机 中级黑马 2014-7-12 21:57:36
7#
001可望成功 发表于 2014-7-12 19:26
今天刚写了一个帖子,说的就是这个问题,你看看吧,这里不多解释
http://bbs.itheima.com/thread-129040-1- ...

我想问下,String s = new String("abc"),这里abc是存放在常量池,然后在堆内存中new对象指向常量池中的abc?还是abc就在堆内存中,s指向堆内存中new的对象。
回复 使用道具 举报
赵顺超 来自手机 中级黑马 2014-7-12 22:02:51
8#
郭可 发表于 2014-7-12 21:43
字符串常量是字面量存储在常量池中,new出的对象存储在堆区。至于网上说的前者创建了两个对象,我看了很久J ...

说的是,常量池中没有abc字符串,这时候如果new String ("abc")的话,内存中会出现两个对象,一个在堆内存中,一个在常量池中
回复 使用道具 举报
郭可 中级黑马 2014-7-13 01:02:24
9#
赵顺超 发表于 2014-7-12 22:02
说的是,常量池中没有abc字符串,这时候如果new String ("abc")的话,内存中会出现两个对象,一个在堆 ...

JVM规范中说明 所有的数组和对象都在堆中。处于空间考虑也不应该一个对象存两份吧。我觉得内常量池中存的不是对象,只是字面量而已
回复 使用道具 举报
郭可 发表于 2014-7-13 01:02
JVM规范中说明 所有的数组和对象都在堆中。处于空间考虑也不应该一个对象存两份吧。我觉得内常量池中存的 ...

不是对象啊,它存入的是字符串常量,所以才是常量池嘛
回复 使用道具 举报
doubandddk 发表于 2014-7-12 20:06
"hello"是一个字符串对象,String str = "hello"是把对象“hello”的引用赋值给了str
new String("hello") ...

恩,您说的这些我大概听懂了,但是为什是创建了两个对象的问题还是不太清楚。
回复 使用道具 举报
燿陚√揚葳 发表于 2014-7-12 21:30
二楼说的对啊,至于第二个是因为当s1="hello"时,常量池中就有了字符串“hello”,当s2=“hello”,因为系 ...

如醍醐灌顶般透彻:handshake
回复 使用道具 举报
ss5619498 发表于 2014-7-12 21:36
"==" 是比较两个地址是否相同,

恩,弄明白了。对于基本类型来说,它比较的是值(或者说是内容)是否相等;对于引用类型来说它比较的是地址值是否相同。
回复 使用道具 举报
郭可 发表于 2014-7-12 21:43
字符串常量是字面量存储在常量池中,new出的对象存储在堆区。至于网上说的前者创建了两个对象,我看了很久J ...

恩。实在不行再请教一下老师去!
回复 使用道具 举报
燿陚√揚葳 发表于 2014-7-12 21:30
二楼说的对啊,至于第二个是因为当s1="hello"时,常量池中就有了字符串“hello”,当s2=“hello”,因为系 ...

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