首页 > 其他分享 >不要小瞧了Map接口,实现一个Map对象并不简单!

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

时间:2022-11-05 21:08:01浏览次数:45  
标签:Map String 小瞧 接口 hashCode 哈希 散列

不要小瞧了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. 欢迎关注我❤️,点赞

    标签:Map,String,小瞧,接口,hashCode,哈希,散列
    From: https://blog.51cto.com/u_15460453/5826057

相关文章

  • Java集合接口Enumeration
    Java集合接口EnumerationEnumeration接口是Iterator迭代器的“古老版本”,从JDK1.0开始,Enumeration接口就已经存在了(Iterator从JDK1.2才出现)。Enumeration接口只有两个......
  • Java的HashSet和HashMap性能选项
    Java的HashSet和HashMap性能选项1.*HashSet和HashMap的性能选项对于HashSet及其子类而言,它们采用hash算法来决定集合中元素的存储位置,并通过hash算法来控制集合的大小;对......
  • Java的Map集合
    Java的Map集合1.*MapMap用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类......
  • 数学 动规 滑动窗口 HashMap里放数组 dfs 暴力
    1比特与2比特字符intn=bits.length;inti=0;因为,如果最后一个字符必须是一个一比特字符,那么,一定可以跳到最会一个位置。也就是n-1这个位置。所以不能遍......
  • ZYNQ 中PS与PL交互的硬件接口
    一、ZYNQ整体框图二、细节图三、PL与PS交互接口1、接口介绍在ZYNQ芯片内部用硬件实现了AXI总线协议,包括12个物理接口,分别为S_AXI_HP{0:3}_FPD------->(PL为......
  • 003.完成第一个接口的开发
    1.开发firstrequest接口/***描述:演示接口和传参*//@RestController表示返回时JSON格式不是页面*/@RestControllerpublicclassParaController{@G......
  • JAVA8-Lambda-forEach遍历List/Map
    一、遍历List代码示例publicstaticvoidmain(String[]args){List<String>list=Arrays.asList("北","上","广","深");list.forEach(System.out::prin......
  • JAVA8-Lambda-List转Map
    List转Map需要注意点是在收集map时Collectors.toMap()建议选三个入参的方法。示例如下:(注意list中的“张三”有两个我们将其作为Map的key)####无第三个参数示例pu......
  • SpringBoot集成安全认证框架Shiro的简单方法,能有效区分RestAPI 接口与web页面的不同处
    本文介绍在SpringBoot2.6下配置Shiro认证的方法:1.pom.xml引入依赖<dependency><groupId>org.apache.shiro</groupId><artifactId>sh......
  • Spring Boot集成Restful Api在线文档接口调试工具 Swagger
    文章目录​​一、Swagger简介​​​​Swagger有什么用?​​​​二、环境准备​​​​三、构建SpringBoot工程​​​​四、引入Swagger依赖​​​​五、编写一个Test控制器​......