String的intern 方法及面試題

2021-10-23 12:58:25 字數 1152 閱讀 4827

intern()的使用

intern是乙個native方法,呼叫的是底層c的方法

字串池最初是空的,由string類私有地維護。在呼叫intern方法時,如果池中已經包含了由equals(object)方法確定的與該字串物件相等的字串,則返回池中的字串。否則,該字串物件將被新增到池中,並返回對該字串物件的引用。

如果不是用雙引號宣告的string物件,可以使用string提供的intern方法:intern方法會從字串常量池中查詢當前字串是否存在,若不存在就會將當 前字串放入常量池中。

比如:

string myinfo = new string("i love atguigu").intern();
也就是說,如果在任意字串上呼叫string.intern方法,那麼其返回結果所指向的那個類例項,必須和直接以常量形式出現的字串例項完全相同。因此,下列表示式的值必定是true

("a"+"b"+"c").intern()=="abc"
通俗點講,interned string就是確保字串在記憶體裡只有乙份拷貝,這樣可以節約記憶體空間,加快字串操作任務的執行速度。注意,這個值會被存放在字串內部池(string intern pool)

public

class

testx

}

1.該段**在jdk6中輸出為false,在jdk7/8中輸出為true

2.因為jdk1.6中,將這個字串物件嘗試放入串池。

jdk1.7起,將這個字串物件嘗試放入串池。

把物件變為了物件引用位址

3.在jdk7/8中,這裡使用了intern(),相當於在堆存放了new string(「11」)的引用位址,

而s4用雙引號定義後,就會在常量池中尋找到該引用位址,然後指向該引用位址,然後該引用位址又指向new string(「11」)的位址。而s3則直接指向該new string(「11」),s3和s4的實際位址相同,所以輸出為true

在jdk6中,使用了intern,相當於又在字串常量池中建立了乙個new string(「11」),那麼s4就會指向字串常量池中的new string(「11」),而s3指向的是原本字串常量池外的new string(「11」),那麼此時他們實際位址不同,所以輸出為false

String拓展 intern 方法

string s1 new string 1 new string 1 s1變數記錄的位址為 new string s1.intern 在字串常量池中生成 11 如何理解 jdk6 建立了乙個新的物件 11 也就有新的位址 jdk7 此時常量池中並沒有建立 11 而是建立了乙個指向堆空間中new s...

String中intern的方法

首先檢視官方api那個的解釋 intern public stringintern 返回字串物件的規範化表示形式。乙個初始時為空的字串池,它由類 string 私有地維護。當呼叫 intern 方法時,如果池已經包含乙個等於此 string 物件的字串 該物件由 equals object 方法確定...

String中intern的方法

intern public string intern 返回字串物件的規範化表示形式。乙個初始時為空的字串池,它由類 string 私有地維護。當呼叫 intern 方法時,如果池已經包含乙個等於此 string 物件的字串 該物件由 equals object 方法確定 則返回池中的字串。否則,將...