深入理解String類

2021-10-05 14:51:52 字數 3892 閱讀 1291

string類代表的就是字串,string類物件建立之後不可變。

string str =

"hello"

;//方式1

string str2 =

newstring

("hello");

//方式2

char

array =

;//方式3

string str3 =

newstring

(array)

;

string str1 =

"hello"

;string str2 =

"hello"

;system.out.

println

(str1 == str2)

;//true

string str1 =

newstring

("hello");

string str2 =

newstring

("hello");

system.out.

println

(str1 == str2)

;//false

我們先來分析兩種建立字串的記憶體分布

這裡我們引入字串常量池,就是專門用來儲存字串常量,常量是不允許修改的,**中要有多次使用同乙個常量我們直接引用常量池裡面的,方便很多,不用再建立物件。

注意常量池在jdk1.7之前是在方法區裡面,jdk1.7之後,在堆裡面

對於字串的比較,由於字串是乙個引用型別,我們可以看出==比較的是位址,想要比較裡面的內容我們就要使用string類提供的equals方法.

string str1 =

newstring

("hello");

string str2 =

newstring

("hello");

system.out.

println

(str1.

equals

(str2));

//true

關於equals的使用:

system.out.

println

(str.

equals

(「hello」));

system.out.

println

("hello"

.equals

(str));

//我們經常使用的是第二種方式,因為如果str為空的話,第一種方式會丟擲異常,第二種輸出「false」

在string類中compareto()方法是乙個非常重要的方法,該方法返回乙個整型,該資料會根據大小關係返回三類內容:

相等:返回0.

小於:返回內容小於0.

大於:返回內容大於0

我們進一步理解string類儲存方式

string str1=

"abcdef"

; string str2=

newstring

("abcdef");

char

array=

; string str3=

newstring

(array)

; string str4=

"abc"

+"def"

;//編譯期間已經確定"abcdef"

手動入池

string str1=

"abcdef"

; string str2=

newstring

("abcdef"

);

對於這種情況,無疑產生了空間的浪費,我們可以採用string 的 intern 方法來手動把 string 物件加入到字串常量池中

string str1 =

newstring

("hello").

intern()

;string str2 =

"hello"

;system.out.

println

(str1 == str2)

;//true

字串不可變string 類的內部實現也是基於 char 來實現的, 但是 string 類並沒有提供 set 方法之類的來修改內部的字元陣列,如果一定要更改字串,我們可以利用反射

string str =

"hello"

;for

(int x =

0; x <

1000

; x++

)system.out.

println

(str)

;

對於這樣的**我們中間產生了太多的臨時物件,造成了空間的浪費。

為什麼 string 要不可變?

方便實現字串物件池. 如果 string 可變, 那麼物件池就需要考慮何時深拷貝字串的問題了.

不可變物件是執行緒安全的.

不可變物件更方便快取 hash code, 作為 key 時可以更高效的儲存到 hashmap 中.

剩下的就是方法的使用我們可以參考文件

JVM常量池與String類深入理解

建立乙個string有二種形式 第一種形式 string a abc string b abc a引用的字串存放在常量池中,當建立b引用的字串時,會先從常量池中查詢有沒有該字串,如果有,就返回常量池中的字串。如果沒有,就建立該字串物件並放在常量池中,因為字串非常常用,jvm為了提高效能和減少記憶體開...

深入理解MIDlet類

深入理解 midlet 類出自 在j2me 程式設計過程中,midlet 是最核心的類之一,熟悉該類的使用是 j2me 學習過程中必須首先掌握的類,下面就結合實際介紹一下該類的實際使用。眾所周知,j2me 程式都是從 midlet 類開始執行,系統規定了 midlet 的生命週期。規定 midlet...

Java String類深入理解

在這裡主要說一些string類的細節,易忽略的點,以及面試題 string s1 abc s1是乙個類型別變數,abc 是乙個物件。s1 ab 新建立了乙個物件,s1指向這個物件,原來的 abc 還在堆記憶體中。string s2 new string abc 不使用!建立了兩個物件 string ...