不要小瞧了Map接口,实现一个Map对象并不简单!

时间:2022-11-05 17:55:03

不要小瞧了Map接口,实现一个Map对象并不简单!

这篇文章我们不谈别的,就讲讲Map接口,以及Map集合的一个重要的概念,Map的元素的散列。

实现Map接口

如果我们想自己定义一个Map需要做什么呢?

第一步:首先这个类继承AbstractMap<K,V>

第二步:重写 put()方法和get()方法,来定义我们自己的放入元素和获取元素的逻辑

第三步:实现entrySet()抽象方法,AbstractMap 类的entrySet()方法是首先方法,需要子类来进行实现,而这个方法返回的类型是Map.Entry类型的set对象集合,深入Map接口的源码我们知道Map.Entry也是一个接口,每个实现Map接口的方法都需要实现Map.Entry接口来定义Map中元素的数据结构,比如HashMap中的Node就是实现Map.Entry接口的内部类,定义基本的节点。那么定义完Map.Entry接口的实现类之后,entrySet()方法中把Map.Entry接口的实现类放入Set集合中就可以了。

散列

散列的目的就是让元素更快的被找到。我们可以用数组来存储的元素,但元素的存储的依据并不是根据map的键信息的,因为数据有有一定的容量,而键没有。因此元素的存储是通过散列码来实现的,根据散列码确定元素放入数组哪个位置中,散列码的产生是通过散列函数来实现,hashCode()方法就是一个重要的散列函数。

在Map类的集合中,哈希码是一个重要的概念,也是散列码,它是通过hashCode()方法得到的。对于同一个对象,hashCode()方法返回的值是一致的,因此我们看两个对象是否为同一对象的时候,通过是通过哈希码来进行比较。

String类型的哈希码与String的内容有关,当两个String类型的内容相同的时候,String对象会指向同一个内存区域,它们的哈希码也就是一致的,这是和其他对象不同的地方。通过看String的hashCode()方法的源码我们就能证明这一点

String的hashCode()方法:

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

方法中hash值与value有关,而value是存放字符串的数组,因此哈希值的生成只与String的内容相关。

总结

这篇文章我们主要讲了要实现Map接口,我们需要做哪些工作,以及对于Map的散列,我们也进行了介绍,包括String的hashCode 的特点,那就是内容相同,哈希值就会相同。

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 欢迎关注我❤️,点赞????????,评论????,转发????
  2. 关注盼盼小课堂,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。
  3. 有不当之处欢迎批评指正。