当前位置: 首页 > 知识库问答 >
问题:

String.intern()的返回解释了

毋城
2023-03-14

考虑:

String s1 = new StringBuilder("Cattie").append(" & Doggie").toString();
System.out.println(s1.intern() == s1); // true why?
System.out.println(s1 == "Cattie & Doggie"); // true another why?

String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2); // false

String s3 = new String("Cattie & Doggie");
System.out.println(s3.intern() == s3); // false
System.out.println(s3 == "Cattie & Doggie"); // false

我弄不明白为什么返回的字符串值会产生不同的结果。intern(),上面写着:

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

特别是在这两次测试之后:

assertFalse("new String() should create a new instance", new String("jav") == "jav");
assertFalse("new StringBuilder() should create a new instance",
    new StringBuilder("jav").toString() == "jav");

我曾经读过一篇帖子,其中谈到了一些在其他事情之前实习的特殊字符串,但现在真的很模糊了。

如果有一些字符串预先插入,是否有方法获取它们的列表?我只是好奇他们可能是什么。

多亏了@Eran和@Slaw的帮助,我终于可以解释刚才在那里发生了什么

true
true
false
false
false
  1. 自从"卡蒂

感谢@Sunny提供了一个技巧来获取所有的字符串。


共有3个答案

锺霍英
2023-03-14

字符串文字(那些像“字符串”一样硬编码的文字)已经被编译器为您插入。但是那些以编程方式获取的字符串不是,并且只有在使用时才会被插入。intern()方法。

通常情况下,您不会手动插入字符串,除非您知道将在内存中存储大量重复字符串,这样可以节省大量内存。

这里解释一下:什么是Java字符串interning?

呼延才
2023-03-14

在字符串对象上调用intern()方法时,它会在池中查找该字符串对象包含的字符串,如果在那里找到该字符串,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。

因此,java字符串必须已经在池中。因此,它给出的是虚假的。

您可以打印池中的所有字符串

如何打印整个字符串池?

如果您使用的是openjdk,下面是一个获取所有字符串的示例。

狄安歌
2023-03-14
匿名用户

<代码>s2。intern()仅当字符串池在调用之前不包含值为“java”的字符串时,才会返回s2引用的实例。在执行代码之前,JDK类会插入一些字符串。“java”必须是其中之一。因此,<代码>s2。intern()返回以前的interned实例,而不是s2。

另一方面,JDK类没有插入任何值等于“Cattie”的字符串

我不知道任何预插入字符串的列表。这样的列表很可能被视为实现细节,可能因不同的JDK实现和JDK版本而异,不应依赖。

 类似资料:
  • 问题内容: 如果我使用String.intern()来提高性能,因为我可以使用“ ==”来比较内部字符串,是否会遇到垃圾回收问题?内联字符串的垃圾回收机制与普通字符串有何不同? 问题答案: 实际上,这不是垃圾收集优化,而是字符串池优化。调用时,您用其基本引用(首次遇到此字符串的引用,如果尚不知道此引用,则为参考)替换对初始String的引用。 但是,一旦您的字符串不再在应用程序中使用,它将成为垃圾

  • 返回类似于:。我猜与的参数有关。我不明白是什么意思,使用的时间单位是什么?在这种情况下,它可能是微秒,但我也看到和作为单位;但是,我在文件中找不到解释。

  • 以下代码在使用JDK 8和JDK 9运行时有不同的结果。 在JDK 8(版本1.8.0_172)下,代码打印: 但是使用JDK 9(版本9.0.1),代码返回: 我已经检查了两个JDK版本,它们是正确的。为什么代码会产生不同的结果?我的程序有什么问题吗?

  • 问题内容: 我看到的唯一的void返回类型在方法中具有System.out.println语句。因此,一旦调用该方法,这些字符串就会被打印出来。 您是否可以使返回类型为字符串并让该字符串返回而不是执行void返回类型? 如果void返回类型方法中包含其他方法,您能否将返回类型设为该方法给出的值,该值将返回该方法的结果? 什么时候只能使用void返回类型? 问题答案: 有人可以解释Java中的voi

  • 在python 3.x中,通常使用函数的返回类型注释,例如: “void”类型的正确注释是什么? 我正在考虑三种选择:

  • 无法理解如何使用int类型的递归函数查找二叉查找树的高度的解释。 对于任何二元搜索树,给定一个指向树的根节点的指针,其中节点按常规定义如下。。。 我们可以使用以下int类型的递归函数来给出二元搜索树的高度。。。(函数“max”只取两个整数,并返回其中较大的一个) 我的理解是findHeight(根- 我对递归非常陌生,所以我决定只解压缩其中一个递归函数调用,并尝试理解它。我写了findHeight