標籤:
所謂天下文章皆是抄,在網上找一個Java 字串池的文章,搜到N多條目,可看來看去也就兩篇,總結如下:
首先看一段代碼:
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));
結果是true,false,false,true,true,true。這裡就涉及到字元 串池。“字串池”,是Java為了提高記憶體利用率而採用的措施:當遇到String a = "Hello"; 這樣的語句時,Java會先在字串池中尋找是否已經存在"Hello"這個字串,如果沒有,則建立字串"Hello"對象,然後變數 a 指向這個地址;然後遇到語句String b = "Hello",這時字串池中已經有 "Hello"了,所以直接讓變數b也指向這個地址,省去了重新分配的麻煩。而在Java中,操作符“==”對於兩個基本型來說,是判斷其內容是否相同, 對於兩個對象來說,則是判斷其地址是否相同,所以a == b返回 true。那麼String c = new String("Hello")又如何處理呢?如果是這種寫法,則不會去訪問字串池,而是先為變數 c 開闢空間,然後將值寫入空間。所以a == c返回false,c == d同樣返回false。至於String的equals方法,因為它比較的不是對象的地址,而是對象的值,所以都返回true就不奇怪了。
Java虛擬機器有一個字串池,儲存著幾乎所有的字串對象。字串運算式總是指向字串池 中的一個對象。使用new操作建立的字串對象不指向字串池中的對象但是可以使用intern方法使其指向字串池中的對象(註:如果池中已經有相同的 字串--使用equals方法確定,則直接返回池中的字串,否則先將字串添加到池中,再返回)。池中兩個相等的字串如果使用“==”來比較將返回 真。
Java 字串池