深入理解intern

2022-07-17 06:06:15 字數 2105 閱讀 7974

首先來看jdk1.6

顯然jdk1.6及其以前版本常量池是放在 perm 區(屬於方法區)中的,熟悉jvm的話應該知道這是和堆區完全分開的。

1.6中intern方法的作用:

比如string s = new string("seu_calvin"),再呼叫s.intern(),此時返回值還是字串"seu_calvin",表面上看起來好像這個方法沒什麼用處。但實際上,在jdk1.6中它做了個小動作:檢查字串池裡是否存在"seu_calvin"這麼乙個字串,如果存在,就返回池裡的字串;如果不存在,該方法會把"seu_calvin"新增到字串池中,然後再返回它的引用。

string s = new string("1");

s.intern();

string s2 = "1";

system.out.println(s ==s2);

string s3 = new string("1") + new string("1");

s3.intern();

string s4 = "11";

system.out.println(s3 == s4);

那麼來看這段**

使用引號宣告的字串都是會直接在字串常量池中生成的,而 new 出來的 string 物件是放在堆空間中的。所以兩者的記憶體位址肯定是不相同的,即使呼叫了intern()方法也是不影響的。

所以兩個都是false

然後jdk1.7及其以後版本

還是剛才的**

string s = new string("1");

s.intern();

string s2 = "1";

system.out.println(s == s2);

string s3 = new string("1") + new string("1");

s3.intern();

string s4 = "11";

system.out.println(s3 == s4);

結果是在jdk1.7以及以後版本中答案卻是false true

第一到四行**執行過程:

第一行:new string(「1」) 中的「1」,那麼首先檢查常量池是否有「1」,如果沒有則在堆上建立「1」,並將堆上「1」的引用新增到常量池,如果有,則堆上新建「1」儲存常量池「1」的引用

然後new string 則在堆上建立另乙個不同於第乙個在堆上「1」的「1」,並將棧上的s指向該1

第二行:檢查常量池中是否有「1」,如果沒有就將s指向堆中的「1」的引用存入常量池,如果有返回常量池「1」的引用

string s2=「1」引用賦值,則直接檢查常量池中是否有1,如果有則s2指向常量池中的1(即堆中的第乙個「1」)                  若沒有則在堆上建立「1」,並將常量池存入該「1」的引用

顯然s2指向的是之前new string(「1」)中的1(堆中的第乙個「1」)

第四步   s指向的是堆中第二個「1」 s2指向堆中第乙個「1」   固為false

第四行到第8行**分析:

第一行:堆上先建乙個「1」 ,其引用至常量池   s3指向堆中「11」 此時常量池只有「1」,無「11」

s3.intern()將s3的「11」引用加入到常量池中

s4=「11」檢查常量池是否有11  如果有(常量池中的「11」)為s3的引用

則將s4指向常量池中的「11」(就是s3) 所以s3=s4

但需要注意以下

string s1 = new string("1") + new string("1")    (變數+...)和string s2 = "1"+"1"(常量加常量)不同

s1在賦值階段 呼叫stringbuilder在堆上建立物件。  而s2是檢查常量池,從而決定在堆上建立還是直接引用常量池中的變數

final修飾的串,final修飾的串在編譯時就會被替換成常量(即 final s1就看成「11」常量)

**部分來自:

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...