String -- 倆種實例化方式的區別

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方法效率更低,在開發中,通常使用第一種直接賦值的方法。





發佈了56 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章