JAVA字符串
JAVA中会经常用到字符串,字符串存放与字符串常量池。同一个字符串常量,在常量池只有一份副本。
通过双引号声明的字符串,直接保存在常量池。
如果是String对象,可以通过String.intern方法,把字符串常量保存到常量池。
JAVA中关于intern的面试题
String s = new String("rumenz.com");
s.intern();
String s2 = "rumenz.com";
System.out.println(s == s2);
String s3 = new String("rumenz") + new String(".com");
s3.intern();
String s4 = "rumenz.com";
System.out.println(s3 == s4);
结果
JDK1.6以及以下:false false
JDK1.7以及以上:false true
结果分析
① JDK1.6中将字符串常量存放于永久带的常量池中。永久带和堆是物理隔离的。当调用s.intern()时,如果常量池不存在"rumenz.com" ,就直接在永久带创建一个"rumenz.com"
② JDK1.7中字符串常量池在堆中。当调用s.intern()时,如果常量池不存在"rumenz.com",直接存储堆中的引用。
String s = new String("rumenz.com"); //生成常量池中的"rumenz.com"和堆中的字符串对象
s.intern(); //先查常量池存不存在"rumenz.com",如果不存在就生成"rumenz.com",jdk1.6和jdk1.7有区别 ① ②
String s2 = "rumenz.com"; //直接在常量区生成"rumenz.com"
System.out.println(s == s2);
String s3 = new String("rumenz") + new String(".com");
//常量区分别生成"rumenz"和".com",堆区生成s3对象,值为"rumenz.com",注意此时常量区并没有"rumenz.com"
s3.intern();//常量区生成"rumenz.com"
String s4 = "rumenz.com"; //jdk1.6直接返回"rumenz.com" ,jdk1.7后则返回对s3的引用
System.out.println(s3 == s4);