標籤:9.png api com 開始 str 沒有 col abc 分享
1、基本類型和參考型別
在C語言裡面,是有指標這麼一個變數類型的,指標變數儲存的就是所要指向內容的地址。在Java裡面,沒有了指標的這麼個說法,而是換了一個詞:參考型別變數。
先說Java裡面的基本類型,所謂基本類型,很簡單,就是一個數字,一個字元或一個布爾值,數字裡麵包含整型、浮點型等,沒有什麼好說的。
再說這個參考型別,他的概念就很像指標了。引用變數的值指向記憶體空間的引用,就是C中的地址,所在這個地址裡面的內容就是要被他引用的對象。
2、String就是一個參考型別
大多數時候,我們在用String的時候,就是這麼用的:
String str = "balabala";
直接賦值,簡單易懂。
其實,還有下面的三種使用String的方式,利用API裡面的String構造方法:
String str = new String(char[] array);
array是一個字元數組,這就很形象了,在array裡面字元跟字元是分開的,需要array[i]來擷取。
通過String的這一個構造方法之後,將“字元”給“串”起來了,就變成了字串。
另外一種構造方式:
String str = new String(char[] array,int offset,int count);
array還是那個字元數組,offset是指數組中的某一個位置,count值數量,綜合的意思就是:將array數組中,從第offset個字元開始的,往後數count個字元的“子數組”,串成字串。
舉例:char[] array = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘};String str = new String(array,2,3);
此時str就是cde,數組從0開始數。
最後一個,最簡單:
String str = new String("abcdefg");
3、基本類型跟參考型別中“等號”的判斷區別
int a = 1; int b = 1; system.out.println(a == b);
輸出的是true,因為基本類型中,==是進行值的判斷。
String str1 = "abc";String str2 = "abc";system.out.println(str1 == str2);
輸出的是true,因為參考型別中,==也是進行值的判斷?
不,不是這樣的,雖然表面上看,好像是這樣,但其實不是的,在仔細看一下下面的例子:
String str1 = "abc";String str2 = new String("abc");system.out.println(str1 == str2);
這時輸出的就是false了,然而str1、str2的內容是一樣的,這是為什嗎?
這是因為,參考型別的"=="是進行地址值的判斷,判斷所引用的內容是不是是一個地址,是不是一個地方的。
所以,反過來說,若參考型別的"=="是false,那麼倆個參考型別的引用地址是不同的,這就引出了下面要說的內容了。
為什麼str1,str2的內容相同,但是是不同的呢?
4、直接賦值建立跟new String建立的區別
在2中說到了使用String的四種方式,1個直接賦值,3個new建立。
(1)String str1 = "abc";
上面的直接賦值,其實是分成三步的:
第一步,是將“abc”的這個字串內容在“堆”中建立出來。
第二步,將建立出來的“abc”的地址儲存在一個叫做“字串池”的東西裡面。
第三步,將“abc”的地址給str1(即str這個參考型別指向了abc這個字串所在的記憶體位址)
這時候,如果再來一個String str2 = "abc";
java會先去字串池定址尋找是否有這麼一個字串也叫“abc”,如果沒有,參見上面三步操作。很明顯,我們剛剛建立過,肯定能找到,然後將尋找得到的地址也賦給str2。
(2)String str1 = new String("abc");
當使用new的時候,不管內容是什麼,不會執行上面的三步,直接在堆中建立一個傳新版本的字串,將字串abc的地址(假設0x001)再給str1。
這時候再來一個:String str2 = new String("abc");則字串abc的地址(假設0x002)給str2。
(3)所以,直接賦值的string,如果值相同,那麼引用的地址也相同。
而,new出來的,不管值的內容相不相同,地址必然不同,這就是為什麼3裡面的str1==str2是false的原因了,來張圖:
Java中的String類型