关于String s="a" + "b" 共创建了几个对象,自己的看法

jhr924 2008-12-19 10:42:25
看到论坛里有个 IBM面试的帖子:
String s = "a" + "b" + "c" + "d" + "e";
问此语句共创建了几个对象,据说是10个,请专家点评

刚开始也没弄明白,然后查了下 java编程思想,
现在认为:String 的内部结构是通过StringBuilder实现的! 所以没有生成ab abc 等对象
s引用在堆栈里,肯定不是对象
所以只创建了一个对象abcde

不知道对否


...全文
1177 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
PhoegonZhou 2008-12-24
  • 打赏
  • 举报
回复
感觉我还没学到,不过感觉快了。
GTJin 2008-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 L502650 的回复:]
1个.

[/Quote]
同意
Friend_NO1 2008-12-23
  • 打赏
  • 举报
回复
only one
jhr924 2008-12-23
  • 打赏
  • 举报
回复
现在又明白了

呵呵
jhr924 2008-12-23
  • 打赏
  • 举报
回复
明白了 又糊涂了 又明白了 又糊涂了
bigbro001 2008-12-22
  • 打赏
  • 举报
回复
大家说法都不一样,到底听谁的啊???
Neves_pa 2008-12-22
  • 打赏
  • 举报
回复
看到很多高手....
云上飞翔 2008-12-22
  • 打赏
  • 举报
回复
答:忘记加toString()了.
第一个应为:
才相当于:String s=new StringBuilder(a).append("b").append("c").append("d").append("e").toString();
云上飞翔 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 jhr924 的回复:]
问下:是不是
String a="aaaaa";
String s = a + "b" + "c" + "d" + "e";
这样 才会用到StringBulder类的append,
[/Quote]

答:
是的.此时,String s = a + "b" + "c" + "d" + "e";
才相当于:String s=new StringBuilder(a).append("b").append("c").append("d").append("e");

另外:若写成:String s = "b" + "c" + "d" + "e"+a;
则相当于:String s=new StringBuilder("bcde").append(a);

再另外:若a定义为:final String a="aaaaa";
此时,String s = a + "b" + "c" + "d" + "e";
相当于:String s="aaaaabcde";
bellower 2008-12-22
  • 打赏
  • 举报
回复
高手就是高手
终于确定了这道题的答案
huyu886 2008-12-22
  • 打赏
  • 举报
回复
显然只有一个
mzf333 2008-12-22
  • 打赏
  • 举报
回复
一个啊。。abcde
邵钏 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 ZangXT 的回复:]
引用 45 楼 enzymer 的回复:
引用 44 楼 ZangXT 的回复:
引用 43 楼 enzymer 的回复:
问个问题:字符串常量池里有对象吗?
如果没有的话,那么按照云上飞翔的解释,这道题的答案就是0个了

看jdk文档中对intern方法的说明就知道了.

谢谢ZangXT, 根据我对jdk里intern方法阅读后的理解,字符串常量池里的string是算做对象的。
那么~
haojia0716关于常量池中无对象的阐述有误
而我认同NewMoons的看法:
"答…
[/Quote]
嗯,谢谢~回去翻看翻看相关资料学习一下~
ZangXT 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 enzymer 的回复:]
引用 44 楼 ZangXT 的回复:
引用 43 楼 enzymer 的回复:
问个问题:字符串常量池里有对象吗?
如果没有的话,那么按照云上飞翔的解释,这道题的答案就是0个了

看jdk文档中对intern方法的说明就知道了.

谢谢ZangXT, 根据我对jdk里intern方法阅读后的理解,字符串常量池里的string是算做对象的。
那么~
haojia0716关于常量池中无对象的阐述有误
而我认同NewMoons的看法:
"答案应该是0或者1个,取决于常量…
[/Quote]
对,其实自己查资料还是能得出答案的,比空推测强.
有兴趣可以再看看jvm是如何处理常量池里的字符串的.
class文件中的常量池信息和实际运行时的常量池并不能等同起来.
roonten 2008-12-22
  • 打赏
  • 举报
回复
就1个
邵钏 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 ZangXT 的回复:]
引用 43 楼 enzymer 的回复:
问个问题:字符串常量池里有对象吗?
如果没有的话,那么按照云上飞翔的解释,这道题的答案就是0个了

看jdk文档中对intern方法的说明就知道了.
[/Quote]
谢谢ZangXT, 根据我对jdk里intern方法阅读后的理解,字符串常量池里的string是算做对象的。
那么~
haojia0716关于常量池中无对象的阐述有误
而我认同NewMoons的看法:
"答案应该是0或者1个,取决于常量池中是否已经存在了那个字符串。"
ZangXT 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 enzymer 的回复:]
问个问题:字符串常量池里有对象吗?
如果没有的话,那么按照云上飞翔的解释,这道题的答案就是0个了
[/Quote]
看jdk文档中对intern方法的说明就知道了.
邵钏 2008-12-22
  • 打赏
  • 举报
回复
问个问题:字符串常量池里有对象吗?
如果没有的话,那么按照云上飞翔的解释,这道题的答案就是0个了
jhr924 2008-12-21
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jiangnaisong 的回复:]
引用 2 楼 sbfivwsll 的回复:
一个,
String s = "a" + "b" + "c" + "d" + "e";
在虚拟机中,被解释为:String s=(new StringBuffer().append("a").append("b").append("c")...).toString();
因此,只产生了一个对象


答:自从人们知道,String的+被解释成:StringBulder类的append(..)之后,到那儿都这是这个.害人啦!学东西,一定要理解它的真正的本质啊.

知道JAVAC编译器有一个基本的"合并已知量"的优化功能否?

[/Quote]

问下:是不是
String a="aaaaa";
String s = a + "b" + "c" + "d" + "e";
这样 才会用到StringBulder类的append,
ThinkingInJava110 2008-12-21
  • 打赏
  • 举报
回复
mark!
加载更多回复(36)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