Java SE 045 hashCodeであり、詳細な分析と詳細なソースコードに相当します

(1)人が諦めない限り、全世界があなたを諦めない
(2)私は大いに役立つために生まれる(3)
学ぶことの苦しみに耐えられないのなら、人生の苦しみに耐えなければならない。深い理解。
(4)難しいことをすることで得なければなりません
5)精神は本当の刃です。
(6)相手を2回、心の中で初めて征服します。
(7)書くのは本当に簡単ではありません。好きな場合や何か持っている場合好き+フォローまたはお気に入りを忘れないでください〜

Java SE 045 hashCodeであり、詳細な分析と詳細なソースコードに相当します

1.機能を設定する

(1)要素の順序なし
(2)要素を繰り返すことはできません。

## 2. Objectクラスのequalsメソッドの特性について
(1)再帰的:オブジェクトが空でない場合、x.equals(x)はtrueである必要があります。
(2)対称性:x.equals(y)はtrueであり、y .equals(x)も真です;
(3)遷移性:x.equals(y)が真であり、y.equals(z)が真である場合、x.equals(z)も真である必要があります;
(4)一貫性プロパティ:x.equals(y)がtrueの場合、比較によってxもyも変更されない限り、x.equals(y)の2回目、3回目、およびn回目の呼び出しもtrueになります。
( 5)null以外の参照xの場合、x.equals(null)はfalseを返します。

2.1注意

(1)Objectのequals()メソッドは==を使用して比較します。
(2)Override equals()メソッドが必要な場合は、Override hashcode()メソッドにも移動する必要があります。

3.ObjectクラスのhashCodeメソッドの特性について

(1)Javaアプリケーションの1回の実行中に、同じオブジェクトのhashCodeメソッドを複数回呼び出すと、同じ値を返す必要があります(オブジェクトの情報が変更されていない場合)。
(2)2つのオブジェクトの場合、equalsメソッドを使用して比較してtrueを返す場合、2つのオブジェクトのhashCode値も同じである必要があります。
(3)2つのオブジェクトについて、equalsメソッドを使用して比較してfalseを返す場合、2つのオブジェクトのhashCodeは異なる必要はありません(同じでも異なっていてもかまいません)が、異なる場合は、アプリケーションのパフォーマンスを向上させることができます。
(4)Objectクラスの場合、異なるObjectオブジェクトのhashCode値は異なります(ObjectクラスのhashCode値はオブジェクトのアドレスを表します)。

4.HashSet呼び出しプロセス

(1)HashSetを使用する場合、hashCode()メソッドが呼び出され、コレクションにすでに格納されているオブジェクトのハッシュコード値が、追加されたオブジェクトのハッシュコード値と一致しているかどうかが判断されます。一貫性がない場合は、直接追加してください。 equalsメソッドを比較すると、equalsメソッドがtrueを返す場合は、オブジェクトが追加されていることを意味し、新しいオブジェクトは追加されません。それ以外の場合は追加されます。

5.まとめ

(1)コレクションの場合、オブジェクトをコレクションに配置できるかどうかの判断は、ハッシュコードおよびequalsメソッドを介して行われます。

(2)自分のクラスで同じ内容にしたい場合、たとえば2人が同じ名前の場合、内容は同じになります。現時点では、2つの張山を同じセットに配置しないでください。

ハッシュコードメソッドとequalsメソッドを書き直します。これら2つのメソッドはObjectクラスによって定義され、これら2つのメソッドは密接に関連しているため、ほとんどの場合、ハッシュコードメソッドを書き直すだけで済みます。同時にequalsメソッドを書き直す必要があります。逆も同じです。equalsメソッドを書き直し、hashcodeメソッドも書き直します。

(3)equalsメソッドを書き直す場合は、hashCodeメソッドも書き直します。その逆も同様です。

package com.javase.hashset;

import java.util.HashSet;
/**
 * 不使用Object类提供的hashCode方法与equalse方法,
 * 使用自己实现的hashCode方法与equals方法判断两个对象的内容是否相同
 * 重写hashCode方法与equals方法
 * @author x_xiongjie
 *
 */
public class SetTest3 {
    
    
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
    
    
		HashSet set = new HashSet();
		Student s1 = new Student("zhangsan");
		Student s2 = new Student("zhangsan");
		set.add(s1);
		set.add(s2);
		System.out.println(set);
		
	}
}

class Student{
    
    
	private String name;
	
	public Student(String name){
    
    
		this.name = name;
	}
	//借助于name的hash code来代表类本身的hash code.
	@Override
	public int hashCode() {
    
    
		return this.name.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
    
    
		if(obj == this){
    
    
			return true;
		}
		//如果obj不为空,并且是当前类的实例。
		if(obj != null && obj instanceof Student){
    
    
			Student s = (Student) obj;
			if(name.equals(s.name)){
    
    
				return true;
			}
		}
		return false;
	}
}

(1)実際の開発プロセスでは、オブジェクトをコレクションに配置できるかどうかを判断する場合、ほとんどの場合、アドレスではなくコンテンツに基づいて決定されます。

(2)実際の実装では、hashCodeとequalsの両方がコンテンツを介して実装されます。このコンテンツがどのように反映されるかは、クラスのメンバー変数を介して行われます。2つのオブジェクトのコンテンツが同じであるかどうかは、メンバーの変更によって反映されます。はい、データはオブジェクトの状態を表しています。
)実際の実装では、hashCodeとequalsの両方がコンテンツを介して実装されます。このコンテンツがどのように反映されるかは、クラスのメンバー変数を介して行われます。2つのオブジェクトのコンテンツが同じであるかどうかは、メンバーの変更によって反映されます。データはオブジェクトの状態を表します。

おすすめ

転載: blog.csdn.net/xiogjie_67/article/details/108540794