所謂天下文章皆是抄,在網上找一個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);new
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方法肯定,則直接返回池中的字符串,不然先將字符串添加到池中,再返回)。池中兩個相等的字符串若是使用「==」來比較將返回 真。