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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吉许 黑马帝   /  2011-10-25 15:36  /  4207 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = new String("abc");创建了几个String Object?

看面试题看到的,看了后才真正了解,觉得不错,拿来和大家分享,大家可以先讨论下发表下意见.
同理推下
String s1 = new String("abc") ;
String s2 = new String("abc") ;

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

12 个回复

倒序浏览
String s = new String("abc");
两个,一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例

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


评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
宁超 黑马帝 2011-10-25 16:08:31
藤椅
创建了三个new String对象吧。
String s1 = new String("abc") ;
"abc"本身就是文字池中的一个对象,执行new String()时,
将文字池中(文字池中相同的字符串,只存一份)的对象复制一份放到堆栈中,又把堆栈中的这个对象的引用交给s1了。
然后s1和s2在用==判断就可以知道是不同的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
每个String s=new String("abc");都创建了两个对象,其实可以分解为String s=new String(),s="abc";我觉得应该是这样的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
咖啡 黑马帝 2011-10-25 18:34:25
报纸
两个对象
回复 使用道具 举报
String s = new String("abc");
在内存中有两个对象
回复 使用道具 举报
李建雄 黑马帝 2011-10-25 18:54:06
7#
宁超 发表于 2011-10-25 16:08
创建了三个new String对象吧。
String s1 = new String("abc") ;
"abc"本身就是文字池中的一个对象,执行ne ...

这个讲得好像比较有道理,
文字池,是什么?没听说过,它在内存中的哪个地方?是不是在方法区啊
你说的"复制一份放到堆栈中"到底是堆内存中,还是栈内存中?
s1和s2在用==判断,应该是false

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
宁超 黑马帝 2011-10-25 19:21:42
8#
本帖最后由 宁超 于 2011-10-25 19:25 编辑
李建雄 发表于 2011-10-25 18:54
这个讲得好像比较有道理,
文字池,是什么?没听说过,它在内存中的哪个地方?是不是在方法区啊
你说的"复制一 ...


由于字符串对象的大量使用[它是一个对象,一般而言对象总是在heap分配内存],Java中为了节省内存空间和运行时间[如比较字符串时,==比equals()快],在编译阶段就把所有的字符串文字放到一个文字池[pool of literal strings]中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。
放入堆内存了。
回复 使用道具 举报
吉许 黑马帝 2011-10-26 08:44:08
9#
昨天提的,现在给出看到的总结
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对应老毕的视频讲课中经常画图的栈和推

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黄健 黑马帝 2011-10-26 10:32:55
10#
有道理,学习了
回复 使用道具 举报
10642491 黑马帝 2011-10-28 07:37:36
11#
我也看过这个面试题,一共干了3件事,字符串常量 ,在heap中创建一个对象,返回一个引用赋值给String对象
回复 使用道具 举报
张冬冬 黑马帝 2011-10-29 22:31:55
12#
String字符串作为常用的字符串,每当new一个新方法的时候,就会在堆内存里创建一个空间来存放这个字符串,但是String字符串是常用的方法,所以会在缓存池中存放这个String中的内容,当再new一个新的String字符串时,程序就会先到这个缓存池中去找看有这个对象没,如果有的话,就不在往里面写入新的,只在堆内存中创建一个自己的字符串
当你new了两个新的string"abc"时,不但会在两个不同的内存地址中创建两个"abc"还会在这个缓存池中创建一个
所以是创建了三个"abc"
回复 使用道具 举报
o火o把o 黑马帝 2011-10-30 14:48:26
13#
String s = new String("abc");
创建了2个对象.
一个是"abc",一个是指向"abc"的引用对象.

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

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