java中==和equals和hashcode的區別詳解
阿新 • • 發佈:2018-04-26
style void ted 基本類型 內存 class 存儲 throw rgs
一、相同點
都是用來進行值或對象的比較。
二、不同點
對於“==”而言,對於基本類型(char,byte,short,int,long,float,double,boolean),對比的是值,所以是相等的,對於引用對象,對比的是引用的對象的堆地址,例如:
public class Main { public static void main(String[] args) throws InterruptedException { Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1== obj2); } }
註意對於包裝類例如Integer而言,有一些特殊。
對於equals()方法,該方法是Object類的方法,對比時,默認對比的也是引用對象指向的內存地址,所以一般跟“==”對比的值是相同的,因為java不支持對操作運算符重載,如果我想要兩個對象相等,那麽就必須重寫equals方法。對於String類型,已經重寫了該方法,所以用equals對比字符串時是相等的。
對於hashcode()方法,HashCode的存在主要是為了查找的快捷性,HashCode是用來在散列存儲結構中確定對象的存儲地址的。例如hashMap就是利用hashcode來計算存入哪一個entry的。RocketMQ中索引的計算也利用到了hashcode,對於hashcode()和equals(),有:
兩個對象的hashcode相同,對象不一定是一個對象。
兩個對象的hashcode不同,那麽一定不是同一個hash對象。
如果兩個對象的equals相同,那麽hashcode一定相同。
對於equals和hashcode,如果重寫了equals方法,那麽也盡量重寫hashcode方法。
java中==和equals和hashcode的區別詳解