• Day65-每日一道Java面试题-HashMap 和 HashSet区别、HashSet如何检查重复


    一、HashMap 和 HashSet区别

    如果你看过 HashSet 源码的话就应该知道:HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,因为除了 clone()、writeObject()、readObject()是 HashSet 自己不得不实现之外,其他方法都是直接调用 HashMap 中的方法。

    HashMapHashSet
    实现了 Map 接口实现 Set 接口
    存储键值对仅存储对象
    调用 put()向 map 中添加元素调用 add()方法向 Set 中添加元素
    HashMap 使用键(Key)计算 hashcodeHashSet 使用成员对象来计算 hashcode 值,对于两个对象来说 hashcode 可能相同,所以 equals()方法用来判断对象的相等性

    二、HashSet如何检查重复

    以下内容摘《Head first java》第二版:

    当你把对象加入HashSet时,HashSet 会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让加入操作成功。

    hashCode()与 equals() 的相关规定:

    1. 如果两个对象相等,则 hashcode 一定也是相同的
    2. 两个对象相等,对两个 equals() 方法返回 true
    3. 两个对象有相同的 hashcode 值,它们也不一定是相等的
      综上,如果一个类的 equals() 方法被覆盖过,则 hashCode() 方法也必须被覆盖。

    hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有重写 hashCode() ,即使通过 equals() 判断为相同的两个对象,在加入 HashSet 时,也不会被 HashSet 认为是重复对象。

    import java.util.HashSet;
    
    public class People {
        String idCard;
    
        public People(String idCard) {
            this.idCard = idCard;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            People people = (People) o;
            return idCard.equals(people.idCard);
        }
    
        public static void main(String[] args) {
            People a = new People("a");
            People a1 = new People("a");
            // output: true
            System.out.println(a.equals(a1));
    
            HashSet<People> set = new HashSet<>();
            set.add(a);
            set.add(a1);
            // output: 2
            System.out.println(set.size());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    视野修炼-技术周刊第56期
    Ubuntu上安装Docker的步骤和指南
    基于VHDL的专业略缩词
    吴恩达《微调大型语言模型》笔记
    Spring-MVC的crud增删改查--详细讲解
    java游戏制作-拼图游戏
    Pod详解
    VR数字党建:红色文化展厅和爱国主义教育线上线下联动
    《持续交付:发布可靠软件的系统方法》- 读书笔记(七)
    【STC32G12K128开发板】——STC32G12K128开发板介绍
  • 原文地址:https://blog.csdn.net/Youmonster/article/details/126485290