1、String s1=s.intern();
/**
* 运行环境JDK1.8
* 1、s1=s.intern(); 这句代码在JDK1.7及以上
* 1)常量池中已经存在
* s啥也不做,还是指向堆空间中的字符串对象
* 2)常量池中不存在
* 常量池直接存储堆中的引用
*
* 2、String me = new String("我是拉格朗日");
* 生成常量池中的“我是拉格朗日” 和堆空间中的字符串对象。
*
* 3、String me = new String("我是")+ new String("拉格朗日");
* 不会在常量池创建“我是拉格朗日”
*
* 4、String s3 = new String("我是") + new String("拉格朗日");
* System.out.println(s3 == s4);
*
* String s4 = "我是拉格朗日"; s3.intern(); 这两句顺序不一样打印结果不一样
*
* String s4 = "我是拉格朗日";在前,打印false
* Why?因为此时常量池不存在,会直接在常量池创建一个新对象
*
* s3.intern(); 在前,打印true
* Why?因为此时常量池不存在,常量池直接存储堆中的引用,并不会创建新对象
* */
2、代码示例
public class MainTest {
public static void main(String[] args) {
// 运行环境JDK1.8
MainTest mainTest = new MainTest();
//mainTest.test();
//mainTest.test2();
//mainTest.test3();
//mainTest.test4();
}
public void test(){
String me = new String("我是")+ new String("拉格朗日");
//常量池不存在的情况
System.out.println(me.intern() == me); //打印true
System.out.println(me == "我是拉格朗日"); //打印true
}
public void test2(){
String me2 = "我是拉格朗日";
String me1 = new String("我是")+ new String("拉格朗日");
//常量池已经存在的情况
System.out.println(me1.intern() == me1); //打印false
System.out.println(me1 == "我是拉格朗日"); //打印false
}
public void test3(){
String me = new String("我是拉格朗日");
//常量池已经存在的情况
me.intern();
String me2 = "我是拉格朗日";
//JDK1.6打印false JDK1.7打印false
System.out.println(me == me2);
String me3 = new String("我是") + new String("2B");
//常量池不存在的情况
me3.intern();
String me4 = "我是2B";
//JDK1.6打印false JDK1.7打印true
System.out.println(me3 == me4);
}
public void test4(){
String me = new String("我是拉格朗日");
String me2 = "我是拉格朗日";
//常量池已经存在的情况
me.intern();
System.out.println(me == me2); //打印false
String me3 = new String("我是") + new String("2B");
String me4 = "我是2B";
//常量池已经存在的情况
me3.intern();
System.out.println(me3 == me4); //打印false
}
}
网友评论