JVM中String的處理,intern 的實質

2021-08-27 17:00:04 字數 1172 閱讀 5892

1.jvm維護一張[color=darkred][b]常量池的[/b][/color]hash表,這個hash表是對應常量池的,屬於棧記憶體。

string str2 = new string("abc");

string str1 = "abc";

system.out.println(str2 == str2.intern()); //false

system.out.println(str1 == str2.intern()); //true

system.out.println(str1.intern() == str2); //false

2.字面量賦值會自動隱式呼叫intern(),所以

string str1 = "abc";

string str2 = "abc";

string str3 = "abc";

system.out.println(str1 == str2); //true

system.out.println(str2 == str3); //true

這個"abc"是在常量池,屬於棧記憶體,所謂棧中資料共享。共享的依據是jvm維護的對應常量池的hash表。

3.==和equal的差異也在這其中,new出來的東東,都在堆記憶體上。值可以相等,位址可以不相等。

4.以上三點,可以推廣到基本資料型別和對應包裝類。

5.我為什麼寫這篇文章:

string str1 = new string("abc");

string str2 = "abc"

str1是乙個引用,在棧中;str2也被是乙個引用,也在棧中;而我先前一知半解的知道intern方法,但是不清楚intern是對應常量池的hash表,所以產生先new出來的物件,後字面量賦值,str2為什麼不指向new的東西的疑惑。好繞,其實我想說得就是:

通過new建立的物件的引用通過intern可以指向常量池中的物件。改變的是引用的指向,字串abc有兩個位址,因為分別用了new和字面量。

也就是節省記憶體一說。

舉個例子,讀輸入流,相同的字串只存一次輸出,這個就可以用intern。

JVM全面分析之String

目錄string 的string pool是乙個固定大小的hashtable,預設值大小長度是1009.如果放進string pool的string非常多,就會造成hash衝突嚴重,從而導致鍊錶會很長,而鍊錶長了後直接會造成的影響就是當呼叫string.intern時效能會大幅下降。使用 xx st...

string物件中字元的處理

經常要對string物件中的單個字元進行處理,如某個特殊字元是否為空白字元 字母或數字。以下各種字元操作函式,適用於string物件的字元 或其他任何char值 這些函式定義在cctype標頭檔案中 isalnum c 如果c是字母或數字,則為true isalpha c 字母 iscntrl c ...

處理string物件中的字元

1 範圍for string word helloworld for auto a word a為單個字元 如果需要對字元進行修改要加上引用 for auto a word a x 上面就把word裡面的所有字元替換為了x2 下標運算子 看成陣列 3 迭代器 isalnum c 字母或數字為真 is...