String總結

題記:
一直自己對於String一類都只停留在會用,一般都是抱着“不管是黑貓白貓,能夠實現就是好”,沒有考慮爲什麼,以及效率;下面通過String的演變,來徹底的解決這一歷史遺留問題。
首先,String在JDK的解釋是 “Strings are constant; their values cannot be changed after they are created”也就是說String對象一旦被創建就是固定不變的了,這樣的一點好處就是可以多線程之間訪問,因爲只讀不寫(創建String對象時,需要查找常量池中是否存在此字符串,如果存在,則直接引用,所以有很的概率被多次訪問,進而被併發訪問的概率很大,僅僅是個人理解)。
一、String 創建的最常用的兩種方法

	String str1 = new String("abc");//創建了兩個String對象,一個是”abc”對象,存儲在常量空間中,一個是使用new關鍵字爲對象str1申請的空間(堆裏)。
	String str2 = "abc";//創建一個String對象,在常量空間中


解釋:常量池與堆空間
1.常量池(constant pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。它包括了關於類、方法、接口等中的常量,也包括字符串常量。
可以這樣理解,常量池就是用來保存在編譯階段確定好了大小的數據,一般我們定義的int等基本數據類型就保存在這裏。
	String s0=”kvill”;  
	String s1=”kvill”; 
 	String s2=”kv” + “ill”; 
 	System.out.println( s0==s1 ); 
	System.out.println( s0==s2 );  

輸出:


true
true

理解代碼:
首先,我們要知道Java會確保一個字符串常量只有一個拷貝。
因爲例子中的s0和s1中的”kvill”都是字符串常量,它們在編譯期就被確定了,所以s0==s1爲true;而”kv”和”ill”也都是字符串常量,當一個字符串由多個字符串常量連接而成時,它自己肯定也是字符串常量(字符串連接是在編譯階段就被確定的),所以s2也同樣在編譯期就被解析爲一個字符串常量,所以s2也是常量池中”kvill”的一個引用。所以我們得出s0==s1==s2;

2.堆棧區別(也就是在什麼情況下用堆,什麼情況下用棧)

核心區別是,棧中只能保存存儲空間在編譯階段就確定的,堆中空間可以動態的變化,(顯而易見,如果動態的變化,那麼開銷肯定比不變大的多,不信測試一把,見下代碼)


@Test
	public void testNew1()
	{
		String str1 = null;
		long start = System.currentTimeMillis();
		for(int i=0;i<10000000;i++)
		{
			str1 = "abc";//常量池(常量池可以看做事棧的一種表現)
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}
	
	@Test
	public void teatNew2()
	{
		String str1 = null;
		long start = System.currentTimeMillis();
		for(int i=0;i<10000000;i++)
		{
			str1 = new String("abc");
			//堆(有這樣的疑問,此處創建了兩個String對象,也就是說也在常量池中創建了String對象,按照運行時間270-7=263,此爲在堆中創建的對象時間)
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}


輸出:


7//testNew1()
270//testNew2()

解惑:

* 常量池與堆棧的關係及理解常量池,個人理解是棧的一種,性質和棧類似,但爲什麼會叫“常量池”而不是棧,(試着解釋一下)棧總放着是對象的引用(簡單理解就是放着對象的地址),而常量池中直接放着值,所以爲了區分就換了個名。

*爲什麼String s = new String()創建兩個對象據估計,當 “abc”創建對象時,首先是if(常量池中是否存在“abc”){}else{在常量池中創建“abc”};new在堆中分配空間,給s引用;(那問題又來了,這種解釋的話,常量池中創建的對象沒有啊)

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