數據結構---Java---HashSet
阿新 • • 發佈:2019-02-25
png div test eof style jdk ins override image
1、概述
1.1 HashSet不是線程安全的;
1.2 當向HashSet存入元素時,調用該對象的hashCode()值,根據hashCode()值來決定元素的存儲位置;
如果hashCode()值的位置沒有元素,直接插入;
如果hashCode()值的位置已有元素,再比較equals(),如果equals()比較相同,視為同一個元素;
如果equals()比較不同,將試圖將元素保存到同一位置,實際上不允許(只能存一個元素);
【解決】
*********JDK給出重寫hashCode()的規則:***********
1.1.1 當2個對象的equals返回true,它們的hashCode()應該相等;
1.1.2 對象中用作equals比較的屬性,都應該用來計算hashCode()值;
2、案例
package com.exiuge.mytest.hashset; public class Person { private int age; private String name; public Person(){ } public Person(int age,String name){this.age=age; this.name=name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Overridepublic int hashCode() { return this.name.hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof Person){ Person p=(Person) obj; if (p.getName().equals(this.name)){ return true; } } return false; } }
package com.exiuge.mytest.hashset; import java.util.HashSet; import java.util.Set; public class Test { public static void main(String[] args){ Person p1=new Person(12,"a"); Person p2=new Person(12,"a"); Set set=new HashSet(); boolean a=set.add(p1); boolean b=set.add(p2); System.out.println("p1 hashCode:"+p1.hashCode()); System.out.println("p2 hashCode:"+p2.hashCode()); System.out.println("equals:"+p1.equals(p2)); System.out.println(a+"====="+b); } }
執行結果:
數據結構---Java---HashSet