1. 程式人生 > >==和equals方法的區別以及Integer和String的應用

==和equals方法的區別以及Integer和String的應用

==和equals方法的區別以及Integer和String的應用

== 比較的是兩個物件的地址記憶體地址,而equals比較的是兩個物件的值。
例如String的equals比較方法,先呼叫==判斷是否相同,然後再判斷物件value的char陣列是否相同。
建議:比較兩個物件是否相同,統一使用Objects.equals方法,阿里規約有推薦

Integer和int的==操作

Integer和int的==判斷主要是地址的判斷。示例如下

int i = 100;
Integer i1 = 100; 
System.out.println(i==i1);//true
Integer i2 = 100;
System.out.println(i1==i2);//true
Integer i3 = new Integer(100);
System.out.println(i==i3);//true
System.out.println(i1==i3);//false		
Integer i4 = 300;
Integer i5 = 300;
System.out.println(i4==i5);//false
Integer i6 = new Integer(300);
System.out.println(i4==i6);//false
int i6=300;
System.out.println(i5==i6);///true

原因說明:1 自動裝箱和Integer物件快取陣列 :int i = 100,涉及到自動裝箱,即Integer i = Integer.valueOf(100);,另外Integer有快取陣列,即-128<=value<=127,都從快取陣列中獲取Integer物件。因此ii1,i1i2是true,但是如果通過new Integer方法生成的物件,是false,因為new的本意就是創見一個新物件,因此i3i1為false,而ii3的原因是,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);//true
String str2 = new String("abc");
System.out.println(str==str2);//false
String str3 = new String("abc");
System.out.println(str2==str3);//false

因為String同樣有字串常量池,因此當通過str==str1,兩者都是直接從常量池中獲取物件。但是通過new的方式,無論字串常量池中是否有該值,都會新建物件並存儲該值。