Java中的String類型
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類型