黑马程序员技术交流社区

标题: 类String的创建对象问题 [打印本页]

作者: 依然超级赛亚人    时间: 2014-7-12 19:15
标题: 类String的创建对象问题
请问各位:

String s = new String("hello");和
String s = "hello";的区别在哪里?不是很清楚,好像说前者创建了两个对象而后者创建了一个对象,但只是记住结论而已,忘了所以然。还有,
String s1 = "hello";
String s2 = "hello";
用"=="比较s1和s2的结果请各位给解释一下原因。
作者: 001可望成功    时间: 2014-7-12 19:26
今天刚写了一个帖子,说的就是这个问题,你看看吧,这里不多解释
http://bbs.itheima.com/thread-129040-1-1.html
作者: doubandddk    时间: 2014-7-12 20:06
"hello"是一个字符串对象,String str = "hello"是把对象“hello”的引用赋值给了str
new String("hello")是新创建一个对象记为A,并将“hello”的引用赋值给了A
所以String str = new String("hello")是将A的引用赋值给了str;
作者: 燿陚√揚葳    时间: 2014-7-12 21:30
二楼说的对啊,至于第二个是因为当s1="hello"时,常量池中就有了字符串“hello”,当s2=“hello”,因为系统中已经有了''hello“这时不会在创建新的对象了,而是让s2指向了”hello“,就是说两个引用指向同一个对象,其实就相当于是
String s1="hello";
String s2=s1;
System.out.println(s1==s2);

作者: ss5619498    时间: 2014-7-12 21:36
"==" 是比较两个地址是否相同,
作者: 郭可    时间: 2014-7-12 21:43
字符串常量是字面量存储在常量池中,new出的对象存储在堆区。至于网上说的前者创建了两个对象,我看了很久JVM的书也没看到有说道这种情况。
作者: 赵顺超    时间: 2014-7-12 21:57
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
郭可 发表于 2014-7-12 21:43
字符串常量是字面量存储在常量池中,new出的对象存储在堆区。至于网上说的前者创建了两个对象,我看了很久J ...

说的是,常量池中没有abc字符串,这时候如果new String ("abc")的话,内存中会出现两个对象,一个在堆内存中,一个在常量池中
作者: 郭可    时间: 2014-7-13 01:02
赵顺超 发表于 2014-7-12 22:02
说的是,常量池中没有abc字符串,这时候如果new String ("abc")的话,内存中会出现两个对象,一个在堆 ...

JVM规范中说明 所有的数组和对象都在堆中。处于空间考虑也不应该一个对象存两份吧。我觉得内常量池中存的不是对象,只是字面量而已
作者: 001可望成功    时间: 2014-7-13 09:17
郭可 发表于 2014-7-13 01:02
JVM规范中说明 所有的数组和对象都在堆中。处于空间考虑也不应该一个对象存两份吧。我觉得内常量池中存的 ...

不是对象啊,它存入的是字符串常量,所以才是常量池嘛
作者: 依然超级赛亚人    时间: 2014-7-14 23:04
doubandddk 发表于 2014-7-12 20:06
"hello"是一个字符串对象,String str = "hello"是把对象“hello”的引用赋值给了str
new String("hello") ...

恩,您说的这些我大概听懂了,但是为什是创建了两个对象的问题还是不太清楚。
作者: 依然超级赛亚人    时间: 2014-7-14 23:05
燿陚√揚葳 发表于 2014-7-12 21:30
二楼说的对啊,至于第二个是因为当s1="hello"时,常量池中就有了字符串“hello”,当s2=“hello”,因为系 ...

如醍醐灌顶般透彻:handshake
作者: 依然超级赛亚人    时间: 2014-7-14 23:08
ss5619498 发表于 2014-7-12 21:36
"==" 是比较两个地址是否相同,

恩,弄明白了。对于基本类型来说,它比较的是值(或者说是内容)是否相等;对于引用类型来说它比较的是地址值是否相同。
作者: 依然超级赛亚人    时间: 2014-7-14 23:09
郭可 发表于 2014-7-12 21:43
字符串常量是字面量存储在常量池中,new出的对象存储在堆区。至于网上说的前者创建了两个对象,我看了很久J ...

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

学习了   




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