==和equals方法的區別以及Integer和String的應用
==比較的是兩個對象的地址記憶體位址,而equals比較的是兩個對象的值。
例如String的equals比較方法,先調用==判斷是否相同,然後再判斷對象value的char數組是否相同。 Integer和int的==操作
Integer和int的==判斷主要是地址的判斷。樣本如下
int i = 100;Integer i1 = 100; System.out.println(i==i1);//trueInteger i2 = 100;System.out.println(i1==i2);//trueInteger i3 = new Integer(100);System.out.println(i==i3);//trueSystem.out.println(i1==i3);//false Integer i4 = 300;Integer i5 = 300;System.out.println(i4==i5);//falseInteger i6 = new Integer(300);System.out.println(i4==i6);//falseint i6=300;System.out.println(i5==i6);///true
原因說明:1 自動裝箱和Integer對象緩衝數組 :int i = 100,涉及到自動裝箱,即Integer i = Integer.valueOf(100);,另外Integer有緩衝數組,即-128<=value<=127,都從緩衝數組中擷取Integer對象。因此i==i1,i1==i2是true,但是如果通過new Integer方法產生的對象,==是false,因為new的本意就是創見一個新對象,因此i3==i1為false,而i==i3的原因是,int與Integer比較時,Integer會進行拆箱,比較value的大小,因此相同。
2 i4==i6 因為都是Integer對象,並且value超出緩衝的最大值,因此都是new的對象,因此Integer對象比較時為false
3 i5==i6 因為i5是int,i6就會拆箱,這樣就不是比較記憶體位址,而是比較數值。
4 因此如果要是判斷兩個Integer對象的大小是否相同,要使用Integer.intValue()進行判斷,如果一個Integer和int進行大小判斷,就不需要採用Integer.intValue(),因為Integer與int比較是會自動拆箱,或者直接使用Integer的equals方法 String的==和equals
String str = "abc";String str1 = "abc";System.out.println(str==str1);//trueString str2 = new String("abc");System.out.println(str==str2);//falseString str3 = new String("abc");System.out.println(str2==str3);//false
因為String同樣有字串常量池,因此當通過str==str1,兩者都是直接從常量池中擷取對象。但是通過new的方式,無論字串常量池中是否有該值,都會建立對象並儲存該值。