单独聊聊HashMap

简介: 单独聊聊HashMap

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

目录
相关文章
|
2月前
有关HashMap的computeIfAbsent优雅使用方式
有关HashMap的computeIfAbsent优雅使用方式
12 1
|
2月前
|
算法 Java 开发者
为啥HashMap的默认容量是16?
为啥HashMap的默认容量是16?
28 0
|
7天前
|
存储 C++
为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
21 1
|
4月前
|
存储 安全 Java
Hashtable和HashMap:差异,数据结构概述,以及JDK的影响
Hashtable和HashMap:差异,数据结构概述,以及JDK的影响
24 0
|
10月前
|
存储 Java 索引
HashMap的执行原理
HashMap的执行原理
42 0
|
10月前
|
存储 算法 安全
HashMap的遍历方式及底层原理
HashMap的遍历方式及底层原理
|
11月前
遍历HashMap的四种方式
遍历HashMap的四种方式
53 0
HashMap,你是怎么做到的Key重复?
HashMap,你是怎么做到的Key重复?
HashMap中套map的作用
HashMap中套map的作用
62 0
|
存储 算法
【HashMap底层运行原理】
【HashMap底层运行原理】