和equals 的關係

2021-08-02 00:25:03 字數 1198 閱讀 5663

在搞清楚==和equals()關係之前,要先釐清基本型別、string、以及例項物件在記憶體中的分配機制。

1.基本型別(byte、short、int、long、float、double、char、boolean):以int為例

1. int a = 12:會先查詢棧中是否存在12,如果沒有,會先建立,然後將a指向它;如果有的話,會直接指向它;如果修改a的值的話,如a = 13;道理相同;

2. int b = 12:會先查詢棧中是否存在12,如果沒有,會先建立,然後將b指向它;如果有的話,會直接指向它;如果修改b的值的話,如b = 13,道理相同;

所以a和b指向的是棧中的同一塊記憶體。

2.new物件例項

1. test testa = new test();會在棧中建立引用變數testa,然後在堆中建立對應的記憶體塊

2. test testb = new test();會在棧中建立引用變數testb,然後在堆中建立相應的記憶體塊

3.string

string在記憶體中的分配方式有兩種:

1. string c = 「hello」與string d = 「hello」的分配機制與基本型別相同

2. string c = new string(「hello」)與string d = new string(「hello」)的分配機制與new 例項記憶體分配機制相同

==比較的是物件控制代碼

1. 對於基本型別來說,如果兩個變數指向同乙個值,控制代碼相同;而且基本型別的比較只能用==,沒有equals()方法;

2. 對於string來說,如果兩個變數指向同乙個值(即通過string a = 「」而非new string(「」)賦值),控制代碼相同;

3. 對於new物件例項來說,指向的是堆中的不同記憶體塊,所以控制代碼不同

equals對於不同型別,含義不同

1. 對於string來說,重寫了equals()方法,比較的是string的內容;

2. 對於new例項物件來說(包括以new string()方式建立的string物件),使用的都是object的equals()方法,比較的是物件控制代碼。

equals和hashcode的關係

首先要明確,equals的優先順序比hashcode高。我們需要確保當兩個物件equals相等時,那麼他們的hashcode一定相等。如果兩個物件equals不相等,那麼兩個物件的 hashcode 方法不一定會生成不同的整數結果。但是,程式設計師應該知道,為不相等的物件生成不同整數結果可以提高雜湊...

equals 和hashcode 方法的關係

當equals方法被重寫時,通常有必要重寫 hashcode 方法,以維護 hashcode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。如下 1 當obj1.equals obj2 為true時,obj1.hashcode obj2.hashcode 必須為true 2 當obj1.h...

Equals 和 的區別

對於值型別,如果物件的值相等,則相等運算子 返回 true,否則返回 false。對於string 以外的引用型別,如果兩個物件引用同乙個物件,則 返回 true。對於 string 型別,比較字串的值。操作比較的是兩個變數的值是否相等。equals 方法比較的是兩個物件的內容是否一致 equals...