首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.intern()如何工作

String.intern()如何工作
EN

Stack Overflow用户
提问于 2014-09-27 14:27:50
回答 4查看 182关注 0票数 0
代码语言:javascript
复制
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方法时,如果池中已经包含了一个等于thisString对象的字符串,则返回来自这个池的字符串。否则,将thisString对象添加到池中,并返回对此字符串对象的引用。

实习生== str1是真的。这很容易理解。str2.intern() == str2 --这个方法的定义也很容易理解。但是,为什么str3.intern() == str3是true.in事实,我认为定义是错误的。相反,str5.intern() == str5是假的。我在终端java -version java版本"1.7.0_40“1.7.0_40(TM) SE运行时环境(build 1.7.0_40-b43)中运行命令,Java HotSpot(TM) 64位服务器VM (build 24.0-b56,混合模式)

我非常想得到正确的answer.thank你!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-27 14:42:26

为什么str3.intern() == str3是真的

因为,就像你说的:

否则,将thisString对象添加到池中,并返回对此字符串对象的引用。

你在这种情况下。池还不包含str3 (即“数学分析”)。因此,str3被添加到池中并返回。

对于str5,则是另一种情况:

如果池中已经包含了一个等于thisString对象的字符串,则返回池中的字符串。

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

票数 1
EN

Stack Overflow用户

发布于 2014-09-27 14:42:27

在我看来,我认为字符串"java"在池中是默认的。实际上,当您在str3上调用intern()时,这个单词还没有在池中,所以它被添加了,返回的引用是str3 (没有创建新的对象),所以测试给出了真。相反,"java"已经在池中,因此它返回池中对象的引用,这与str5的引用不同。

请注意,不仅对"java",而且对所有单个字符,您都将观察到相同的行为。

票数 1
EN

Stack Overflow用户

发布于 2014-09-27 14:40:53

测试foo.intern() == foo是一种测量foo在调用intern()之前是否已经在池中的方法。因此,str3.intern() == str3意味着str3还没有在池中。就这样。

运行时的某个地方可能有一个常量字符串"java",在复制之前加载到池中,这就是为什么str5.intern() != str5

下面是我在迎接OpenJDK 8源代码时发现的最明显的情况:

代码语言:javascript
复制
./com/sun/beans/decoder/DocumentHandler.java:        setElementHandler("java", JavaElementHandler.class); // NON-NLS: the element name
./com/sun/tools/example/debug/gui/JDBMenuBar.java:        JDBFileFilter filter = new JDBFileFilter("java", "Java source code");
./com/sun/tools/jdi/SunCommandLineLauncher.java:                "java",
./sun/launcher/LauncherHelper.java:                (progname == null) ? "java" : progname ));
./sun/rmi/server/Activation.java:                        File.separator + "bin" + File.separator + "java";
./sun/rmi/server/Activation.java:                    command[0] = "java";
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26075658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档