了解intern ,了解字串常量池

2021-08-31 01:18:18 字數 1766 閱讀 9632

intern()是string乙個api,平時不常用,但是面試可能會考,掌握intern可避免被面試官問到時大眼瞪小眼的尷尬局面。

當乙個string物件呼叫intern()方法時,會首先檢查字串常量池中是否存在equals相等的字串,若存在直接返回常量池中該字串物件,否則建立該字串物件並放入字串常量池。

然而並不是所有建立的字串都會進入常量池。下面直接貼**,每行**都通過備註的形式給出了執行結果和相關解釋。

string a = new string("ab"); //開闢新的堆記憶體,存放字串物件"ab",引用為 a,同時"ab"進入字串常量池

string b = new string("ab"); //開闢新的堆記憶體,存放字串物件"ab",引用為 b,同時"ab"指向字串常量池已有的物件

string c = "ab"; //未開闢新的堆記憶體,直接將引用c指向了字串常量池已有的"ab"

string d = "a" + "b"; //通過拼接靜態字串的方式先檢查常量池中是否已有相等的物件,有則直接將引用指向和c相同的物件

string e = "b"; //引用e指向乙個新的字串

string f = "a" + e; //和e拼接將產生乙個新的物件,即f指向新的記憶體位址

system.out.println(c == d); //true //d通過+拼接的是靜態字串,非引用

system.out.println(f == d); //false //f通過+拼接了乙個引用相當於新建立了乙個物件。

//通過new 建立的字串物件(a本身,b本身)不會進入字串常量池

system.out.println(a == a.intern()); //false,a沒有進入常量池,但是a.intern()已經進入,二者非同一物件

system.out.println(c == c.intern()); //true,c本來就在字串常量池,所以返回true

system.out.println(b.intern() == a); //false,a沒有進入常量池,但是b.intern()已經進入且和a.intern()是同乙個物件

system.out.println(b.intern() == c); //true, b.intern()進入了常量池,c和該池子中的物件

//通過+拼接靜態字串得到的字串物件會進入字串常量池

system.out.println(b.intern() == d); //true

//非靜態字串通過+拼接不會進入字串常量池

system.out.println(b.intern() == f); //false

system.out.println(b.intern() == a.intern()); //true

大體總結3點:

1.new string的方式建立字串物件,構造器引數進入字串常量池,但是物件本身和常量池中的物件是兩個不同的物件。從而導致這種方式產生的字串呼叫intern()方法和本身引用 == 將返回false。

2.靜態宣告的方式定義的字串直接進入字串常量池,如常量池已有該字串,則直接指向已有字串。這種方式產生的字串呼叫intern()方法和本身引用==始終返回true。

3.+拼接靜態字串建立的物件會進入字串常量池,但是+拼接字串引用就不會進入常量池。二者會導致完全不同的結果,前者呼叫intern()和自身==返回true,後者呼叫intern()和自身==返回false。

字串 Intern 機制

字串在 python 中是最簡單也是最常用的資料型別之一,在 cpython 中字串的實現原理使用了一種叫做 intern 字串駐留 的技術來提高字串效率。究竟什麼是 intern 機制,這種機制又是通過什麼方式來提高字串效率的呢?希望這篇文章能夠拋磚引玉。先來看一段 s3 hello s4 hel...

分解字串

按要求分解字串,輸入兩個數m,n m代表輸入的m串字串,n代表輸出的每串字串的位數,不夠補0。例如 輸入2,8,abc 123456789 則輸出為 abc00000 12345678 90000000 分析思路 1.獲得字串的長度length後,判斷與 要輸出位數n 的大小,大於n的話,直接 pr...

詳解字串

學習了一段時間的c c 準備做一些相關的總結。隨著學習的深入會經常改進部落格。一 定義乙個字串的兩種方式 1.用乙個字元陣列。2.用乙個指標指向字串。char arr 20 char s 20 shanghai char z beijing 二 列印出字串的方式。printf s n arr pri...