【问题标题】:How does String.intern() work and how does it affect the String pool?String.intern() 如何工作以及它如何影响字符串池?
【发布时间】:2015-09-05 02:28:06
【问题描述】:

我们知道,String().intern() 方法在字符串池中添加字符串值,如果它不存在的话。如果存在,则返回该值/对象的引用。

String str = "Cat"; // creates new object in string pool  with same character sequence.  
String st1 = "Cat"; // has same reference of object in pool, just created in case of 'str'

 str == str1 //that's returns true

String test = new String("dog");
test.intern();// what this line of code do behind the scene

我需要知道,当我调用test.intern() 时,这个实习生方法会做什么?

在字符串池中添加具有不同引用的“狗”或在字符串池中添加test对象引用(我认为不是这样)?

我试过了

String test1 = "dog";

test == test1 // returns false

我只是想确定,当我调用test.intern() 时,它会在字符串池中创建具有相同值的新对象吗?现在我有 2 个值为“dog”的对象。一个直接存在于堆中,另一个存在于字符串池中?

【问题讨论】:

标签: java string


【解决方案1】:

当我打电话给test.intern() 这个实习生方法会做什么?

它将"dog" 字符串放入字符串池中(除非它已经存在)。但它不一定会将test 所指的对象 放入池中。这就是你通常这样做的原因

test = test.intern();

请注意,如果您的代码中有一个 "dog" 文字,那么字符串池中已经有一个 "dog",因此 test.intern() 将返回该对象。

也许您的实验让您感到困惑,而实际上您想到的就是以下实验:

String s1 = "dog";             // "dog" object from string pool
String s2 = new String("dog"); // new "dog" object on heap

System.out.println(s1 == s2);  // false

s2 = s2.intern();              // intern() returns the object from string pool

System.out.println(s1 == s2);  // true

【讨论】:

  • 那么,现在 s2 指向的对象存在于池中而不是堆中的对象?正确的 ?顺便说一句谢谢。我得到了答案。
  • 是的。你说得对。 s2.intern() 将从池中返回一个对象,因此在 s2 = s2.intern() 之前,s2 变量将指向堆上的一个对象,之后它将指向池中的一个对象。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2012-12-06
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多