数据结构---Java---HashSet

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);
    }
}

执行结果:

猜你喜欢

转载自www.cnblogs.com/anpeiyong/p/10429593.html