**关于字符串创建对象与intern的解析**
import org.junit.jupiter.api.Test;
public class Stringclass {
public static void main(String[] args) {
}
/** new String()解析**/
@Test
public void newString() {
/**String string_1=new String("LR")
* 创建两个对象 1:字符串常量池"LR"
* 2:new出来的堆空间对象**/
String string_1 = new String("LR");
String string_2 = "LR";
/** string_1==string_2:false**/
System.out.println("string_1==string_2:false=" + (string_1 == string_2));
/** 涉及运算字面量与非字面量**/
/** 字面量的运算结果如果常量池中存在 则不创建对象 注意是字面量 **/
String string_3 = "L" + "R";
System.out.println("string_3==string_2:ture=" + (string_3 == string_2));
String string_4 = "L";
/** string_4 不是字面量 运算则是StringBuild构成
* 对象:1 字符串常量池:"L"
* 2 new StringBuild 对象
* 3 字符串常量池 :"R"
* 4 toString 对象:"LR" 堆空间中**/
String string_5 = string_4 + "R";
/** string_5 堆空间对象1
* string_1 堆空间对象2
* string_2 字符串对象3
* **/
System.out.println("string_5==string_1:false=" + (string_5 == string_1));
System.out.println("string_5==string_2:false=" + (string_5 == string_2));
/** final修饰**/
final String string_6 = "L";
/** 被final修饰后的运算 和字面量运算一样**/
String string_7 = string_6 + "R";
System.out.println("string_7==string_2:true=" + (string_7 == string_2));
/**注意个细节: 打印false +运算高于== 先加在== 结果输出false**/
System.out.println("string_7==string_2:true=" + string_7 == string_2);
/* * 正确写法 **/
System.out.println("string_7==string_2:true=" + (string_7 == string_2));
}
/**
* intern()方法解析
**/
@Test
public void intern() {
/**字符串常量池已经存在字符**/
String a = new String("hello");//创建两个对象 存在字符串常量池中和堆空间中
String b = "hello";//返回的是上一行代码产生的"hello" 存在字符串常量池
a.intern();//是整个值返回的对象 a对象指向不会改变 所以字符串常量池字符存在的话这条语句等于没用
System.out.println("一个堆a一个字符串常量池b a==b 结果:false=" + (a == b));
System.out.println("由于字符串中已经存在 a.intern()返回字符串常量池内容 1.6和1.7一样 a.intern()==b 结果:true=" + (a.intern() == b));
System.out.println("证明a指向堆没有变 a==b 结果:false=" + (a == b));
/** 字符串常量池中不存在字符时 1.6和1.7版本的区别 1.6将堆空间对象复制一份 1.7将堆空间对象地址复制一份**/
/**加法运算 等于new StringBuild().append("ba").append("cd").toString
* toString 方法等于new String() 但是字符串常量池中不会生成 "bacd"**/
String c = new String("ba") + new String("cd");
/** 对象1:"new Sting("ba");
* 对象2:"new Sting("cd");
* 对象3:"ba" 字符串常量池
* 对象4:"cd" 字符串常量池
* 对象5:"new StingBuild();
* 对象6:"toString= new String(); "bacd"在堆里**/
System.out.println("c.intern()返回一定是字符串常量池里面的字符 " +
"1.6复制一份就是两个对象 1.6结果:false " +
" 1.7复制地址 1.7结果:true= " + (c.intern() == c));
}
}