在下面的代码中,
如果s3
被注释掉,则s2==s2.intern()
评估为true
。为什么呢?
如果取消注释s3
,则s2==s2.intern()
评估为false
。为什么呢?
我的理解是concat()
方法总是返回一个新的字符串实例,即不是字符串池中的一个。
public static void main(String[] args) {
String s2 = "hitesh".concat("yadav");
String s3 = "hiteshyadav";
System.out.println(Integer.toHexString(System.identityHashCode(s2)));
System.out.println(Integer.toHexString(System.identityHashCode(s2.intern())));
}
答案 0 :(得分:1)
这是预期的行为。请注意以下事实:
intern()
实际执行字符串实习时,其返回值与其参数相同; intern()
找到已经实现的字符串时,它会返回该实例而不是参数。因此,当s3
被注释掉时,s2
引用的String实例是被实体化的实例,intern()
返回它。如果存在s3
,则intern()
会返回此预先存在的实例。
要验证上述陈述并提高您的理解,请在代码中添加以下行:
System.out.println(Integer.toHexString(System.identityHashCode(s3)));
你会发现输出的第二行和第三行是相同的。