首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串与实习生的比较

字符串与实习生的比较
EN

Stack Overflow用户
提问于 2019-03-01 07:10:07
回答 3查看 159关注 0票数 4

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

代码语言:javascript
复制
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的区别,而后者是首选。

EN

回答 3

Stack Overflow用户

发布于 2019-03-01 07:22:17

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

当调用intern方法时,如果池中已经包含了一个与这个字符串对象相等的字符串,则返回来自这个池的字符串。否则,将此字符串对象添加到池中,并返回对此字符串对象的引用。

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

票数 3
EN

Stack Overflow用户

发布于 2019-03-01 08:33:35

简而言之,Intern负责准确复制内存中的内容(字符串常量池)。内存将共享所有复制的内容。

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

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

代码语言:javascript
复制
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
}}  

输出:

代码语言:javascript
复制
false
true
true

解释:

Case-1:、s1和s2具有相同的内容,但是指向内存中不同的引用,因为新字符串总是创建新的引用,因此它是假的。

Case-2: s3是从s1中插入或复制的,指向内存中与实习生函数相同的引用,只需创建一个副本并保留相同的引用,所以这是正确的。

Case-3: s2和s3具有相同的内容

票数 1
EN

Stack Overflow用户

发布于 2019-03-01 10:54:41

很简单..。表面上。

如果你能写到:

代码语言:javascript
复制
s2 = s2.intern();

那么这个位置就无关紧要了,总是会产生s2 == s4。

在没有作业的情况下发生的事情似乎是检索s2的奇迹。JVM在遮罩下交换s2字符串。(使用javap -c进行反汇编并没有给我带来什么特别的东西。)

由于intern是本地的、缓慢的,并且涉及到JVM,所以我不愿意进一步研究字符串实习生这个深奥的主题;纯粹的猜测可能会发生什么。

但绝对令人费解,一个有趣的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54939636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档