java 字符串池的深入理解
字符串池是Java的一個(gè)特性,可以通過(guò)一段代碼理解。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
String a = "Hello" ; String b = "Hello" ; String c = new String( "Hello" ); String d = new String( "Hello" ); System.out.println(a == b); System.out.println(b == c); System.out.println(c == d); System.out.println(a.equals(b)); System.out.println(b.equals(c)); System.out.println(c.equals(d)); |
結(jié)果是true,false,false,true,true,true。
這里就涉及到字符 串池。“字符串池”,是Java為了提高內(nèi)存利用率而采用的措施:當(dāng)遇到String a = "Hello"; 這樣的語(yǔ)句時(shí),Java會(huì)先在字符串池中尋找是否已經(jīng)存在"Hello"這個(gè)字符串,如果沒(méi)有,則建立字符串"Hello"對(duì)象,然后變量 a 指向這個(gè)地址;然后遇到語(yǔ)句String b = "Hello",這時(shí)字符串池中已經(jīng)有 "Hello"了,所以直接讓變量b也指向這個(gè)地址,省去了重新分配的麻煩。而在Java中,操作符“==”對(duì)于兩個(gè)基本型來(lái)說(shuō),是判斷其內(nèi)容是否相同, 對(duì)于兩個(gè)對(duì)象來(lái)說(shuō),則是判斷其地址是否相同,所以a == b返回 true。那么String c = new String("Hello")又如何處理呢?如果是這種寫(xiě)法,則不會(huì)去訪(fǎng)問(wèn)字符串池,而是先為變量 c 開(kāi)辟空間,然后將值寫(xiě)入空間。所以a == c返回false,c == d同樣返回false。至于String的equals方法,因?yàn)樗容^的不是對(duì)象的地址,而是對(duì)象的值,所以都返回true就不奇怪了。
Java虛擬機(jī)有一個(gè)字符串池,保存著幾乎所有的字符串對(duì)象。字符串表達(dá)式總是指向字符串池 中的一個(gè)對(duì)象。使用new操作創(chuàng)建的字符串對(duì)象不指向字符串池中的對(duì)象但是可以使用intern方法使其指向字符串池中的對(duì)象(注:如果池中已經(jīng)有相同的 字符串--使用equals方法確定,則直接返回池中的字符串,否則先將字符串添加到池中,再返回)。池中兩個(gè)相等的字符串如果使用“==”來(lái)比較將返回 真。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
原文鏈接:http://blog.csdn.net/u012965373/article/details/53573195