与实习生的字符串比较

我试图理解 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);

  }

}

上面的代码打印为真。如果我注释第 3 行并取消注释第 5 行,则会打印错误。

对于第 3 行,检查 SCP 并将字符串添加到 SCP。但是在那种情况下 s2 如何等于 s4 呢?

s2 仍在引用堆中指向 SCP 常量的对象。正确的 ?


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


编辑

我只是想了解实习生方法。我知道黑白的区别==,equals后者是首选。


四季花海
浏览 101回答 3
3回答

LEATH

String.intern() 返回字符串对象的规范表示。一个字符串池,最初是空的,由 String 类私下维护。当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,该字符串由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。

万千封印

简单来说,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}}  输出:falsetruetrue解释:Case-1: s1 和 s2 具有相同的内容,但指向内存中的不同引用,因为new String总是创建新的引用,所以它是错误的。案例 2: s3 被实习生或从 s1 复制并指向内存中与实习生函数相同的引用,只需复制并保留相同的引用,因此它是正确的。案例 3: s2 和 s3 具有相同的内容

慕码人2483693

这很简单……表面上。如果你会写:s2 = s2.intern();然后位置无关紧要,总是产生 s2 == s4。没有赋值发生的事情似乎是检索 s2 的奇迹。JVM 在后台交换 s2 的字符串。(反汇编javap -c并没有向我展示什么特别之处。)由于intern是原生的、缓慢的并且涉及到 JVM,因此我不愿意深入研究字符串实习这个深奥的主题。纯粹的猜测可能会发生什么。但绝对莫名其妙,一个有趣的问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java