關於String定義賦值的部分問題

2021-10-12 20:03:45 字數 1074 閱讀 7367

①string為什麼是不可變的?或者說為什麼string使用final修飾?

string字串建立時實際上是建立了乙個不可變的char陣列,指定著唯一的引用位址,當我們對string字串進行修改重新賦值時,我們看到的結果是字串的值改變了,但是對於底層來說,相當於重新new了乙個string,引用位址變了,就是我看著還是我,其實我已不是我的概念。所以使用final修飾是為了讓string不可被繼承,如果繼承string的子類可能會對string的原有語義進行修改,導致可能出現的執行緒或其他安全問題。而且其實在**中private final byte value;不可變的關鍵不是final的修飾,final更多的是保證string不可被繼承,private的作用可能更大一些。

②string的底層結構?

底層是char陣列。

③string字串和string物件的區別?

string字串存放在常量池中,string物件存放在堆疊中,在建立字串時,jvm會先檢視常量池中是否已經有了該字串,如果有了直接引用,沒有建立並指定引用位址。而string物件每次都是new的過程。

④怎麼改變string的值??

繼續第乙個問題,我們說到string是不可變的,那麼這個結論是絕對的嗎?按照大多數情況世界上沒有絕對的事情,我們這裡當然也是這樣。我們要在更改string的值,我們之前說過string的底層是char陣列,而真正不可變的實際上是我們的引用位址,實際上我們做的就是在不改變引用位址的情況下改變char陣列的值就可以了。如果我們重新賦值一定會改變hashcode的值,所有string本身肯定做不到更改的,所以我們要考慮外力,能到達到目的的我們很容易想到的就是反射,反射是反常態的侵入式手段,我們可以使用反射在類中獲取到string物件,完成對char陣列的值的更改。

寄語:大鵬一日同風起,扶搖直上九萬里。

作者筆錄:諸君既有登天攬月之志,即無高踏之台給吾上乎?然今高踏之台,如池塘戲魚蝦之流,食飢之道,非吾之願也。吾之志,上可登臨望月辰,下可臨淵觀蛟龍,月辰不可觸,亦上而撫之,蛟龍不可戲,亦下而降之。諸君年少乎?若年少,不可貪於池塘斤斤肥魚而步不離,望北冥浩瀚而卻步。守而魚之,終有盡時,不若動而漁之,無窮盡矣。非乎?亦持老驥伏櫪之心,漢昇壯哉之志。吾之志,有其心而動,諸君共勉。

String賦值的方式比較

string的賦值原則 1 new方式賦值的話,首先到pool中查詢是否有相應的值,假如沒有,在pool中建立這個物件 有的話,就到堆中例項化該物件,然後返回物件記憶體位址。2 字面值方式賦值的話,直接在pool中查詢,假如有的話,返回該物件 沒有的話,在pool中建立這個物件。例項1 結果 fal...

String類賦值的理解

string str 123 str abc 怎麼理解以上 先看下下這個例子 int a 5 a 4 這段 的意思是,申請乙個記憶體單元,命名為a,同時把5存到記憶體單元,然後又把4存到記憶體單元內,也就是說現在名為a 的記憶體單元的內容在被重新賦值後修改了 string str 123 str a...

String類的獲取功能(部分)

package mystring string類的獲取功能 int length 獲取字串的長度,其實也就是字元個數 char charat int index 獲取指定索引的字元 int indexof string str 獲取str在字串物件中第一次出現的索引 如果在字串物件中查詢不到該str...