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

举报
周杰伦本人 发表于 2022/11/29 18:38:17 2022/11/29
【摘要】 不要小瞧了Map接口,实现一个Map对象并不简单!这篇文章我们不谈别的,就讲讲Map接口,以及Map集合的一个重要的概念,Map的元素的散列。 实现Map接口如果我们想自己定义一个Map需要做什么呢?第一步:首先这个类继承AbstractMap<K,V>第二步:重写 put()方法和get()方法,来定义我们自己的放入元素和获取元素的逻辑第三步:实现entrySet()抽象方法,Abstr...

不要小瞧了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 的特点,那就是内容相同,哈希值就会相同。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。