Java 字符串与实习生的比较
我在试着理解String#intern方法。现在,它引起了更多的混乱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
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”
引用。这正是我所要求的。如果你能告诉我你的猜测,我可以结束这个问题