往HashSet集合里面存入元素的时候,默认的会首先调用hashCode()方法,去判断所存元素的hash值和集合里面元素的hash值是否相同,若果不相同就把元素存入到集合中,如果相同了就会调用equals方法再进行比较。打个比方说
Student s1 = new Student("zhangsan",25);
Student s2 = new Student("zhangsan",25);
创建了两个学生对象,我们存入的意思是如果姓名和年龄都相同,就是同一个,第二个不往里面存,如果不覆写hashCode()这个方法这两个学生对象往HashSet集合里面存的话,肯定都会存进去的,因为两个学生对象的地址值都不一样。可以看下面的代码- import java.util.*;
- public class HashSetDemo {
- public static void main(String[] args){
- HashSet hs = new HashSet();
- hs.add(new Student("zhangsan",26));
- hs.add(new Student("lisi",25));
- hs.add(new Student("wangwu",21));
- hs.add(new Student("wangwu",21));
- hs.add(new Student("zhangsan",26));
- Iterator it = hs.iterator();
- while(it.hasNext()){
- Student s = (Student)it.next();
- System.out.println(s.getName()+".."+s.getAge());
- }
- }
- }
- class Student{
- private String name;
- private int age;
- Student(String name,int age){
- this.name = name;
- this.age = age;
-
- }
- public int hashCode(){
- System.out.println("hashCode"+"..."+this.name);
- return name.hashCode()+age*21;
-
- }
- public boolean equals(Object obj){
- if(!(obj instanceof Student))
- return false;
- Student s = (Student)obj;
- System.out.println(this.name+".."+s.name);
- System.out.println(this.age+".."+s.age);
- return this.name.equals(s.name)&&this.age==s.age;
-
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
复制代码 如果没有覆写hashCode();只覆写equals()方法的话,直接判断完地址值不相同就会把对象都存进去,根本不会再去调用equals()方法。
至于你说的return name.hashCode()+age*46;这里age*46是为了提高效率,使其尽量在hashCode()方法里判断完是否为同一个元素。 |