hashtable,hashMap,concurrentHashMap

一  功能简介

Hashtable

实现方式: 底层数组+链表
初始大小:11
扩容:newSize = oldSize*2+1; 超过3/4 即0.75时扩容
存放键值对要求: key 和 value 都不能为null
线程安全性:线程安全,实现方式是在修改数据时锁住整个HashTable,效率低

父类:Dictionnary (已废弃,所以子类也都不推荐使用了) ,Hashtable 属于遗留类

HashMap
实现方式:底层 数组+链表
初始大小:16
扩容:newSize = oldSize*2; map中元素总数超过Entry数组的75%,触发扩容操作
存放键值对要求:key 和 value 都允许为null,这种key只能有1个
线程安全性:不安全

父类:AbstractMap

ConcurrentHashMap
实现方式:分段的数组 + 链表实现
通过把整个Map分为N(默认16)个部分(槽),相当于是长度为16的槽数组,

每个槽都继承了ReentrantLock,所以每个槽有一把锁,相比HashTable, 效率提升了N倍(读操作不加锁,因类型为volatile 保证能读到最新的值)

扩容:段内扩容

二   实现逻辑

2.1  hashMap的内部实现逻辑

  java7  
hashmap 里面是一个数组,数组中每个元素是一个Entry类型的实例
每个Entry的实例包含4个属性,hash,key,value,next

当put进入某个(key,value)时,会对key进行hash再获取到散列地址,相同散列地址的键值对,存放到同一个链表上(默认放链表头)

扩容顺序:先扩容再插入新值

  java8

进行了优化,如果链表中元素超过8个,就转换为红黑树,以减少查询的复杂度 O(logN)
扩容顺序:先插入新值,再扩容

2.2  ConcurrentHashMap 的实现逻辑

  java 7 

ConcurrentHashMap的思路和HashMap思路是差不多,但是因为它支持并发操作,所以要复杂一些,
整个ConcurrentHashMap由16个Segment组成,Segment代表“部分” 或 “一段”的意思,所以很多地方将其描述为分段锁,
ConcurrentHashMap是一个Segment数组, 其中 Segment 通过继承 ReentrantLock 来进行加锁,即每个锁锁住一个Segment,这样保证线程安全
ConcurrentHashMap的扩容,长度初始化后,无法对 Segment数组进行扩容的,默认长度16,扩容是对Segment里面 的数组进行扩容,每个Segment 想当于一个hashMap

 java 8

也用到了红黑树,逻辑和上面类似

2.3  HashMap中 Entry节点怎么存储?

散列表table是1个Entry数组,保存Entry实例,
对于冲突:在开散列中,如果若干个entry计算得到相同的散列地址(不同的key也可能计算出相同的散列地址),这些entry 被组织成一个链表,以table[i]为头指针

2.4  集合的长度扩容机制:(rehash
当键值对的数量>=设定的阈值(capacity*0.75)时,为保证性能,会进行重散列(重新通过key, length等计算散列地址)

分2步
1  扩容table的长度,2倍
2  转移table中的entry,从旧table转移到新的table (转移过程中,对key进行重新计算散列地址)

2.5 如何计算具体数组位置?

使用 key 的 hash 值对数组长度进行取模就可以了

三  结论

虽然hashtable 是线程安全的,但由于其性能低下(锁整个table) 而且父类已废弃其属于遗留类,所以不推荐使用,

如果是单例模式下,可用hashMap

如果多线程模式下,推荐使用 ConcurrentHashMap

原文地址:https://www.cnblogs.com/hup666/p/11823795.html

时间: 2024-08-05 02:59:22

hashtable,hashMap,concurrentHashMap的相关文章

集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别

一.HashMap 的原理 1.HashMap简介 简单来讲,HashMap底层是由数组+链表的形式实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可:如果定位到的数组包含链表,对于添加操作,首先遍历链表,存在即覆盖,否则新增:对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找.当新建一个HashMap的时候,就会初始化一个数组(

HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别

HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别.当时有些紧张只是简单说了下HashMap不是线程安全的:Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁:而 ConcurrentHashMap 不仅线程安全而且效率高,因为它包含一个 segment 数组,将

HashMap,Hashtable以及ConcurrentHashMap的比较(源码)

一.概述 以前学习的时候应该都知道HashMap以及Hashtable: HashMap是线程不安全的,Hashtable是线程安全的. 这里就一源代码的角度看看为什么Hashtable是线程安全的,以及另外一个线程安全的ConcurrentHashMap与Hashtable的比较. 小提示:在Ecilpse中可以用ctrl+shitf+T查找类,这样就容易查看源代码了. 在查看hashtable源代码的时候,不小心进了com.sun.org.apache.xalan.internal.xslt

Java集合——HashMap、HashTable以及ConCurrentHashMap异同比较

0. 前言 HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTable则都不行. (3)因为线程安全.哈希效率的问题,HashMap效率比HashTable的要高. 但是如果继续追问:Java中的另一个线程安全的与HashMap功能极其类似的类是什么? 同样是线程安全,它与HashTable在线程同步上有什么不同?带着这些问题,开始今天的文章. 本文为

HashMap、HashTable、ConcurrentHashMap的区别

一.相关概念 1.Map的概念 javadoc中对Map的解释如下: An objectthat maps keys to values . Amap cannot contain duplicatekeys; each key can map to at most one value. This interface takes the place of the Dictionary class, which was atotally abstract class rather than an

HashMap,HashTable,ConcurrentHashMap的实现原理及区别

一.哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 链式哈希表从根本上说是由一组链表构成.每个链表都可以看做是一个“桶”,我们将所有的元素通过散列的方式放到具体的不同的桶中.插入元素时,首先将其键传入一个哈希函数(该过程称为哈希键),函数通过散列的方式告知元素属于哪个“桶”,然后在相应的链表头插入元素.查找或删除元素时,用同们的方式先找到元素的“桶”,然后遍历相应的链表,直到发现我们想要的元素.因为每个“桶”都是

HashMap、Hashtable、ConcurrentHashMap线程安全性分析

先看代码: HashMap package com.hash; import java.util.HashMap; import java.util.Map; public class HashMapTest { /** * NUMBER = 50,表示 50 个线程分别执行 put 方法 50 次 线程安全的情况下因该 map size 应该为 2500 */ public static final int NUMBER = 50; public static void main(String

java该HashTable,HashMap和HashSet

同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的三个集合HashTable,HashSet和HashMap具体解释. 本文文件夹: 1. HashTable和HashMap的差别 2. HashSet和HashMap的差别 3. HashMap,HashSet工作原理 4. HashSet工作原理 5. 常见问题 1. HashTable和HashMap的

java中的HashTable,HashMap和HashSet

目录(?)[+] 上篇博客中我们详细的分析了java集合<java中Map,List与Set的区别>. 同时我们也对HashSet和HashMap的核心方法hashcode进行了详解,见<探索equals()和hashCode()方法>. 万事俱备,那么下面我们就对基于hash算法的三个集合HashTable,HashSet和HashMap详解. 本文目录: 1. HashTable和HashMap的区别 2. HashSet和HashMap的区别 3. HashMap,HashS