java trick--String.intern()
JAVA2 分钟读完 (大约291个字) 《深入理解 java 虚拟机》第二版中对 String.intern()
方法的讲解中所举的例子非常有意思
不了解 String.intern() 的朋友要理解他其实也很容易,它返回的是一个字符串在字符串常亮池中的引用。直接看下面的 demo
1 2 3 4 5 6 7 8 9 10 11
| public class Main { public static void main(String[] args) { String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern() == str1);
<!-- more -->
String str2 = new StringBuilder("ja").append("va").toString(); System.out.println(str2.intern() == str2); } }
|
两者输出的结果如下:
我用的 jdk 版本为 Oracle JDK7u45
。简单来说,就是一个很奇怪的现象,为什么 java
这个字符串在类加载之前就已经加载到常量池了?
我在知乎找到了具体的说明,如下:
1 2 3 4 5 6 7 8 9 10 11
| 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 的实现会在类加载时先调用:
1 2 3 4 5 6 7 8 9
| public final class System{ ... private static void initializeSystemClass() { ... sun.misc.Version.init(); ... } ... }
|
原来是 sun.misc.Version 这个类在起作用。