java trick--String.intern()

来源:互联网 发布:网络正常下载速度很慢 编辑:程序博客网 时间:2024/06/04 18:41

《深入理解java虚拟机》第二版中对String.intern()方法的讲解中所举的例子非常有意思

不了解String.intern()的朋友要理解他其实也很容易,它返回的是一个字符串在字符串常亮池中的引用。直接看下面的demo

public class Main {    public static void main(String[] args) {        String str1 = new StringBuilder("计算机").append("软件").toString();        System.out.println(str1.intern() == str1);        String str2 = new StringBuilder("ja").append("va").toString();        System.out.println(str2.intern() == str2);    }}

两者输出的结果如下:

truefalse

我用的jdk版本为Oracle JDK7u45。简单来说,就是一个很奇怪的现象,为什么java这个字符串在类加载之前就已经加载到常量池了?

我在知乎找到了具体的说明,如下:

package sun.misc;import java.io.PrintStream;public class Version {    private static final String launcher_name = "java";    private static final String java_version = "1.7.0_79";    private static final String java_runtime_name = "Java(TM) SE Runtime Environment";    private static final String java_runtime_version = "1.7.0_79-b15";    ...}

而HotSpot JVM的实现会在类加载时先调用:

public final class System{        ... private static void initializeSystemClass() {        ...        sun.misc.Version.init();        ...    }        ...}

是sun.misc.Version这个类在起作用

0 0
原创粉丝点击