HashSet练习

要求:创建HashSet并添加三个Employee对象,如果两个Employee的名字和年龄的值一样,那么判定认为是相同员工,不能添加到HashSet中。

1、创建HashSet

 Set set = new HashSet();

 2、创建Employee

class Employee{

    private int id;
    private int age ;
    private String name;
    private String address;

    public Employee(int id, int age, String name, String address) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
    
}

 3、Alt + Insert 重写hashCode和equals

 next后,勾选需要判断是否相同的值

 如果name和age值相同,那么它的HashCode返回相同的结果


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return age == employee.age &&
                Objects.equals(name, employee.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

注意:单纯的HashCode重写的话,新建多个Employee它会存在一个相同的链表上。

主程序

public class HashSetExercise {

    public static void main(String[] args) {
        //创建HashSet
        HashSet set = new HashSet();

        set.add(new Employee(1,12,"jack","江西"));
        set.add(new Employee(2,12,"jack","湖南"));
        set.add(new Employee(3,12,"rose","湖北"));

        //使用迭代器
        Iterator iterator = set.iterator();
        //遍历
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);

        }


    }

}

运行结果      id为1和id为2的name和age一样,所以他们哈希值相同,只能添加一个

 分析HashSet添加元素

HashSet底层是HashMap。

1、添加一个元素时,先获取元素的哈希值(HashCode方法)

2、对哈希值进行运算,得到一个索引值即为要存放在哈希表中的位置号。

3、如果这个位置没有其他元素,则直接存放,如果有其他元素,就需要进行HashCode和equals比较,如果HashCode相同,equals不相同,以链表的形式添加,如果HashCode不相同,equals相同,索引值不同添加。两个相同便不再添加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值