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; } @Override public 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); } }
执行结果:
原文:https://www.cnblogs.com/anpeiyong/p/10429593.html