社区
Java SE
帖子详情
String s="a"+"b"+"c"到底产生了几个对象?
chang2442
2007-11-17 11:29:28
如题,小弟是菜鸟,不是很明白,其中的内存情况是怎么回事!
...全文
2087
139
打赏
收藏
String s="a"+"b"+"c"到底产生了几个对象?
如题,小弟是菜鸟,不是很明白,其中的内存情况是怎么回事!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
139 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
NickCheng
2009-02-02
打赏
举报
回复
String b = "a" + "b";编译器将这个"a" + "b"作为常量表达式,在编译时进行优化,直接取结果"ab",这样这个问题退化
String a = "ab";
String b = "ab";
System.out.println((a == b));
然后根据3的解释,得到结果true
这里有一个疑问就是String不是基本类型,像
int secondsOfDay = 24 * 60 * 60;
这样的表达式是常量表达式,编译器在编译时直接计算容易理解,而"a" + "b" 这样的表达式,string是对象不是基本类型,编译器会把它当成常量表达式来优化吗?
下面简单证明我的推断,首先编译这个类:
public class Test {
private String a = "aa";
}
复制class文件备用,然后修改为
public class Test {
private String a = "a" + "a";
}
再次编译,用ue之类的文本编辑器打开,察看二进制内容,可以发现,两个class文件完全一致,连一个字节都不差.
ok,真相大白了.根本不存在运行期的处理String b = "a" + "b";这样的代码的问题,编译时就直接优化掉了。
下面进一步探讨,什么样的string + 表达式会被编译器当成常量表达式?
String b = "a" + "b";
这个String + String被正式是ok的,那么string + 基本类型呢?
String a = "a1";
String b = "a" + 1;
System.out.println((a == b)); //result = true
String a = "atrue";
String b = "a" + true;
System.out.println((a == b)); //result = true
String a = "a3.4";
String b = "a" + 3.4;
System.out.println((a == b)); //result = true
可见编译器对string + 基本类型是当成常量表达式直接求值来优化的。
再注意看这里的string都是"**"这样的,我们换成变量来试试:
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b)); //result = false
这个好理解,"a" + bb中的bb是变量,不能进行优化。这里很很好的解释了为什么3的观点不正确,如果String+String的操作是在运行时进行的,则会产生新的对象,而不是直接从jvm的string池中获取。
再修改一下,把bb作为常量变量:
String a = "ab";
final String bb = "b";
String b = "a" + bb;
System.out.println((a == b)); //result = true
竟然又是true,编译器的优化好厉害啊,呵呵,考虑下面这种情况:
String a = "ab";
final String bb = getBB();
String b = "a" + bb;
System.out.println((a == b)); //result = false
private static String getBB() {
return "b";
}
看来java(包括编译器和jvm)对string的优化,真的是到了极点了,string这个所谓的"对象",完全不可以看成一般的对象,java对string的处理近乎于基本类型,最大限度的优化了几乎能优化的地方。
另外感叹一下,string的+号处理,算是java语言里面唯一的一个"运算符重载"(接触过c++的人对这个不会陌生)吧?
liutaoaisi
2008-12-01
打赏
举报
回复
受不了了!我到网上找了好多结果都不一样,没有一个比较标准的答案,个人感觉5个比较正确!
liutaoaisi
2008-12-01
打赏
举报
回复
受不了了!我到网上找了好多结果都不一样,没有一个比较标准的答案,个人感觉5个比较正确!
liutaoaisi
2008-12-01
打赏
举报
回复
受不了了!我到网上找了好多结果都不一样,没有一个比较标准的答案,个人感觉5个比较正确!
pfa2008
2007-12-02
打赏
举报
回复
看下我的程序;
public class Test1
{
public static void main(String args[])
{
if("ab".equals("a"+"b"))
System.out.println("-----1-------");
if("ab"==("a"+"b"))
System.out.println("-----2--------");
String s="Hello";
String s1=new String("Hello");
if(s==s1)
System.out.println("-------3-------");
String s2=s+s1;
System.out.println(s2);
}
}
结果为:
-----1-------
-----2--------
HelloHello
zhangbaokun
2007-12-02
打赏
举报
回复
刚查了一下这个jvm会自动优化的,和String S="abc"没区别
yanhuo010
2007-12-01
打赏
举报
回复
50419253 java高手群里一起讨论
chang2442
2007-12-01
打赏
举报
回复
晕,我当初发的时候没想到会有这么多人持这么多不同的意见
看来我面试的时候答不出来是应该的了,呵呵。
到底该怎么结贴啊!!
jiajia9312
2007-12-01
打赏
举报
回复
有些问题没有必要去弄清楚到底是为什么,就像我们现在根本没有必要弄清楚,宇宙有多大,因为对我们没有意义,咱们只要能编出高质量的代码就行
,这个问题有这么多不同的答案,究竟哪个是对的?谁也说不准,但如果就是真的知道了答案又怎么样?不就是做选择能多拿几分???没用
有人支持我说的吗?我说的不对大家别扔砖头啊o(∩_∩)o
wangluo_heke
2007-12-01
打赏
举报
回复
没有创建对象,了解了内存就明白了,那字符只是分配在CODE SEGMENT中,用一个引用指向它.
zhangbaokun
2007-11-29
打赏
举报
回复
what is a object? Is reference a Object?
andevele
2007-11-29
打赏
举报
回复
其实
重点是在:+ 操作符是否会产生对象?
对于这个操作符
Java中明确说了 + 这个操作符会产生新的对象
a + b 就产生了一个新的对象,这个对象的内容是ab
然后ab + c 又产生了一个新的对象,这个对象的内容是abc
那么 + 操作符总共产生了2个对象,再加上原来的a,b,c三个对象
总共是5个字符串对象
所以结果是5个对象
anchovy1984
2007-11-29
打赏
举报
回复
现在的讨论好像在于是不是产生了"ab"这个对象~
andevele
2007-11-29
打赏
举报
回复
是5个字符串对象
String s="a"+"b"+"c"
a b c 是三个对象
在java中, 操作符 + 可以把两个字符串对象连接在一起,产生一个新的对象。
从左到右,a+b 产生一个对象
然后a+b的结果 + c 又产生一个对象,并用引用变量指向这个对象。
所以总共是5个对象。
desan
2007-11-28
打赏
举报
回复
4
Yanbin_Q
2007-11-28
打赏
举报
回复
干嘛还在这里争论呢,为什么就不去看看生成的字节码呢?
了解一下编译原理啊
fayewan
2007-11-27
打赏
举报
回复
强贴,setMark
seaforce
2007-11-27
打赏
举报
回复
太复杂了
人脑都要炸了
frank3G
2007-11-27
打赏
举报
回复
晕了,类似1+1 =?
这个问题问的深了`````
等级高的人都不说出明确答案`````
iebhchen
2007-11-27
打赏
举报
回复
希望楼主不要结贴了!
加载更多回复(119)
String
s = a+b+c+d+e;创建了
几个
对象
的详细分析?
最近看到许多类似的帖子,大致意思如下:问题1:
String
s = "a" + "b" + "c" + "d" + "e"; 问此语句共创建了
几个
对象
, 答案是 就创建了一个
String
s = "a" + "b" + "c" + "d" + "e"; 赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量 对于常量,编译时就直接存储它们的字面值而不是它们的引用
String
s1="a",
String
s2 =s1+"b"创建了
几个
对象
?
String
s1 = "a";
String
s2 = s1 + "b";
String
s3 = "a" + "b"; System.out.println(s2); System.out.println(s3); System.out.println(s2 == "ab"); System.out.println(s2.equals( "ab")); System.ou
String
s="a"+"b"+"c"
到底
产生
了
几个
对象
?说一下自己的理解
String
s=“a”+“b”+"c"
到底
产生
了
几个
对象
? 关于这个问题很多人面试的时候都遇见过,我看了网上很多论坛对于这个问题都是不统一的。有的人说创建了一个
对象
,有的人说创建了五个
对象
,也有的人说创建了两个
对象
。 先说说创建一个的吧。当初面试的时候我跟面试官说创建了一个,他用非常疑惑的语气告诉我说,不只是一个哦,然后这道面试题我就被pass掉了(心里面很有种日了dog的感觉)。好在过了技术面...
String
s="a"+"b"+"c"+"e" 总共创建了
几个
对象
?
问:
String
s="a"+"b"+"c"+"e" 总共创建了
几个
对象
? 答案:1个 当我看到这个问题的时候,我的答案是错的,当我查阅资料后最终确认答案是1个。然后经过了大量的测试,最终答案是1个
对象
。 测试:
String
s1="a";
String
s2=s1+"b";
String
s3="a"+"b"; System.out.println(s2=="ab"); S
String
s=“a“+“b“+“c“,
到底
创建了
几个
对象
?
首先看一下这道常见的面试题,下面代码中,会创建
几个
字符串
对象
?
String
s="a"+"b"+"c"; 如果你比较一下Java源代码和反编译后的字节码文件,就可以直观的看到答案,只创建了一个
String
对象
。 估计大家会有疑问了,为什么源代码中字符串拼接的操作,在编译完成后会消失,直接呈现为一个拼接后的完整字符串呢? 这是因为在编译期间,应用了编译器优化中一种被称为常量折叠(Constant Folding)的技术,会将编译期常量的加减乘除的运算过程在编译过程中折叠。编译器通过语法分析,会将常量表达
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章