浅谈HashMap底层原理

##数组的结构:
其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量彼此之间没有任何的关联。存储区间连续,占用内存严重,数组有下标,查询数据快(因为有下标,并且存储空间连续,分配大小相同,可以通过下标和偏移量迅速找到位子,所以查询数据快),但是增删比较慢(因为数组长度一旦确定就不可变,每次增删都会重新创建新的数组,然后将原来数组的元素拷贝过去,不过在尾部增删效率也不慢);
##链表结构:
一种常见的基础数据结构,是一种线性表,但是不会按照线性的顺序存储数据,而是每一个节点里存到下一个节点的指针。存储区间离散,占用内存比较宽松,使用链表查询比较慢(因为每次查询都是从头节点开始遍历,依次找下去,直到找到为止),但是增删比较快(因为在内存空间上存储的位置是离散的,只需要修改节点中保存的下一个节点的内存地址就可以进行增删,不需要全部拷贝或扩容);
##哈希表:
我们生活中实际的业务场景往往又有即需要增删频繁又需要查询快捷的,用链表也不合适,用数组也不合适,然后出现了一种新的数据结构就是哈希表,哈希表示通过数组加链表结构组成的(俗称正删改查都慢的数据结构)
###HashMap结构及原理(JDK1.8)
HashMap底层就是一个数组结构,数组中的每一项又是链表的一个头节点,当一项中链表的节点数大于等于8个的时候,会自动变成红黑树来提高效率,反之当减少至小于等于6个时会重新变回链表结构。

####HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 键和null值,因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。因为放入HashMap key部分的元素就是放入了HashSet集合,Set集合的特点就是无序不可重复。并且HashMap是线程不安全的。

HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry对象时,也会根据hash算法找到其在数组中的存储位置, 在根据equals方法从该位置上的链表中取出Entry;以此来解决Hash冲突的问题。
2020-09-12
网上找的一张图来说明一下HashMap大致的一个结构。

还有HashMap的扩容机制
HashMap hashMap = new HashMap();
上面的代码会新建一个初始化长度为16,默认加载因子为0.75的HashMap。
HashMap在添加值的时候,它默认能存储16个键值对,直到你使用这个HashMap时,它才会给HashMap分配16个键值对的存储空间,(负载因子为0.75,阈值为12),当HashMap中元素数超过容量*加载因子时,HashMap会进行扩容。

相关文章:

  • 2021-09-15
  • 2021-04-04
猜你喜欢
相关资源
相似解决方案