HashTable与HashMap的区别,结源码分析

一、HashTable

  首先看一下官网的推荐

1 * Java Collections Framework</a>.  Unlike the new collection
2  * implementations, {@code Hashtable} is synchronized.  If a
3  * thread-safe implementation is not needed, it is recommended to use
4  * {@link HashMap} in place of {@code Hashtable}.  If a thread-safe
5  * highly-concurrent implementation is desired, then it is recommended
6  * to use {@link java.util.concurrent.ConcurrentHashMap} in place of
7  * {@code Hashtable}.

  解释一下上面的话,主要是说hashtable是线程安全,如果是你是在线程非安全的情况下使用的话,推荐使用hashMap,如果在线程安全的情况下使用的话,推荐使用ConcurrentHashMap来替代HashTable。言外之意也就是说hashTable已经过时,最好不要使用。既然已经弃用,我们简单地额讲解一下。

  线程安全

  Java源码:

 1 /**
 2      * Maps the specified <code>key</code> to the specified
 3      * <code>value</code> in this hashtable. Neither the key nor the
 4      * value can be <code>null</code>. <p>
 5      *
 6      * The value can be retrieved by calling the <code>get</code> method
 7      * with a key that is equal to the original key.
 8      *
 9      * @param      key     the hashtable key
10      * @param      value   the value
11      * @return     the previous value of the specified key in this hashtable,
12      *             or <code>null</code> if it did not have one
13      * @exception  NullPointerException  if the key or value is
14      *               <code>null</code>
15      * @see     Object#equals(Object)
16      * @see     #get(Object)
17      */
18     public synchronized V put(K key, V value) {
19         // Make sure the value is not null
20         if (value == null) {
21             throw new NullPointerException();
22         }
23
24         // Makes sure the key is not already in the hashtable.
25         Entry tab[] = table;
26         int hash = hash(key);
27         int index = (hash & 0x7FFFFFFF) % tab.length;
28         for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
29             if ((e.hash == hash) && e.key.equals(key)) {
30                 V old = e.value;
31                 e.value = value;
32                 return old;
33             }
34         }
35
36         modCount++;
37         if (count >= threshold) {
38             // Rehash the table if the threshold is exceeded
39             rehash();
40
41             tab = table;
42             hash = hash(key);
43             index = (hash & 0x7FFFFFFF) % tab.length;
44         }
45
46         // Creates the new entry.
47         Entry<K,V> e = tab[index];
48         tab[index] = new Entry<>(hash, key, value, e);
49         count++;
50         return null;
51     }
 1     /**
 2      * Returns the value to which the specified key is mapped,
 3      * or {@code null} if this map contains no mapping for the key.
 4      *
 5      * <p>More formally, if this map contains a mapping from a key
 6      * {@code k} to a value {@code v} such that {@code (key.equals(k))},
 7      * then this method returns {@code v}; otherwise it returns
 8      * {@code null}.  (There can be at most one such mapping.)
 9      *
10      * @param key the key whose associated value is to be returned
11      * @return the value to which the specified key is mapped, or
12      *         {@code null} if this map contains no mapping for the key
13      * @throws NullPointerException if the specified key is null
14      * @see     #put(Object, Object)
15      */
16     public synchronized V get(Object key) {
17         Entry tab[] = table;
18         int hash = hash(key);
19         int index = (hash & 0x7FFFFFFF) % tab.length;
20         for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
21             if ((e.hash == hash) && e.key.equals(key)) {
22                 return e.value;
23             }
24         }
25         return null;
26     }

  解析:你会看到HashTable的每个方法前面都添加了一个synchronized的锁,说明HashTable是线程安全的,我们的上一篇已经很详细的讲解了HashMap,是非线程安全,这里不再具体讲解。另外你也会发现HashTable在求数组的index下标的时候是使用的%,而HashMap使用的&,这李是没有优化的。

  是否为空

  当我们在使用put的时候,从上面的代码你会发现,HashTable的key和value是不能为空的,否则会NullPointerException。

  

原文地址:https://www.cnblogs.com/houstao/p/8278495.html

时间: 2024-11-03 14:08:44

