当前位置: 首页 > 面试题库 >

String.intern()如何工作,如何影响字符串池?

巩阳秋
2023-03-14
问题内容

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

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()此实习生方法时会做什么?

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

我试过了

String test1 = "dog";

test == test1 // returns false

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


问题答案:

当我调用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


 类似资料:
  • 问题内容: 通常,我在互联网上的许多文章中都读到,当我们编写上面的语句时,会创建两个对象。在堆上创建一个String对象,在Literal Pool上创建一个字符串对象。并且堆对象还引用在Literal Pool上创建的对象。(如果我的陈述是错误的,请更正。) 请注意,以上解释是根据我阅读互联网上一些文章后的理解得出的。 所以我的问题是..有什么方法可以停止在文字池中创建字符串对象。怎么做? [请

  • 我试图确切地理解Java字符串是如何不可变的。我明白这应该是一个简单的概念,但在阅读了几个在线网页后,我仍然不太明白。 我不明白Java字符串是如何“不可变”的。我目前有以下代码: 我的输出如下: 如果字符串应该是不可变的,为什么会发生这种情况?为什么我能给字符串重新赋值?

  • 我收到一个字符串响应从以下@覆盖方法 我面临的矛盾是,我不知道如何将这个响应分解成键值对。这是一个反应的例子。 {"action":{"generic_message":"测试通用消息"},"域":{"key_example_one":"https:/google.com","api_root_url":"https://test.com/new/0.2/json"},"page": null}}

  • 问题内容: 请参见以下代码。 我知道第2行仍将指向“ Monday”,并具有一个新的String对象,其偏移量和计数设置为0.3。 第4行将在字符串池中创建一个新的字符串“ Mon”并指向它。 但不确定第5行如何表现像第2行还是第4行。 如果我对2或4行不正确,也请更正。 问题答案: 我知道第2行仍将指向“ Monday”,并具有一个新的String对象,其偏移量和计数设置为0.3。 目前,对于S

  • 问题内容: 应该如何更改此函数以返回? 更新:大家,问题是关于了解多行注释时如何没有\ t或其他内容,而不是如何使用该模块。 问题答案: 当您不需要多余的空格,制表符和换行符时,请不要使用三引号引起来的字符串。 使用隐式延续,它更优雅:

  • 我一直在用Swift 3更新我的一些旧代码和答案,但当我使用Swift字符串和子字符串进行索引时,事情变得很混乱。 具体来说,我尝试了以下方法: 第二行给出了以下错误 “String”类型的值没有成员“substringWithRange” 我看到,String现在确实有以下方法: 起初我真的很困惑,所以我开始围绕索引和范围玩。这是子串的后续问答。我在下面添加一个答案来展示它们是如何使用的。