黑马程序员技术交流社区

标题: String s = new String("abc");你真的了解吗? [打印本页]

作者: 吉许    时间: 2011-10-25 15:36
标题: String s = new String("abc");你真的了解吗?
String s = new String("abc");创建了几个String Object?

看面试题看到的,看了后才真正了解,觉得不错,拿来和大家分享,大家可以先讨论下发表下意见.
同理推下
String s1 = new String("abc") ;
String s2 = new String("abc") ;
作者: 姚志华    时间: 2011-10-25 15:54
String s = new String("abc");
两个,一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例

String s1 = new String("abc") ;
String s2 = new String("abc") ;
每执行一次只会新创建2个String实例。



作者: 宁超    时间: 2011-10-25 16:08
创建了三个new String对象吧。
String s1 = new String("abc") ;
"abc"本身就是文字池中的一个对象,执行new String()时,
将文字池中(文字池中相同的字符串,只存一份)的对象复制一份放到堆栈中,又把堆栈中的这个对象的引用交给s1了。
然后s1和s2在用==判断就可以知道是不同的。
作者: 高美云    时间: 2011-10-25 18:03
每个String s=new String("abc");都创建了两个对象,其实可以分解为String s=new String(),s="abc";我觉得应该是这样的
作者: 咖啡    时间: 2011-10-25 18:34
两个对象
作者: 李建雄    时间: 2011-10-25 18:47
String s = new String("abc");
在内存中有两个对象
作者: 李建雄    时间: 2011-10-25 18:54
宁超 发表于 2011-10-25 16:08
创建了三个new String对象吧。
String s1 = new String("abc") ;
"abc"本身就是文字池中的一个对象,执行ne ...

这个讲得好像比较有道理,
文字池,是什么?没听说过,它在内存中的哪个地方?是不是在方法区啊
你说的"复制一份放到堆栈中"到底是堆内存中,还是栈内存中?
s1和s2在用==判断,应该是false
作者: 宁超    时间: 2011-10-25 19:21
本帖最后由 宁超 于 2011-10-25 19:25 编辑
李建雄 发表于 2011-10-25 18:54
这个讲得好像比较有道理,
文字池,是什么?没听说过,它在内存中的哪个地方?是不是在方法区啊
你说的"复制一 ...


由于字符串对象的大量使用[它是一个对象,一般而言对象总是在heap分配内存],Java中为了节省内存空间和运行时间[如比较字符串时,==比equals()快],在编译阶段就把所有的字符串文字放到一个文字池[pool of literal strings]中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。
放入堆内存了。
作者: 吉许    时间: 2011-10-26 08:44
昨天提的,现在给出看到的总结
Sring s = new String("abc");语句,这里"abc"本身就是poo(池)l中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap(推)中,并且把heap中的这个对象的引用交给s持有,这里s只是变量持有者,并不是一个对象.所以,这条语句就创建了2个String对象

String s1 = new String("abc") ;
String s2 = new String("abc") ;按上面的方法可以推出创建了三个String Object (pool中一个,head中两个)
pool和head对应老毕的视频讲课中经常画图的栈和推
作者: 黄健    时间: 2011-10-26 10:32
有道理,学习了
作者: 10642491    时间: 2011-10-28 07:37
我也看过这个面试题,一共干了3件事,字符串常量 ,在heap中创建一个对象,返回一个引用赋值给String对象
作者: 张冬冬    时间: 2011-10-29 22:31
String字符串作为常用的字符串,每当new一个新方法的时候,就会在堆内存里创建一个空间来存放这个字符串,但是String字符串是常用的方法,所以会在缓存池中存放这个String中的内容,当再new一个新的String字符串时,程序就会先到这个缓存池中去找看有这个对象没,如果有的话,就不在往里面写入新的,只在堆内存中创建一个自己的字符串
当你new了两个新的string"abc"时,不但会在两个不同的内存地址中创建两个"abc"还会在这个缓存池中创建一个
所以是创建了三个"abc"
作者: o火o把o    时间: 2011-10-30 14:48
String s = new String("abc");
创建了2个对象.
一个是"abc",一个是指向"abc"的引用对象.




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