String有倆種實例化方式:
1.通過直接賦值:String str1 = "A";
2.通過new方法: String str2 = new String("A");
下面來看一段簡單的代碼:
public class String1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "A";
String s2 = "A";
String s3 = new String("A");
System.out.println("s1==s2 -- "+ (s1==s2));
System.out.println("s1==s3 -- "+ (s1==s3));
System.out.println("s2==s3 -- "+ (s2==s3));
}
}
打印出來的log:
s1==s2 -- true
s1==s3 -- false
s2==s3 -- false
“==”是進行數值的比較,即s1/s2/s3的指向堆內存地址值的比較。
1.首先分析爲什麼s1==s2
String s1 = "A"; 其實就是開闢一個新的內存空間存放“A”,讓s1指向這塊內存空間;
String s2 = "A";因爲堆內存空間已經有了字符串“A”,所以不會再開闢新的內存空間,此時s2也是指向這塊內存空間;
總結:當String採用直接賦值的方式後,只要以後聲明的字符串內容相同,都不會開闢新的堆內存空間。
2.分析爲什麼s1!=s3
String s3 = new String("A"); 用new方法就是開闢一個新的堆內存空間存放字符串“A”,故s1 和 s3 指向的堆內存空間不一樣。
但是用new的方法,會開闢倆個內存空間,第一個是垃圾空間,會被回收, 第二個纔是new關鍵字開闢的空間。
相比第一種直接賦值方法,new方法效率更低,在開發中,通常使用第一種直接賦值的方法。