为了账号安全,请及时绑定邮箱和手机立即绑定

与实习生的字符串比较

与实习生的字符串比较

四季花海 2022-07-14 09:52:05
我试图理解 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后者是首选。
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

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

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

由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。


查看完整回答
反对 回复 2022-07-14
?
万千封印

TA贡献1891条经验 获得超3个赞

简单来说,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

}}  

输出:


false

true

true

解释:


Case-1: s1 和 s2 具有相同的内容,但指向内存中的不同引用,因为new String总是创建新的引用,所以它是错误的。


案例 2: s3 被实习生或从 s1 复制并指向内存中与实习生函数相同的引用,只需复制并保留相同的引用,因此它是正确的。


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


查看完整回答
反对 回复 2022-07-14
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

这很简单……表面上。

如果你会写:

s2 = s2.intern();

然后位置无关紧要,总是产生 s2 == s4。

没有赋值发生的事情似乎是检索 s2 的奇迹。JVM 在后台交换 s2 的字符串。(反汇编javap -c并没有向我展示什么特别之处。)

由于intern是原生的、缓慢的并且涉及到 JVM,因此我不愿意深入研究字符串实习这个深奥的主题。纯粹的猜测可能会发生什么。

但绝对莫名其妙,一个有趣的问题。


查看完整回答
反对 回复 2022-07-14
  • 3 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信