原始碼分析 String物件真的不可變嗎?

2021-07-31 05:32:42 字數 1302 閱讀 5049

如果乙個物件,在它建立完成之後,不能再改變它的狀態,那麼這個物件就是不可變的。不能改變狀態的意思是,不能改變物件內的成員變數,包括基本資料型別的值不能改變,引用型別的變數不能指向其他的物件,引用型別指向的物件的狀態也不能改變。

jdk1.7中string類的原始碼:

public

final

class

string

implements

serializable, comparable

, charsequence catch (exception e)

}}

列印結果:

str: owen chan

str: owen_chan

在這個過程中,str 始終引用的同乙個string物件,但是再反射前後,這個string物件發生了變化, 也就是說,通過反射是可以修改所謂的「不可變」物件的。這個反射的例項還可以說明乙個問題:如果乙個物件,他組合的其他物件的狀態是可以改變的,那麼這個物件很可能不是不可變物件。例如乙個car物件,它組合了乙個wheel物件,雖然這個wheel物件宣告成了private final 的,但是這個wheel物件內部的狀態可以改變, 那麼就不能很好的保證car物件不可變。

private final static

int array = new

int ;

public

static

void

main(string args)

array[1]:4

public

static

void

main(string args) catch (exception e)

}

列印結果:
str1 == str2 : true

str1 == strnew : false

str2 == strnew : false

str1: hello_world

str2: hello_world

strnew: hello_world

分析:

string str1=」hello world」; 和str2都是在常量池裡,指向同乙個物件。所以str和str2是同乙個物件,new string這個是在堆裡。strnew與其他兩個不是同乙個物件。關於後面反射機制修改了str1的值,strnew和str2的值也同步修改了。不管修改哪乙個都會全部修改,所以應該可能是new的時候,查詢了常量池是否存在這個資料,如果存在new出來是乙個指向指標的指標

String原始碼分析

前言 string類在日常開發過程中使用頻率非常高,平時大家可能看過string的原始碼,但是真的認真了解過它麼,筆者在一次筆試過程中要求寫出string的equals方法,瞬間有點懵逼,憑著大致的理解,算是寫出來了,可是下來一翻string的原始碼頓悟,原來自己寫得是多麼的low,所以有必要把這些...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...

STL原始碼分析 string

從定義可知,string其實是base string的特化類,string使用預設的記憶體分配器 stl default allocator chart template class alloc stl default allocator chart class basic string typed...