一、HashMap简介

1、HashMap底层是哈希表结构,类似字典,初始化如下:

2、哈希表结构:

是一个数组+单向链表的结构体

数组:查询效率较高,随机增删效率很低

单向链表:在随机增删方面效率较高,查询方面效率很低

哈希表将以上两种数据结构融合在一起,充分发挥它们各自的优点。

3、HashMap集合底层是数组,Node<k,v>[]tables;

hash为哈希值,是HashCode方法执行的结果,通过哈希算法可以转换为数组的下标;

key,value为Map的key与value,next为下一个内存地址

4、map.put(k,v)的实现原理

k,v封装到Node对象内,底层调用hashCode()方法得出hash值,通过哈希算法/哈希函数,将hash值转换成数组下标。

如果下标对应的位置上面没有元素,Node添加到位置上;

如果下标对应的位置上有链表,拿k与链表每个节点k进行equals,如所有equals方法都false,新节点将添加到尾部;

如果有一个euals返回true,那么这个节点的value值将会覆盖

5、map.get(k)的实现原理

调用k的hashCode()方法得出哈希值,通过哈希算法转换成数组下标,通过数组下标快速定位到某个位置,位置上什么都没有话,返回null;

如果这个位置上有单向链表,那么会拿着参数k和单向链表上每个节点的k进行equals,如果所有的equals返回false,囊二get方法返回null。

主要其中某一个节点的k和参数k equals返回true,那么此时这个节点的value就是我们要找的value,既为get方法的最终返回value

6、HashMap的key部分元素需要重写equals方法hashCode方法。也就是hashSet集合中的元素需要重写equals方法hashCode方法。

7、HashMap使用不当时会发生性能问题:

假设所有的hashCode方法返回值都相等,那么底层会变成单向链表,即散列分布不均匀。

什么是散列分布均匀:100个元素,10个单向链表,每个单向链表中包含10个节点。

假设所有的hashCode方法返回均不一样,那么底层会变成数组,即散列分布不均匀。

散列分布均匀需要重写hashCode方法有一定的技巧

8、HashMap集合底层数组达到75%容量时,数组是开始扩容,默认数组容量为16,初始化容量必须是2的倍数,为达到散列分布均匀,且可以提高hashMap集合存取效率。

9、HashMap元素存取什么时候不需要执行equals方法:k.hashCode方法返回的哈希值的数组下标位置为null的时候,equals不再需要执行。

10、HashMap JDK8改进:

如果哈希表的单向链表中元素>8,单向链表会变成红黑树,当红黑树上节点数量<6,会重新把红黑数变成单向链表

11、哈希表数据结构注意事项:

如果o1与o2的hash值相同,一定在同一个单向链表上,

如果o1与o2的hash值不同,但由于哈希算法执行结束后转换的数组下标可能相同,此时会发生“哈希碰撞”

二、实例说明:

1、测试HashMap元素特点:key为integer,它的hashCode与equals均已经被重写

2、遍历Map集合-元素将被无须取出

3、重写quals与hashCode方法

未重写hashCode与equals

重写hashCode与equals后

4、HashMap的key与value可以为空吗,

HashMap可以,Hashtable不行

java进阶(29)--HashMap集合的更多相关文章

  1. Java(29)集合四Collections

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228439.html 博客主页:https://www.cnblogs.com/testero ...

  2. 【Java进阶】---map集合排序

    map集合排序         这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题.   比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...

  3. Java进阶学习之集合与泛型(1)

    目录 1.集合 1.1.集合是什么 1.2.集合框架结构 1.2.1.Collection 1.2.2.Map 1.3.集合接口实现类 1.3.1.LinkedList 1.3.2.ArrayList ...

  4. java进阶(31)--TreeSet集合、TreeMap集合、自平衡二叉树

    一.TreeSet集合简单 1.TreeSet集合底层是一个TreeMap 2.TreeMap集合底层是一个二叉树 3.放到TreeSet集合的元素等同于放到TreeMap集合的Key部分 4.Tre ...

  5. Java基础知识强化之集合框架笔记55:Map集合之HashMap集合(HashMap<Integer,String>)的案例

    1. HashMap集合(键是Integer,值是String的案例) 2. 代码示例: package cn.itcast_02; import java.util.HashMap; import ...

  6. Java基础知识强化之集合框架笔记57:Map集合之HashMap集合(HashMap<Student,String>)的案例

    1. HashMap集合(HashMap<Student,String>)的案例 HashMap<Student,String>键:Student      要求:如果两个对象 ...

  7. Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMap<String,Student>)的案例

    1. HashMap集合(HashMap<String,Student>)的案例 HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap的 ...

  8. Java基础知识强化之集合框架笔记54:Map集合之HashMap集合(HashMap<String,String>)的案例

    1. HashMap集合 HashMap集合(HashMap<String,String>)的案例 2. 代码示例: package cn.itcast_02; import java.u ...

  9. JAVA之HashMap集合

    /** * HashMap集合讲解 * HashMap集合不允许集合元素的Key重复 */package com.test; import java.util.*; public class test ...

随机推荐

  1. APIO2012 苦无 Kunai

    这题网上貌似还没有完整的题解呢,我来口胡一下~ Description \(W \times H\) 的二维坐标系,\(W, H \le 10^9\) 给 \(n (n \le 10^5)\) 个点 ...

  2. NOI Online #2 提高组 游戏

    没用二项式反演的菜比. 题目链接 Solution 非平局代表的树上祖先关系是比较好统计,(可以在处理一个点时,考虑用他去匹配他的子树中的东西)而平局的关系比较难统计.我们不妨求出至少 \(k\) 个 ...

  3. Java集合源码分析(六)——ConcurrentHashMap

    目录 简介 源码分析 父类 接口 字段 内部类 1.链表节点结构 2.树根结构 3.树节点结构 方法 1.构造方法 2.基本并发方法 3.初始化表数组的操作 4.修改添加元素 5.统计元素数量 6.扩 ...

  4. 链判断运算符和Null 判断运算符

    链判断运算符 如果我们要获取一个对象的深层嵌套属性,例如获取文章标题res.data.article.title,然后为了安全起见,我们肯定不能直接这样获取,万一res对象没有article属性了呢, ...

  5. react第十六单元(redux的认识,redux相关api的掌握)

    第十六单元(redux的认识,redux相关api的掌握) #课程目标 掌握组件化框架实现组件之间传参的几种方式,并了解两个没有任何关系组件之间通信的通点 了解为了解决上述通点诞生的flux架构 了解 ...

  6. Spark性能调优篇八之shuffle调优

    1 task的内存缓冲调节参数 2 reduce端聚合内存占比 spark.shuffle.file.buffer                     map task的内存缓冲调节参数,默认是3 ...

  7. H3C S5120V2-SI 交换机配置

    连接终端线 可以看到开机信息 ......................................................................Done. System is ...

  8. .net MVC 微信公众号 获取 access_token

    官方文档说明:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_ ...

  9. CentOS7的防火墙以及selinux介绍/安装telnet命令/安装netstat与ifconfig命令

    简介:firewall防火墙的使用 防火墙:主要用户信息安全防护,主要有软件防火墙和硬件防火墙.firewalld防火墙是软件防火墙,在centos7 之前默认采用的防火墙是iptables,而在ce ...

  10. Spring-Boot配置文件web性能(服务器)配置项(常用配置项为红色)

    参数 介绍 server.address 服务器应绑定到的网络地址 server.compression.enabled = false 如果启用响应压缩 server.compression.exc ...