1. new String 与 “” 创建对象的区别
String s1 = new String("123");
String s2 = "123";
第一个创建1~2个,第二个创建0-1个,当常量池中没有123时,第一个会在堆中和常量池中各创建一个,当常量池中存在123时,第一个则只会在堆中创建,而第二个则直接指向常量池中的123,不进行创建
2. 对于他们之间的比较判断
String s1 = "123";
String s2 = "123";
String s3 = new String("123");
String s4 = new String("123");
String s5 = "12" + "3";
String d = "3";
String s6 = "12" + d;
System.out.println(s1 == s2); true 都指向常量池中的123 值相等
System.out.println(s1 == s3); false 一个指向常量池中的值,一个指向堆地址
System.out.println(s3 == s4); false 两个值相等,但是==比较的是他们堆中的地址是否相等
System.out.println(s1 == s5); true 都是指向常量池中的值
System.out.println(s1 == s6); false 第一个指向的是常量池中的值,第二个指向的是堆中的地址
总结:
new String () 不仅需要在常量池中创建,还需要再堆中创建
""只在常量池创建值并指向