1. 程式人生 > >Java中的String類型

Java中的String類型

一個地方 位置 不同 sys 原因 als 地方 但是 操作

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類型