返回信息流String a="a";
String b=a+"b";
String c="ab";
System.out.println(b==c);
输出的为什么是false??
这是一条镜像帖。来源:北邮人论坛 / java / #26049同步于 2013/6/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
JAVA中字符串地址是否相等的判断
Mulany
2013/6/23镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
3q
【 在 nuanyangyang 的大作中提到: 】
: 希望这个有帮助。
: http://bbs.byr.cn/#!article/Java/24734
:
【 在 Mulany 的大作中提到: 】
: String a="a";
: String b=a+"b";
: String c="ab";
: ...................
"a"分配内存然后让a指向它,“b”分配一块内存,再分配一块内存a+"b"使得b指向他,c 会重新分配用于存储常量"ab",只有b同样等于"ab"时,a=b才是成立的
那么b所指向的空间存储内容是“ab”么
【 在 zjianjia 的大作中提到: 】
: "a"分配内存然后让a指向它,“b”分配一块内存,再分配一块内存a+"b"使得b指向他,c 会重新分配用于存储常量"ab",只有b同样等于"ab"时,a=b才是成立的
String b=a+"b"在堆内存中分配一个空间,并且不会对string池进行维护。String c="ab"如果开始没有创建这个字符串对象,那么会在string池中分配一块内存,如果有直接引用对象地址。如果是string a = new string(“a”) 会在堆内存中创建一个对象(引用堆内存的地址),并且维护string池(也就是看其中有没有创建这个字符串对象,没有就创建),所以,看出引用string池对象地址一般才会相等!
【 在 Mulany 的大作中提到: 】
: 那么b所指向的空间存储内容是“ab”么
于c==b,c是常量方式赋值,b是两个常量方式赋值的String相加,c==b的结果为false,我的理解是:“+”在java中被重载过,在执行“+”的时候java会自动把结果转化为对象类型而不再是常量。
后来我看到有人将其分配过程重现,貌似是java中+这个运算符重载是使用了stringbuilder,将其初始化后。使用append来加入+之后的字符,所以重新再堆中分配了地址,所以大家说使用append比+效率高,其实是没有道理的。。。。。java对于+运算符的重载其实是做了优化的
java对常量的处理就是对于已有的常量,会直接把地址赋值给变量,对于a+"b"; a为未知数据,所以没办法从常量中找到它,只能能分配新的内存。如果是“a”+"b";那么结果就是true了,说明"a"+'b'="ab",这个结果是一次常量,编译器在编译的时候就确定了,直接把“ab”这个地址赋值给变量