我试着理解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 ==和equals的区别,而后者是首选。
发布于 2019-03-01 07:22:17
String.intern()返回字符串对象的规范表示形式。字符串池最初为空,由类字符串私下维护。
当调用intern方法时,如果池中已经包含了一个与这个字符串对象相等的字符串,则返回来自这个池的字符串。否则,将此字符串对象添加到池中,并返回对此字符串对象的引用。
因此,对于任意两个字符串s和t,s.intern() == t.intern()是真当且仅当s.equals(t)为真。
发布于 2019-03-01 08:33:35
简而言之,Intern负责准确复制内存中的内容(字符串常量池)。内存将共享所有复制的内容。
通过在两个字符串上应用String.intern(),将确保所有具有相同内容的字符串共享相同的内存。例如,如果一个名字“Amy”出现了100次,通过实习,您可以确保只有一个‘Amy’实际上被分配到内存中。
为了证明这一点,我们可以使用运算符== (用于比较引用)和等于方法(用于比较内容)。
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具有相同的内容,但是指向内存中不同的引用,因为新字符串总是创建新的引用,因此它是假的。
Case-2: s3是从s1中插入或复制的,指向内存中与实习生函数相同的引用,只需创建一个副本并保留相同的引用,所以这是正确的。
Case-3: s2和s3具有相同的内容
发布于 2019-03-01 10:54:41
很简单..。表面上。
如果你能写到:
s2 = s2.intern();那么这个位置就无关紧要了,总是会产生s2 == s4。
在没有作业的情况下发生的事情似乎是检索s2的奇迹。JVM在遮罩下交换s2字符串。(使用javap -c进行反汇编并没有给我带来什么特别的东西。)
由于intern是本地的、缓慢的,并且涉及到JVM,所以我不愿意进一步研究字符串实习生这个深奥的主题;纯粹的猜测可能会发生什么。
但绝对令人费解,一个有趣的问题。
https://stackoverflow.com/questions/54939636
复制相似问题