String s="a"+"b"+"c"到底产生了几个对象?

chang2442 2007-11-17 11:29:28
如题,小弟是菜鸟,不是很明白,其中的内存情况是怎么回事!
...全文
2087 139 打赏 收藏 转发到动态 举报
写回复
用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)

62,623

社区成员

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

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