1. 程式人生 > >java中==和equals和hashcode的區別詳解

java中==和equals和hashcode的區別詳解

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的區別詳解