String.intern()函数
环境:JDK1.8
测试代码:
public static void main(String[] args) {
String s1 = new StringBuilder("go").append("od").toString();
System.out.println(s1.intern() == s1);
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2);
}
结果:true false
分析:s1和s2开始通过new StringBuilder创建的时候肯定在堆里,s1.intern()字符串常量池取当前字符,肯定没有,但是Java8做了优化,直接在常量池保存当前对象的指针,所以相等,然而s2.intern()去字符串常量池取的"java"字符,这是本来就内置在常量池里面的字符串,所以不相等。上面代码在不同JDK版本中的结果可能不太一样。
下面我把上面的代码稍微改动:看看结果有什么不一样
public static void main(String[] args) {
String s1 = "go" + "od";
System.out.println(s1.intern() == s1);
String s2 = "ja" + "va";
System.out.println(s2.intern() == s2);
}
结果:true true
分析:上面代码String s1 = "go" + "od"其实经过编译器优化后等同于String s1 = "good",s2道理一样,通过下图字节码证实我的话,都是在字符串常量池取的字符串,所以为true。

Java字节码指令含义:http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html
=========================================================================================================================================
我只是一粒简单的石子,未曾想掀起惊涛骇浪,也不愿随波逐流
每个人都很渺小,努力做自己,不虚度光阴,做真实的自己,无论是否到达目标点,既然选择了出发,便勇往直前
我不能保证所有的东西都是对的,但都是能力范围内的深思熟虑和反复斟酌

浙公网安备 33010602011771号