public static void main(String[] args) {
String a = new StringBuilder("Jav").toString();
a.intern();
String c = "Jav";
System.out.println(a == c); //false
}
Run Code Online (Sandbox Code Playgroud)
public static void main(String[] args) {
String a = new StringBuilder("Ja").append("v").toString();
a.intern();
String c = "Jav";
System.out.println(a == c); //true
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第一个会打印出 false,但第二个会打印出 true。我认为这些应该打印出true,因为调用intern方法后,a的引用将被写入字符串池,而c将指向a的引用。有人可以解释其中的区别吗?谢谢!
我的JDK版本:OpenJDK 17.0.7
顺便说一句,我在使用 StringBuffer 时也得到了相同的结果。
dan*_*1st 11
重要的区别是第一个文字/实习的位置"Jav"。
intern() 返回您的规范参考。如果规范参考已经存在,则不会更新。
因此,您需要更改a.intern();为a = a.intern();:
public static void main(String[] args) {
String a = new StringBuilder("Jav").toString();
a = a.intern();
String c = "Jav";
System.out.println(a == c); //this is true now
}
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,==返回是true因为String返回的 by被设为第一次调用StringBuilder中的规范引用,并且文字被延迟解析并给出。intern()String
然后,文字为您提供规范引用,该引用与您已经拥有的对象相同。
在第一个示例中,String该内容已经存在规范,因此该intern()方法仅返回现有规范String,而不是使当前规范成为String规范。
正如@ Jorn的评论中提到的,无论如何你都不应该需要,也不应该在s 上使用。String#intern==String
此外,依赖于这种行为是脆弱的。如果您使用像 GraalVM 这样的工具native-image,使用不同的 JVM 或者可能使用Project Leyden的一些冷凝器,这样的事情可能会有点不同。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |