`

HashMap与ConcurrentHashMap 的数据结构

 
阅读更多
HashMap:
数组与链表,每个数据对应一个链表
插入时进行与运算
http://blog.csdn.net/tingting256/article/details/52475422
数组默认长度16,当超过16*0.75=12时,组数长度变为16*2->叫resize,毁
HashMap的基础构造器HashMap(int initialCapacity, float loadFactor)带有两个参数,它们是初始容量initialCapacity和加载因子loadFactor。
https://www.cnblogs.com/ITtangtang/p/3948406.html
相同含义的两个对象,插入同一个key:
http://blog.csdn.net/zbuger/article/details/51029898

为什么数据是2的n次幂
为了更均匀打到槽点。与运算
http://www.cnblogs.com/ysocean/p/9054804.html
当 lenth = 2n 时,X % length = X & (length - 1) ,模运算 % 可以变换为按位与 & 运算
早期版本是直接取模%,后期改为位运算
一个十进制数对一个2n 的数取余,我们可以将这个十进制转换为二进制数,将这个二进制数右移n位,移掉的这 n 位数即是余数。

为什么是数组长度是16
计算卡槽点时,具体落到哪个数组时,做与运算时
hash(hashCode(key)) & (length-1) -> 会落到位置范围内
二进制:Interger.toBinaryString(15);
容量到了12会扩容:在扩容的时候更多的节点不需要重新计算到新槽点, hash之后的桶的角标是不变的。

为什么0.75
过低,小一点:扩容频繁。
过高,大一点:扩容不容易发生,数组重复概率增加,导致get和put时间增多,冲突需要遍历大量链表空间。

final int hash(Object key)里有>>>,>>>
降低重复冲突概率

深入理解:https://www.zhihu.com/question/20733617
“扰动函数”混合原始哈希码的高位和低位,加大低位随机性,为了减少数组碰撞概率,减少10%。
Java 8觉得扰动做一次就够了,做4次的话,多了可能边际效用也不大,所谓为了效率考虑就改成一次了。
当获取对象时get,hash找到数组槽位,循环链表,通过键对象key的equals()方法找到正确的键值对,然后返回值对象。

HashTable:
数组默认长度11
http://blog.csdn.net/xuefeng0707/article/details/40834595
继承的父类不同
线程安全性不同
key和value是否允许null值
hash值不同,插入算法也不同,hashtable取取模运算,hashmap与运算。
是否提供contains方法
http://blog.csdn.net/fujiakai/article/details/51585767

ConcurrentHashMap:
http://blog.csdn.net/yan_wenliang/article/details/51029372

segment数组,每个数组是一个hashtable,里面有分段锁
多线程put时,当同一数组存储时线程加锁,不同数组时,没有锁,效率的提升。
分享到:
评论

相关推荐

    HashMap与ConcurrentHashMap面试要点.pdf

    Node数组的结构与HashMap中的数组类似,但ConcurrentHashMap对数组的每个节点Node进行了CAS操作来保证并发时节点的安全更新。 ConcurrentHashMap的节点Node在冲突比较小的情况下以链表形式存储,当冲突较大时,链表...

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    在Java 7和8中,HashMap和ConcurrentHashMap是两种重要的数据结构,分别用于非线程安全和线程安全的键值对存储。本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用...

    java7-8中的 HashMap和ConcurrentHashMap全解析

    在Java编程语言中,`HashMap`和`ConcurrentHashMap`是两种非常重要的数据结构,它们都属于`java.util`包,用于存储键值对。本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap...

    详谈HashMap和ConcurrentHashMap的区别(HashMap的底层源码)

    首先,从数据结构上讲,HashMap是一个数组加链表的结构,根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面。ConcurrentHashMap在HashMap的基础上将数据分为多...

    HashMap的数据结构

    HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储键值对(Key-Value)数据。HashMap在内部实现上基于哈希表,也称为散列表,它提供了一种快速查找、插入和删除数据的方法,...

    史上最详细详解hashmap、concurrenthashmap

    总结来说,HashMap 和 ConcurrentHashMap 主要的区别在于线程安全性和数据结构优化。HashMap 适合单线程环境,追求高性能;而 ConcurrentHashMap 在多线程环境下,通过分段锁和无锁并发控制提供线程安全的存取,牺牲...

    2.Java7_8+中的+HashMap+和+ConcurrentHashMap+全解析1

    在Java编程语言中,HashMap和ConcurrentHashMap是两种常用的散列表数据结构,主要用于存储键值对。本文将对这两个类在Java 7和8中的实现进行深入解析,尤其是它们在并发环境下的行为和优化。 首先,我们来看Java 7...

    关于如何解决HashMap线程安全问题的介绍

    在Java编程中,HashMap是一个非常常用的集合类,用于存储键值对数据。然而,它存在一个重要的特性,那就是线程不...在设计和编写多线程程序时,要始终关注数据结构的选择和操作的同步控制,以保证程序的正确性和效率。

    Java集合相关面试题

    Java集合相关面试题是Java开发中非常重要的一部分,本文将对Java集合相关面试题进行总结和分析,涵盖List和Map相关的面试题,包括ArrayList、LinkedList、HashMap、ConcurrentHashMap等,并对数据结构和算法复杂度...

    HashMap底层原理.pdf

    HashMap是Java中非常常见的一种数据结构,主要用于存储键值对,其核心原理是通过哈希算法将键映射到数组中的位置来实现快速访问。本文将详细介绍HashMap的底层原理,包括其内部实现结构、关键字段的作用、以及JDK ...

    java多线程并发及集合框架面试题

    3. **并发编程最佳实践**:说明在多线程环境下,何时应该使用 ConcurrentHashMap 而不是 HashMap,以及如何避免使用非线程安全的数据结构时可能出现的问题。 4. **并发工具类**:讨论除了 ConcurrentHashMap 之外,...

    HashMap与HashTable区别

    在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在显著差异。下面将详细介绍`HashMap`...

    hashmap面试题_hashmap_

    HashMap作为Java集合框架中的重要成员,是面试中常见的知识点,尤其在数据结构与算法、并发编程以及JVM内存管理等领域,HashMap的深入理解至关重要。本篇将围绕HashMap的相关面试题,从基础概念到高级应用进行详尽...

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    HashMap是Java中常用的一种数据结构,它基于哈希表实现,提供快速的键值对存储和检索。HashMap的核心原理是通过散列函数将键对象转换为哈希码,然后使用这个哈希码来确定键值对在内部数组中的位置。哈希函数的设计...

    hashmap 实例

    《HashMap 实例解析与关联数据结构对比》 HashMap 是 Java 中常用的一种数据结构,属于 Java.util 包下的类,它是基于哈希表实现的。在本文中,我们将深入理解 HashMap 的实例及其工作原理,并与其他数据结构如 ...

    hashmap 集合

    在Java编程中,HashMap集合是开发者经常使用的数据结构之一,尤其在处理大量数据时,它的高效性和灵活性使得它成为首选。HashMap是Java集合框架的一部分,位于`java.util`包下,实现了Map接口,用于存储键值对(key-...

    ConcurrentHashMap源码解析

    与传统的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能,尤其是在读多写少的场景下。它通过引入锁分段技术解决了并发环境下效率低下的问题。 首先,我们来了解什么是线程安全的HashMap。HashMap在单...

    HashMap与CorruntHashMap性能对比

    在Java编程语言中,`HashMap`和`ConcurrentHashMap`都是常见的散列表实现,用于存储键值对数据。它们在很多场景下都能提供高效的查找、...开发者可以根据实际情况,选择最适合的数据结构,以实现更高效、更稳定的应用。

    疫苗:Java HashMap的死循环

    HashMap是Java中一种常用的数据结构,它提供了快速的查找、插入和删除操作。然而,在多线程环境中使用HashMap可能会导致死循环的问题。下面我们来分析HashMap的死循环原因。 首先,HashMap的数据结构是一个数组加...

Global site tag (gtag.js) - Google Analytics