intern方法
intern方法的作用就是嘗試將乙個字串放入stringtable中,如果不存在就放入stringtable並返回stringtable中的位址(如果這個字串是通過2個new string()用『+』鏈結的方式建立的,呼叫intern方法則stringtable內放置的就是new string生成的物件的位址,而不是實實在在的字串值),如果存在的話就直接返回stringtable中的位址。這是jdk1.7、1.8版本中intern方法的作用,jdk1.6版本中有些不同,1.6中intern嘗試將字串物件放入stringtable,如果有則並不會放入,如果沒有會把此物件複製乙份,放入stringtable(此時字串常量池放入的就是實實在在的字串值), 再把stringtable中的物件返回。
題解對於字串常量池與字串拼接提前沒有了解的建議先看下這2片文章:
jvm虛擬機器執行時資料區のstringtable 字串常量池
字串拼接操作在底層是如何操作的?
//這裡的結果是false
string s1 = new string(
"a")
;//new生成1個物件,同時把a放進了字串常量池(常量池的a也是乙個物件,所以這一步總共建立了2個物件),s1是new的a物件
s1.intern();
//intern方法在常量池中找a,發現常量池中有,就返回a的位址,由於沒有變數接收,這一步相當於沒有動作。
string s2 =
"a";
//這種方式建立的字串直接生成在常量池,由於常量池中字串都是唯一的,所以s2是常量池中a
system.out.println(s1 == s2)
;//s1是new的a物件 != s2是常量池中a
//==
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
==//這裡的結果jdk1.6是false,1.7 1.8上是true
string s3 = new string(
"b") + new string(
"c")
;//通過字串拼接的這種方式,只相當於再堆空間中有乙個bc的物件,但是在字串常量池並沒有bc,s3是new的物件。
s3.intern();
//注意這裡,仔仔細細看上面關於intern方法的1.6 與1.7 1.8以上的區別
字串常量池中沒有bc,此時呼叫intern是複製了乙份bc到常量池,2個物件。
1.8 字串常量池中沒有bc,此時呼叫intern是複製了乙份bc的位址到常量池,1個物件,乙個物件的位址。
string s4 =
"bc"
;// 1.6:通過這種方式建立的字串直接放入字串常量池,發現常量池中有bc,所有此時s4是常量池的bc
1.8:發現常量池中有bc,但是這個bc指向的是堆空間中有s3,所以此時s4最終指向的就是s3
system.out.println(s3 == s4)
;s3是new的物件!=s4是常量池的bc 是false
1.8:s3是new的物件==s4最終指向的就是s3 是true
//==
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
====
==//這裡的結果是false
string s5 = new string(
"d") + new string(
"e")
;//通過字串拼接的這種方式,只相當於再堆空間中有乙個de的物件,但是在字串常量池並沒有de,s5是new的物件。
string s6 =
"de"
;//此時常量池沒有de,所以先把de放到字串常量池,s6指向的就是常量池中的de
s5.intern();
//intern方法在常量池中找de,發現常量池中有,就返回de的位址,由於沒有變數接收,這一步相當於沒有動作。
system.out.println(s5 == s6)
;//s5是new的物件 != s6指向的就是常量池中的de
字串 Intern 機制
字串在 python 中是最簡單也是最常用的資料型別之一,在 cpython 中字串的實現原理使用了一種叫做 intern 字串駐留 的技術來提高字串效率。究竟什麼是 intern 機制,這種機制又是通過什麼方式來提高字串效率的呢?希望這篇文章能夠拋磚引玉。先來看一段 s3 hello s4 hel...
Python中字串的intern機制
intern機制 字串型別作為python中最常用的資料型別之一,python直譯器為了提高字串使用的效率和使用效能,做了很多優化,例如 python直譯器中使用了 intern 字串駐留 的技術來提高字串效率,什麼是intern機制?即值同樣的字串物件僅僅會儲存乙份,放在乙個字串儲蓄池中,是共用的...
了解intern ,了解字串常量池
intern 是string乙個api,平時不常用,但是面試可能會考,掌握intern可避免被面試官問到時大眼瞪小眼的尷尬局面。當乙個string物件呼叫intern 方法時,會首先檢查字串常量池中是否存在equals相等的字串,若存在直接返回常量池中該字串物件,否則建立該字串物件並放入字串常量池。...