单独聊聊HashMap

简介: 单独聊聊HashMap

hashmap 在工作中用的比较多,面试也喜欢问。hashmap的在内存中的存储是通过键值对的方式。 key 不允许重复,值可以,键允许一条key的值为空。java7 的时候数据结构为 链表+数组,而到了Java8 的时候就引入了 红黑树。 数组的结构特点是啥,查询快,插入删除慢;链表的结构特点是啥,查询慢, 插入删除快。 查询的时候,得通过指针去找, 而数组是有索引下标的,找值的时候,通过索引下标就能找到,查询起来也快。但插入的时候,数组还得新建新的数组,把原来的数据复制进去,再把新增的数据新增进来,新增就慢了。链表则不然,通过节点依次向后找,元素越多,找的越慢。 新增插入则只需要修改元素的下标地址就可以。删除也是通过移除对应元素的下标地址就可以了。那为啥hashmap 要引入红黑树呢。我觉得嘛,就是为了提高效率。这个效率体现在哪几点呢? hashmap 很多元素的时候,这个桶就有长长的一个链表,这个时候,单链表有n个元素,遍历的时间复杂度就是O(n),完全失去了它的优势。所以搞个红黑树撑撑场面。现在的动不动数据量就很大,不优化下,还能当集合中的老大哥嘛,真的是。 Java8就是顺势而为,把其数据结构加入了红黑树。 hashmap在Java7 的时候,hashmap 在put 的时候使用了头插法,会造成的死循环。 Java8 就改了这块, put元素的时候使用了尾插法。但是hashmap是线程不安全的, 在多线程环境下,使用就不行了。综合考虑,还是使用ConcurrentHashMap。

目录
相关文章
|
6月前
有关HashMap的computeIfAbsent优雅使用方式
有关HashMap的computeIfAbsent优雅使用方式
65 1
|
6月前
|
算法 Java 开发者
为啥HashMap的默认容量是16?
为啥HashMap的默认容量是16?
63 0
|
3月前
|
Java
遍历HashMap的各种方式比较
遍历HashMap的各种方式比较
64 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
36 1
|
2月前
|
设计模式 安全 Java
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
假如有T1、T2两个线程同时对某链表扩容,他们都标记头结点和第二个结点,此时T2阻塞,T1执行完扩容后链表结点顺序反过来,此时T2恢复运行再进行翻转就会产生环形链表,即B.next=A;采用2的指数进行扩容,是为了利用位运算,提高扩容运算的效率。JDK8中,HashMap采用尾插法,扩容时链表节点位置不会翻转,解决了扩容死循环问题,但是性能差了一点,因为要遍历链表再查到尾部。例如15(即2^4-1)的二进制为1111,31的二进制为11111,63的二进制为111111,127的二进制为1111111。
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
|
1月前
|
存储 自然语言处理 安全
【数据结构】Map的使用与注意事项
【数据结构】Map的使用与注意事项
28 1
|
4月前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
6月前
|
存储 安全 Java
Hashtable和HashMap:差异,数据结构概述,以及JDK的影响
Hashtable和HashMap:差异,数据结构概述,以及JDK的影响
49 0
|
存储
ES6中新增的Set、Map两种数据结构怎么理解以及操作方法
Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构
118 0
|
存储 算法 安全
HashMap的遍历方式及底层原理
HashMap的遍历方式及底层原理