BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #26049同步于 2013/6/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

JAVA中字符串地址是否相等的判断

Mulany
2013/6/23镜像同步15 回复
String a="a"; String b=a+"b"; String c="ab"; System.out.println(b==c); 输出的为什么是false??
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2013/6/23
希望这个有帮助。 http://bbs.byr.cn/#!article/Java/24734
Mulany机器人#2 · 2013/6/24
3q 【 在 nuanyangyang 的大作中提到: 】 : 希望这个有帮助。 : http://bbs.byr.cn/#!article/Java/24734 :
zjianjia机器人#3 · 2013/6/24
【 在 Mulany 的大作中提到: 】 : String a="a"; : String b=a+"b"; : String c="ab"; : ................... "a"分配内存然后让a指向它,“b”分配一块内存,再分配一块内存a+"b"使得b指向他,c 会重新分配用于存储常量"ab",只有b同样等于"ab"时,a=b才是成立的
wangye2012机器人#4 · 2013/6/24
在String类中,“==”是进行地址值的比较,如果换作方法equals()则表示内容的比较,运行结果是true
Mulany机器人#5 · 2013/6/24
那么b所指向的空间存储内容是“ab”么 【 在 zjianjia 的大作中提到: 】 : "a"分配内存然后让a指向它,“b”分配一块内存,再分配一块内存a+"b"使得b指向他,c 会重新分配用于存储常量"ab",只有b同样等于"ab"时,a=b才是成立的
hotcode机器人#6 · 2013/6/24
这个取决于虚拟机的实现。说不定下一版本的虚拟机输出的结果就不同了。所以只要记住==与equals的区别就行了,我觉得。
yegucheng机器人#7 · 2013/6/24
String b=a+"b"在堆内存中分配一个空间,并且不会对string池进行维护。String c="ab"如果开始没有创建这个字符串对象,那么会在string池中分配一块内存,如果有直接引用对象地址。如果是string a = new string(“a”) 会在堆内存中创建一个对象(引用堆内存的地址),并且维护string池(也就是看其中有没有创建这个字符串对象,没有就创建),所以,看出引用string池对象地址一般才会相等!
zjianjia机器人#8 · 2013/6/25
【 在 Mulany 的大作中提到: 】 : 那么b所指向的空间存储内容是“ab”么 于c==b,c是常量方式赋值,b是两个常量方式赋值的String相加,c==b的结果为false,我的理解是:“+”在java中被重载过,在执行“+”的时候java会自动把结果转化为对象类型而不再是常量。 后来我看到有人将其分配过程重现,貌似是java中+这个运算符重载是使用了stringbuilder,将其初始化后。使用append来加入+之后的字符,所以重新再堆中分配了地址,所以大家说使用append比+效率高,其实是没有道理的。。。。。java对于+运算符的重载其实是做了优化的
kaka1992机器人#9 · 2013/6/25
java对常量的处理就是对于已有的常量,会直接把地址赋值给变量,对于a+"b"; a为未知数据,所以没办法从常量中找到它,只能能分配新的内存。如果是“a”+"b";那么结果就是true了,说明"a"+'b'="ab",这个结果是一次常量,编译器在编译的时候就确定了,直接把“ab”这个地址赋值给变量