==和equals的淺析

今天忽然看到本身之前寫的代碼,是關於java中==和equals的。因而想寫一點點心得記錄一下。java

你們都知道java中對於引用類型而言,==比較的是引用是否相同,若是是本身寫的類,由於繼承於objec類的,因此equals和==相同。不過javaapi中提供的大部分類都重寫了equals方法。重寫的equals方法比較的是引用所指向的具體內存中的值是否相同。api

可是咱們通常進行比較的時候都會涉及到字符串,字符串比較特別,由於字符串緩衝池的存在因此問題變的有意思起來。spa

public class TestString {
     public static void main(String[] args) {
         String s1 = "Test";
         String s2 = "Test";
         if (s1 == s2)
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
     }
}對象

運行程序,輸出s1==s2,說明s1和s2指向的是同一個對象。建立第一個字符串的時候,會將字符串放入緩衝池中,當第二個建立的時候會先去掃描一遍緩衝池,若是發現有的話則不建立新的直接使用已經存在的。除非刻意去建立一個新的,以下:繼承

public class TestString {
     public static void main(String[] args) {
         String s1 = "Test";
         String s2 = new String("Test");內存

         if (s1 == s2)
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
     }
}
文檔

運行程序 輸出s1!=s2。使用equals方法比較則二者相等。固然,咱們能夠經過string的intern方法處理之後再進行==的比較,你會有奇妙的發現。intern的做用你能夠去看api文檔。我這裏只作簡單解釋,會將該字符串和緩衝池進行對比,若是存在則返回緩衝池中的對象,若是不存在則加入緩衝池中,返回此對象引用。字符串

下面咱們將對基本數據類型和它們的封裝類進行對比,咱們以jdk1.5之後爲例,以前版本不作討論。源碼

                int a1=1;string

int a2=1;

Integer b1 =new Integer (1);

Integer b2 =new Integer (1);

System.out.println(a1==a2);

System.out.println(a1==b1);

System.out.println(b1==b2);

a1==a2是確定的。a1和b1比較,在jdk1.5之後基本數據類型和封裝類之間多了自動轉換的功能(自動拆包和自動裝包)。所以也是true,可是對於b1和b2,在這裏咱們須要把他們做爲單獨的對象來看待,他們比較的是對象的引用是不等的。由於咱們的Integer都是new出來的,全部結果是false。

此外對於Integer和int的比較這裏列舉的不是很完善,對於Integer和int的比較還有以下幾點,這裏就不作說明了,由於涉及到JVM的常量池和Integer實現的問題。Integer中有一個IntegerCache,有興趣的朋友能夠去看如下源碼

Integer a = 127;

Integer b = 127;

System.out.println(a == b);//true

Integer c = 128;

Integer d = 128;

System.out.println(c == d);//false


     固然,這方面的例子有不少,這裏只是舉了幾個簡單的類型。

相關文章
相關標籤/搜索