3 回答
TA贡献1936条经验 获得超6个赞
String.intern() 返回字符串对象的规范表示。一个字符串池,最初是空的,由 String 类私下维护。
当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,该字符串由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。
由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。
TA贡献1891条经验 获得超3个赞
简单来说,Intern 负责在内存(字符串常量池)中制作内容的精确副本。所有复制的内容都将共享内存。
通过在几个字符串上应用 String.intern() 将确保所有具有相同内容的字符串共享相同的内存。例如,如果名称“Amy”出现 100 次,通过实习可以确保只有一个“Amy”实际分配了内存。
为了证明这一点,我们可以使用运算符==(用于比较引用)和equals方法(用于比较内容)。
public class InternExample{
public static void main(String args[]){
String s1=new String("hello");
String s2="hello";
String s3=s1.intern();//returns string from pool, now it will be same as s2
System.out.println(s1==s2);//false because reference variables are pointing to different instance
System.out.println(s2==s3);//true because reference variables are pointing to same instance
System.out.println(s2.equals(s3));//true because content are same
}}
输出:
false
true
true
解释:
Case-1: s1 和 s2 具有相同的内容,但指向内存中的不同引用,因为new String总是创建新的引用,所以它是错误的。
案例 2: s3 被实习生或从 s1 复制并指向内存中与实习生函数相同的引用,只需复制并保留相同的引用,因此它是正确的。
案例 3: s2 和 s3 具有相同的内容
TA贡献1860条经验 获得超9个赞
这很简单……表面上。
如果你会写:
s2 = s2.intern();
然后位置无关紧要,总是产生 s2 == s4。
没有赋值发生的事情似乎是检索 s2 的奇迹。JVM 在后台交换 s2 的字符串。(反汇编javap -c
并没有向我展示什么特别之处。)
由于intern
是原生的、缓慢的并且涉及到 JVM,因此我不愿意深入研究字符串实习这个深奥的主题。纯粹的猜测可能会发生什么。
但绝对莫名其妙,一个有趣的问题。
添加回答
举报