java - String.intern() 如何工作

标签 java string

package com.zhb.jvm;

/**
 * 
 * @author zhb
 *
 */
public class RuntimeConstantPoolOOM {
    public static void main(String[] args){

        String str1 = "abc";
        System.out.println(str1.intern() == str1);    //true
        String str2 = new String("abcd");
        System.out.println(str2.intern() == str2);    //false

        String str3 =new StringBuilder("math").append("analyze").toString();
        System.out.println(str3.intern() == str3);    //true

        String str4 =new StringBuilder("computer").append("software").toString();
        System.out.println(str4.intern() == str4);    //true

        String str5 =new StringBuilder("jav").append("a").toString();
        System.out.println(str5.intern() == str5);    //false
    }

}

首先我们可以知道intern()方法的定义。 intern 的定义:当调用 intern 方法时,如果池中已包含由 equals(Object) 方法确定的等于 thisString 对象的字符串,则返回池中的字符串。否则,将 thisString 对象添加到池中,并返回对此 String 对象的引用。

str1.intern == str1 为真。这很容易理解。 str2.intern() == str2 这个通过方法的定义也很容易理解。 但为什么 str3.intern() == str3 是 true。事实上,我认为根据定义它是 false。 相反,str5.intern() == str5 为 false。 我在终端中运行命令 java版本 java版本“1.7.0_40” Java(TM) SE 运行时环境(版本 1.7.0_40-b43) Java HotSpot(TM) 64 位服务器 VM(内部版本 24.0-b56,混合模式)

我想得到正确的答案,非常感谢!

最佳答案

why str3.intern() == str3 is true

因为,正如你所说:

Otherwise, thisString object is added to the pool and a reference to this String object is returned.

你就是这种情况。该池尚不包含 str3(即“mathanalyze”)。因此str3被添加到池中并返回。

对于 str5,您处于另一种情况:

if the pool already contains a string equal to thisString object as determined by the equals(Object) method, then the string from the pool is returned

因此,当您的代码执行时,池中已经包含字符串“java”,这并不奇怪,因为 java 是所有标准类的顶级包的名称,也是用于启动 JVM 的可执行文件。在执行 main 方法之前引导应用程序并加载类的代码中很有可能使用文字字符串“java”。

关于java - String.intern() 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26075658/

相关文章:

java - url连接问题

c - 是否可以在不知道c中数组长度的情况下使用gets?

C编程 "weird output"

sql-server - 如何在 SQL Server 2008 中设置字符串自定义格式

c - 对变量的赋值在完全不相关的函数中给出了段错误

java - 如何在 Android 上使用文件描述符获取文件路径?

java - 尽管我设置了自己的 logging.properties,但所有内容仍会记录到 catalina.out。如何停止?

PHP 打印/回显后退箭头错误

java - 通过从丢失的下拉列表中选择新值来更改值时的 JComboBox 事件

java - 我从 Java Html 5 Web 应用程序返回什么来播放带有音频控制标签的声音文件