Java基础java学习笔记

HashMap1.7和1.8的实现原理

2020-03-11  本文已影响0人  Merbng

概述

HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null键和null值,因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不相同。HashMap是线程不安全的。
在此之前先介绍一下链表

什么是链表

链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链表分为单向链表和双向链表,而单向/双向链表又可以分为循环链表和非循环链表

  1. 单向链表
    单向链表就是通过每个节点的指针指向下一个节点从而链接起来的结构,最后一个节点的next指向null


    单向链表
  2. 单向循环链表
    单向循环链表和单向列表不同的是,最后一个节点的next不是指向null,而是指向head节点,形成一个环。


    单向循环链表
  3. 双向链表
    从名字就可以看出,双向链表是包含两个指针的,pre指向前一个节点,next指向后一个节点,但是第一个节点head的pre指向null,最后一个节点的next指向null


    双向链表
  4. 双向循环链表
    双向循环链表和双向链表的不同在于,第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,也形成了一个环,而LinkedList就是基于双向链表设计的。


    双向循环链表

HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单项链表结构,它具有next指针,可以连接下一个Entry实体,依次来解决Hash冲突问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。

总结

1、实现原理

完美的回答:

2、底层的数据结构

补充

值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap

Map map = Collections.synchronizedMap(new HashMap())

Q 1 .哈希表如何解决hash冲突

解决hash冲突

Q 2 .为什么HashMap具备以下特点:键值都允许为空、线程不安全、不保证有序、存储位置随时间变化

Q 3 .为什么HashMap中String、Integer这样的包装类适合作为key键

image.png

Q 4 .HashMap中的key 若为Object类型,则需要实现哪些方法?

image.png

参考链接

上一篇下一篇

猜你喜欢

热点阅读