关于String的内存地址及字符串相加

String a = "abc";

String b="ab";

String c=b+"c";

String d="abc";

String e="ab"+"c";

System.out.println(a==c);           //false

System.out.println(a==d);        //true

System.out.println(a==e);         //true

 

 

 

以下为引用"zoeg"(http://hi.csdn.net/zoeg)的发言回答于http://topic.csdn.net/u/20090301/21/7405d0a4-0c3a-4a00-8af4-05bc33ce572a.html?50551

 

我觉得这是一个没有意义的问题,首先作为字符串用==比较,从规范的角度看只是比较地址相同,但并没有约定如何来存放这些字符串,也不保证在编译器相同的串就一定处于同一个地址;
虽然现在在某个jre环境上得到某个值,如果将来编译器能够优化代码中的多余语句,情况又可能不一样;
而且,如果项目中谁用这个方法来比较字符串是否相同,通常是要抓出来批斗的!


回答1

我来给各位解释一下吧
String a = "ab"+"c";
这里会被编译器自动优化成a = "abc";它是存在在栈中的
String a="ab";
String c=b+"c";
这里,实际上a是一个对象了,那么+操作符会把结果放到堆内存中,这样,两块内存是不一样的,虽然内容是一样的
所以它们比较就得到false了.

 

回答2


我看到另一种说法,不知道那种更准确。
String a = "ab"+"c";  
这时候生成的"abc"会放入StringPool,
String a="ab";  
String c=b+"c";  
由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。
即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值