Java 字符串与实习生的比较

Java 字符串与实习生的比较,java,Java,我在试着理解String#intern方法。现在,它引起了更多的混乱 package com; public class Main { public static void main(String[] args) { String s1 = new String("GFG"); // Line-1 String s2 = s1.concat("GFG"); // Line-2 s2.intern(); // Line-3

我在试着理解String#intern方法。现在,它引起了更多的混乱

package com;

public class Main {  
public static void main(String[] args) {  

        String s1 = new String("GFG"); // Line-1  
        String s2 = s1.concat("GFG"); // Line-2  
        s2.intern(); // Line-3
        String s4 = "GFGGFG"; // Line-4
//      s2.intern(); // Line -5
        System.out.println(s2 == s4);
  }
}
上面的代码打印为true。如果我注释第3行,取消注释第5行,则打印为false。
对于第3行,检查SCP,并将字符串添加到SCP中。 但在这种情况下,s2如何等于s4?
s2仍在引用堆中指向SCP常量的对象。对吧?

谁能解释一下发生了什么事?我经历了不同的问题,但仍然无法理解

编辑
我只是想了解实习的方法。我知道b/w
=
的区别,后者是首选。

String.intern()返回String对象的规范表示形式。 最初为空的字符串池由类字符串私下维护

调用intern方法时,如果池中已经包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用


因此,对于任意两个字符串s和t,s.intern()==t.intern()为真当且仅当s.equals(t)为真时

简单地说,实习生负责制作内存中内容的精确副本(字符串常量池)。将为所有复制的内容共享内存

通过对两个字符串应用String.intern(),可以确保具有相同内容的所有字符串共享相同的内存。例如,如果一个名字“Amy”出现100次,通过实习,你可以确保只有一个“Amy”实际分配了内存

为了证明这一点,我们可以使用操作符==(用于比较引用)和等于方法(用于比较内容)

输出:

false
true
true
说明:

false
true
true
Case-1:s1和s2的内容相同,但指向内存中不同的引用,因为新字符串总是创建新引用,所以它是false

Case-2:s3是从s1插入或复制的,指向内存中与插入函数相同的引用。只需复制一个副本并保留相同的引用,这样就可以了


案例3:s2和s3的内容相同

非常简单。。。表面上看

如果你愿意写:

s2 = s2.intern();
那么位置是不相关的,总是产生s2==s4

在没有作业的情况下发生的事情似乎是一个奇迹。 JVM在引擎盖下交换s2字符串。 (使用
javap-c
进行反汇编并没有向我展示一些特殊的东西。)

因为
intern
是本地的,速度慢, 由于涉及到JVM,我不愿意进一步深入研究字符串实习这一深奥的主题;纯粹的猜测可能会发生什么


但确实令人困惑,这是一个有趣的问题。

可能重复,因为分配字符串文字首先搜索SCP。分配
String s4=“GFGGFG”
时,将返回来自SCP的
“GFGGFG”
引用。这正是我所要求的。如果你能告诉我你的猜测,我可以结束这个问题