一、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进阶】---map集合排序

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

  2. Java基础知识强化之集合框架笔记55:Map集合之HashMap集合(HashMap&lt;Integer,String&gt;)的案例

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

  3. Java基础知识强化之集合框架笔记57:Map集合之HashMap集合(HashMap&lt;Student,String&gt;)的案例

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

  4. Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMap&lt;String,Student&gt;)的案例

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

  5. Java基础知识强化之集合框架笔记54:Map集合之HashMap集合(HashMap&lt;String,String&gt;)的案例

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

  6. JAVA之HashMap集合

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

  7. Java 之 HashMap 集合

    一.HashMap 概述 java.util.HashMap<k,v> 集合 implements Map<k,v> 接口 HashMap 集合的特点: 1.HashMap 集 ...

  8. 深入解读大厂java面试必考基本功-HashMap集合

    课程简介 HashMap集合在企业开发中是必用的集合同时也是面试官面试率很高的集合,因为HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的 ...

  9. java中HashMap集合的常用方法

    public Object clone() 返回hashMap集合的副本 其余的方法都是实现Map集合的 https://www.cnblogs.com/xiaostudy/p/9510763.htm ...

  10. java进阶视频分享

    更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...

随机推荐

  1. 在Linux上编写C#程序

    自从C#开源之后,在Linux编写C#程序就成了可能.Mono-project就是开源版本的C#维护项目.在Linux平台上使用的C#开发工具为monodevelop.安装方式如下: 首先需要安装一些 ...

  2. 手把手教你做一个原生js拖动滑块【兼容PC和移动端】

    废话少说: 在PC端可以用mousedown来触发一个滑块滑动的效果,但在手机上,貌似无法识别这个事件,但手机上有touchstart事件,可以通过一系列"touch"事件来替代P ...

  3. DDNS

    一.DDNS简介 DNS,域名系统,是因特网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人们更方便的访问互联网. DDNS,动态域名系统,是域名系统(DNS)中的一种自动更新名 ...

  4. C#封装C++DLL

    1.新建一个C#-Windows-类库(用于创建C#类库(.dll)的项目)类型的工程 2.对于普通C++函数 XXXX_API void cppFun(int i); 在cs代码中添加 [DllIm ...

  5. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  6. Total Commander 常用快捷键(并附快捷键大全)

    Total Commander 常用快捷键 喜欢用Total Commander的人,都会记住它的一些快捷键,这会给你的操作带来很大的方便,以下是经常会用到的快捷键,大家可以记住一些自己用得最多的操作 ...

  7. Ubuntu 14.04 载入 JWS 或 访问 jsp异常的解决方法

    前段时间在Ubuntu 14.04中使用 Chrome登录 Webex准备面试的时候发现无法进入在线面试.搞笑的是前一天尝试进入 Webex的时候还一切正常,不过当时Webex的在线面试没有开始.等到 ...

  8. VIM下CS命令

    01) :vs 文件目录//打开新的目录02) :cs f s 函数名 //查找那些文件中都用这个函数/变量03) :vert diffsplit A函数  //当前函数与A函数做对比(在对比情况下  ...

  9. easyui获取一行数据和修改data-options的值

    <table id="tab" class="easyui-datagrid" style="width: 100%; height: 500p ...

  10. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...