![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
hashmap面试
hashmap
WD技术
这个作者很懒,什么都没留下…
展开
-
jdk 1.8 concurrenthashmap扩容原理
https://www.cnblogs.com/yangchunchun/p/7279881.html原创 2022-03-10 08:39:30 · 348 阅读 · 0 评论 -
JDK1.8中的HashMap,HashTable,ConcurrentHashMap有什么区别?
HashMap是线程不安全的,底层采用数组+链表+红黑树的结构HashTable是线程安全的,因为使用了Synchronized锁住了整个table,底层采用了数组+链表ConcurrentHashMap是线程安全的,采用了CAS+同步锁Synchronized对链表头节点进行锁定,底层使用数组+链表+红黑树HashMap的key和value可以是null,其他两个不行。...原创 2022-03-10 08:39:46 · 251 阅读 · 0 评论 -
ConcurrentHashMap 和 Hashtable 的区别
ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。1、底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;2、实现线程安全的方式(重要):原创 2022-03-10 08:39:54 · 394 阅读 · 0 评论 -
concurrenthashmap 面试题
https://blog.csdn.net/qq_40826814/article/details/115328565原创 2022-03-10 08:39:22 · 105 阅读 · 0 评论 -
HashMap之tableSizeFor
https://www.cnblogs.com/loading4/p/6239441.html原创 2022-03-09 08:44:15 · 44 阅读 · 0 评论 -
【HashMap】扩容机制中尾插法造成环形链表导致死循环问题
https://blog.csdn.net/numbbe/article/details/113697731原创 2022-02-27 14:00:15 · 292 阅读 · 0 评论 -
jdk1.8hashmap为什么对hash进行了一次扰动处理
public V put(K key, V value) { return putVal(hash(key), key, value, false, true);}static final int hash(Object key) { int h; // 判断key是否为null, 如果为null,则直接返回0; // 如果不为null,则返回(h = key.hashCode()) ^ (h >>> 16)的执行结果 return (ke原创 2022-02-26 12:03:42 · 207 阅读 · 0 评论 -
hashmap的get查找过程
1、通过hash值获取该key映射到的哈希桶2、如果桶上的key就是要找的key,则找到并返回3、不是的话,查看后续节点(1)、后续是红黑树,调红黑树的方法根据key获取value(2)、后续是链表,则循环遍历链表根据key获取value...原创 2022-02-23 15:29:22 · 1161 阅读 · 0 评论 -
HashMap到底是插入链表头部还是尾部
在jdk1.8之前是插入头部的,在jdk1.8中是插入尾部的。原创 2022-02-23 10:57:17 · 501 阅读 · 0 评论 -
1.8hashmap的改进
1、数据结构1.1、jdk1.7 使用数组+链表的结构, 链表采用的是头插法(多线程下会有形成循环链表的危险)1.2、jdk1.8 使用数组+链表+红黑树的结构, 链表和红黑树是使用的尾插法2、1.7 与 1.8的差别以及为什么这样设计?2.1、在数据结构上 1.7时使用的是 数组+链表 这种数据结构,1.8时使用的是 数组+链表+红黑树 的数据结构,减少hash冲突情况下的寻址时间2.2、在hash定位的时候, 1.7直接使用key的hash值 & n-1进行与或位运算,1.8 则先将h原创 2022-02-24 13:34:04 · 831 阅读 · 0 评论 -
HashMap的负载因子为什么默认是0.75
作用负载因子是和扩容机制有关的,意思是如果当前容器的容量,达到了我们设定的最大值,就要开始执行扩容操作。比如说当前的容器容量是16,负载因子是0.75,16*0.75=12,也就是说,当容量达到了12的时候就会进行扩容操作原因我们在考虑HashMap的时候,首先要想到的是HashMap只是一个数据结构,既然是数据结构最主要的就是节省时间和空间。负载因子的作用肯定也是节省时间和空间。为什么节省呢?我们考虑两种极端情况1、负载因子是1.0我们先看HashMap的底层数据结构我们的数据一开始是保存在原创 2022-02-23 11:06:51 · 256 阅读 · 0 评论 -
HashMap的存储过程
首先判断key是否为null,如果为null调用putkeyofnull方法,不为null,使用key计算hash值,然后去数组中找索引,如果存在,比较key,可以值相等,覆盖value。key值不相等,将 entry的next指向该值,原创 2022-02-23 15:03:06 · 442 阅读 · 0 评论 -
HashMap的扩容机制---resize()
扩容就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。什么时候扩容?当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值—即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。怎么扩容?1、jdk1.7假设了我们的hash算法就是简单的用key mod 一下表的大小(也就是数组的长度)。其中的哈希桶数组table的size=2, 所以key = 3、7、5,put顺序依次为原创 2022-02-23 14:44:23 · 338 阅读 · 0 评论 -
hashmap的五种便利方式
1.迭代器 EntrySetpublic class HashMapTest { public static void main(String[] args) { // 创建并赋值 HashMap Map<Integer, String> map = new HashMap(); map.put(1, "Java"); map.put(2, "JDK"); map.put(3, "Spring Framew原创 2022-02-23 15:35:49 · 2033 阅读 · 0 评论 -
Hashmap链表长度为8时转换成红黑树,你知道为什么是8吗
为什么要转换?每次遍历一个链表,平均查找的时间复杂度是 O(n),n 是链表的长度。红黑树有和链表不一样的查找性能,由于红黑树有自平衡的特点,可以防止不平衡情况的发生,所以可以始终将查找的时间复杂度控制在 O(log(n))。最初链表还不是很长,所以可能 O(n) 和 O(log(n)) 的区别不大,但是如果链表越来越长,那么这种区别便会有所体现。所以为了提升查找性能,需要把链表转化为红黑树的形式。为什么不直接用红黑树?通常如果 hash 算法正常的话,那么链表的长度也不会很长,那么红黑树也不会带来原创 2022-02-23 12:19:18 · 2467 阅读 · 0 评论 -
hashmap为什么容量是2的n次方
我们知道在hashmap中要找到某个元素,需要根据key的hash值来求得对应数组中的位置。如何计算这个位置就是hash算法。前面说过hashmap的数据结构是数组和链表的结合,所以我们当然希望这个hashmap里面的元素位置尽量的分布均匀些,尽量使得每个位置上的元素数量只有一个,那么当我们用hash算法求得这个位置的时候,马上就可以知道对应位置的元素就是我们要的,而不用再去遍历链表所以我们首先想到的就是把hashcode对数组长度取模运算,这样一来,元素的分布相对来说是比较均匀的。但是,“模”运算的.原创 2022-02-23 10:42:54 · 527 阅读 · 0 评论