深剖字符串常量池、字符串字面量、字符串对象和引用间关系
利用字面量的形式创建字符串,首先会根据字面量的具体值到字符串常量池去找是否存在以该字面量为值的字符串对象,有则返回引用,无则向字符串常量池中添加以该字面量为值的字符串对象,new String(“123”)的形式,123为字面量,先根据字面量的具体值到字符串常量池去找是否存在以该字面量为值的字符串对象,无则向字符串常量池中添加以该字面量为值的字符串对象,再在堆中创建以该字面量为值的字符串对象,返回堆中对象的引用。
JDK1.8API文档描述:
//案例1:
// String str2 = "abcabc";
// String str1 = new String("abc") + new String("abc");
// String str4 = str1.intern();
//案例2:
/* 字面量"abc",在字符串常量池中没有"abc"对象,就在字符串常量池中创建"abc"对象,
* 同时在堆中new一个"abc"对象,str2指向堆中的那个对象,两个对象是不同的对象 */
// String str2 = new String("abc");
/* 字面量"abc",在字符串常量池中有"abc"对象,就不在字符串常量池中创建"abc"对象,
* 只在在堆中new一个"abc"对象,str1指向堆中的那个对象 */
// String str1 = new String("abc");
/* 变量+变量,只在堆中生成了"abcabc"字符串对象,str3指向堆中的那个对象 */
// String str3=str1+str2;
// 在常量池中没有找到abcabc对象,在字符串常量池中生成abcabc对象,str7指向abcabc对象
// String str7="abcabc";
// 在在常量池中找到abcabc实例,返回abcabc实例的引用,str4就指向字符串常量池中abcabc对象
// String str4=str3.intern();
// System.out.println(str3==str4);
// System.out.println(str7==str4);
// false,true
//案例3:
// String str2 = new String("abc");
// String str1 = new String("abc");
/* str1+str2没有创建两个abcabc实例对象,只创建了以str4为引用的实例对象abcabc实例(在堆中生成),
* 并没有创建了在常量池中的实例对象,str3指向堆中的那个对象 */
// String str3=str1+str2;
// str3.intern()在常量池中没有找到abcabc实例,创建"abcabc"对象添加常量池,返回引用给str4
// String str4=str3.intern();
// 在常量池中找到abcabc实例,str7指向池中的"abcabc"对象
// String str7="abcabc";
// System.out.println(str3==str4);
// true
版权声明:本文为m0_48333563原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。