String.intern() 的作用是把字符串放入常量池
如果字符串存在于常量池,直接返回地址即可
如果字符串不在常量池:
在jdk7 以下版本是先把字符串复制到常量池区然后返回字符串在该区的地址
在jdk7及以上版本中则是直接把字符串的地址复制到常量池
之所以要这么做原因是 jdk7及以后的版本 把PermGen区放在了普通堆中,而常量池在PermGen区
所以
String a="i love ";
String b=a+"U";
b.intern()==b; //在jdk7 以下版本结果是 false 在jdk7及以上版本结果是 true
关于字符串在常量池的情况:
String a="123" ;//字符串直接存在了常量池 a是指向了常量池地址
String b=a+"456";//字符串动态生成的 变量 不在常量池
final String c="123-";
String d=c+"4567";// 字符串直接存在了常量池 d是直接指向了常量池的地址
常量池里有 "123" "456" "1231" "4567" "123-4567"