如何解决字符串连接在字符串池方面是如何工作的?
13: String a = "";
14: a += 2;
15: a += 'c';
16: a += false;
17: if ( a == "2cfalse") System.out.println("==");
18: if ( a.equals("2cfalse")) System.out.println("equals");
输出:
equals
如果我错了请纠正我...
在第 13 行,创建了一个新的 String
对象并将引用存储在 a
。 (a = "")
在第 14 行,创建了一个新的 String
对象并将引用存储在 a
中。之前的 String
对象成为垃圾回收 (GC) 的合格对象。 (a = "2c")
在第 15 行,创建了一个新的 String
对象并将引用存储在 a
中。之前的 String
对象成为垃圾回收 (GC) 的合格对象。 (a = "2cfalse").
现在,String pool
由 2cfalse
字面量组成。因此,在第 17 行,不应该将 a == "2cfalse"
计算为 true
,因为它们都指向内存中的同一个对象?
然而,程序输出只是==
。我哪里做错了?请有人给我解释一下...
解决方法
"2cfalse"
仅在第 17 行添加到字符串池中,当您将 a
与文字 "2cfalse"
进行比较时。
第 17 行之前由 a
引用的实例未添加到字符串池中,因此它与 "2cfalse"
字面量不是同一个实例。
如果在第 17 行之前添加对 a.intern ()
的调用,a
引用的实例将被添加到池中(因为它尚未在池中),并且条件第 17 行将评估为 true。
如果在调用 String
之前池中已经存在等于 "2cfalse"
的 a.intern()
,您必须将其分配回 a
(即 {{1 }}) 以便 a = a.intern();
引用存储在池中的实例。
a
输出:
String a = "";
a += 2;
a += 'c';
a += false;
a.intern (); // or a = a.intern(); in case the pool already contains "2cfalse"
if ( a == "2cfalse") System.out.println("==");
if ( a.equals("2cfalse")) System.out.println("equals");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。