方式一:String a = “aaa” ;
方式二:String b = new String(“aaa”);
兩種方式都能創建字符串對象,但方式一要比方式二更優。
因爲字符串是保存在常量池中的,而通過new創建的對象會存放在堆內存中。
如果常量池中已經有字符串常量”aaa”
通過方式一創建對象,程序運行時會在常量池中查找”aaa”字符串,將找到的“aaa”字符串的地址賦給a。
通過方式二創建對象,無論常量池中有沒有”aaa”字符串,程序都會在堆內存中開闢一片新空間存放新對象。
如果常量池中沒有字符串常量”aaa”
通過方式一創建對象,程序運行時會將”aaa”字符串放進常量池,再將其地址賦給a。
通過方式二創建對象,程序會在堆內存中開闢一片新空間存放新對象,同時會將”aaa”字符串放入常量池,相當於創建了兩個對象。
測試:
public class StringNewTest {
public static void main(String[] args) {
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
System.out.println("a==b:"+(a == b));
System.out.println("a==c:"+(a == c));
System.out.println("a與b的值相等:"+(a.equals(c)));
}
}
結果:
a==b:true
a==c:false
a與b的值相等:true
這裏==判斷的是地址