HashTable与HashMap的区别,结源码分析的相关文章

java-通过 HashMap、HashSet 的源码分析其 Hash 存储机制

通过 HashMap.HashSet 的源码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并非真正的把 Java 对象放入数组中.仅仅是把对象的引用放入数组中,每一个数组元素都是一个引用变量. 实际上,HashSet 和 HashMap 之间有非常多相似之处,对于 HashSet 而言.系统採用 Hash 算法决定集合元素的存储位置,这样能够保证能高速存.取集合元素:对于 HashMap 而言.系统 key-value 当成一个总体进行处理

【转】HashMap实现原理及源码分析

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景极其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑.本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7中的HashMap源码进行分析. 一.什么是哈希表 在讨论哈希表之前,我们先大概了解下其它数据结构在新增.查找等基础操作上的执行性能. 数组:采用一段连续的存储单元来存储数据.对

从HashMap到LrcCache的源码分析

打算研究android的一个图片加载库Android-Universal-Image-Loader,然后就看到了缓存的策略,于是又看到了LruCache,是一个最近最少使用算法LRU.前几天看操作系统也看到了LRU算法,是用在缺页中断发生时,进行置换算法才用的一种.缓存中的LrcCache和操作系统中的页置换算法思想是一样的,于是心血来潮,决定把这部分实现看看,然后就有了这篇博客,从HashMap的实现到LinkedHashMap再到LruCache,总共包含三个类的源码分析,花费了整整一晚上.

HashMap的小总结 + 源码分析

一.HashMap的原理 所谓Map,就是关联数组,存的是键值对--key&value. 实现一个简单的Map,你也许会直接用两个LIst,一个存key,一个存value.然后做查询或者get的时候,就遍历key的list,然后返回相应的value. 这样时间复杂度显然就是线性的,但这在map中已经是效率最低的get的方法了.而Hash主要提高效率的,也就是在这个位置--key的定位和查询这. 在数据结构中,我们学了hash这一技术,也就是散列表的技术.我们把整个表格看作是许多许多的空桶,然后散

2、JDK8中的HashMap实现原理及源码分析

本篇提纲.png 本篇所述源码基于JDK1.8.0_121 在写上一篇线性表的文章的时候,笔者看的是Android源码中support24中的Java代码,当时发现这个ArrayList和LinkedList的源码和Java官方的没有什么区别,然而在阅读HashMap源码的时候,却发现Android中的Java与官方版的出入略大,遂不得不转而用Eclipse导入jdk源码阅读,这里不得不吐槽一句,用惯了IDEA的快捷键,Eclispe还真是用不习惯~~好了,接下来我们言归正传: 一.什么是Has

1.Java集合-HashMap实现原理及源码分析

哈希表(Hash  Table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,这里对java集合框架中的对应实现HashMap的实现原理进行讲解,然后对JDK7的HashMap的源码进行分析 哈希算法,是一类算法: 哈希表(Hash  Table)是一种数据结构: 哈希函数:是支撑哈希表的一类函数: HashMap 是 Java中用哈希数据结构实现的Ma

HashMap实现原理及源码分析

1.数据结构 在数据结构与算法中,给我们介绍了常用的几种数据结构:数组,链表,哈希表. 数组结构:其在内存分配是一段连续的内存空间,可能会占用内存空间严重,空间复杂度很大,时间复杂度小,其优点是易于寻址,但是插入.删除困难. 链表结构:其在内存分配是一系列离散的内存空间,占用内存少,空间复杂度很小,时间复杂度很大,其优点是易于插入和删除,寻址困难. 哈希表:哈希表是集合数组和链表的存储结构,满足寻址方便,易于操作,占用内存空间较小,时间复杂度有较小.其例如下: 已知一组数据{19,14,23,0

每天学会一点点(HashMap实现原理及源码分析)

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑.本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析. 目录 一.什么是哈希表 二.HashMap实现原理 三.为何HashMap的数组长度一定是2的次幂? 四.重写equals方法需同时重写hashC

[转]Java HashMap实现原理与源码分析

1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难: 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N).链表的特点是:寻址困难,插入和删除容易. 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表.