Hashtable源码实现上和HashMap基本上没什么大的差别,有兴趣可以查看HashMap一章了解下。

要点总结

1.Hashtable不支持key或者value为null的情况,HashMap和LinkMap可以支持:

并非由于啥特别的原因,只是Hashtable源码进行put操作时,判断null抛出了NullPointerException异常,如下:```
public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {   //判断value为null则抛出NullPointerException异常              throw new NullPointerException(); }// Makes sure the key is not already in the hashtable.HashtableEntry<?,?> tab[] = table;int hash = key.hashCode();  //key为null时,则此处为抛出NullPointerException异常int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")HashtableEntry<K,V> entry = (HashtableEntry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}addEntry(hash, key, value, index);return null;}
```而HashMap则对null进行了容错:```public V put(K key, V value) {//这边并没对value进行Null的判断return putVal(hash(key), key, value, false, true);}static final int hash(Object key) {int h; //如下,key为null值则默认hash返回0,return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
```
复制代码

2.Hashtable是线程安全的,HashMap和LinkHashMap非线程安全:

主要是Hashtable在数据存取等关键接口上使用了synchronized来达到线程同步的效果:

public synchronized V get(Object key){...}
public synchronized V put(K key, V value) {...}
public synchronized V put(K key, V value){...}
public synchronized void putAll(Map<? extends K, ? extends V> t) {...}
public synchronized V remove(Object key){...}
public synchronized void clear(){...}
public synchronized boolean contains(Object value){...}
public synchronized boolean containsKey(Object key){...}
...
复制代码

等等一堆和数据写入和读取相关的接口都用synchronized简单实现了线程同步,

3.多线程并发的处理效率上Hashtable因为synchronized机制要比HashMap和LinkHashMap低很多,但至少保证了线程安全,不用再手动去增加线程安全的操作

4.Hashtable本身已经快被淘汰,并不推荐使用,查看该类的源码注释:

 * If a thread-safe implementation is not needed, it is recommended to use* {@link HashMap} in place of {@code Hashtable}.  If a thread-safe* highly-concurrent implementation is desired, then it is recommended* to use {@link java.util.concurrent.ConcurrentHashMap} in place of* {@code Hashtable}.
复制代码

意思是,如果不需要线程安全,请使用类似HashMap。 如果需要较高的并发线程安全要求,请使用ConcurrentHashMap,该类效率会比Hashtable高很多。

扫描关注公众号获取更多内容

Java集合(三、Hashtable)相关推荐

  1. Java集合:Hashtable源码分析

    1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍.HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区 ...

  2. JAVA集合三:几种Set框架

    参考链接: HOW2J.CN HashSet简单讲解 HashSet HashSet与C++STL中Set基本类似,具有的特点便是: 集合中元素不可重复 集合中元素顺序 ≠ 插入顺序 常用方法 功能 ...

  3. java基础—自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存(java集合三)

    自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存 import java.util.Comparator; import java.util.Iterator; import java ...

  4. Java集合(三):Queue队列

    前面介绍了列表,其中包括List接口和LinkedList链表和ArrayList数组列表.这节介绍一个也很常见的数据结构:队列. 我们知道,队列是一个可以从尾部添加新元素.从头部删除元素的数据结构. ...

  5. Java集合之Hashtable源码分析

    概述 Hashtable也是基于哈希表实现的, 与map相似, 不过Hashtable是线程安全的, Hashtable不允许 key或value为null. 成员变量 Hashtable的数据结构和 ...

  6. Java集合(一):Java集合概述

    注:本文基于JDK 1.7 1 概述 Java提供了一个丰富的集合框架,这个集合框架包含了许多接口.虚拟类和实现类.这些接口和类提供了丰富的功能,能够满足基本的聚合需求.下图就是这个框架的整体结构图: ...

  7. 【Java集合 1】java集合有哪些

    目录 一.数组Array和集合的区别 二.Java集合 三.Collection接口 四.Set 五.List

  8. java comparable接口_Java面试题之Java集合篇三

    Java面试题之Java集合篇三1.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的, ...

  9. 深入Java集合系列之七:Hashtable

    之前一直是看别人对于其他几个集合框架的分析,现在自己也来分析一下Hashtable的源码以及用法. 首先,为了提高兴趣,我们先来看看这个源码是谁写的. * @author Arthur van Hof ...

最新文章

  1. jni android 参数 字符串 jstring,2.4.5 jstring介绍
  2. 在线答题系统开发经验mysql,php
  3. 人工智能还给我们留多少空间?
  4. C# winform 编写记事本
  5. android 定位服务 耗电吗,关于Android的定位服务
  6. 【通俗易懂】层次聚类算法的原理及实现
  7. mysql单点故障_如何解决云服务商单点故障频发的问题?
  8. python 数据类型 、运算符
  9. api中文文档 mws_中英文排版规范化 API
  10. 小系统单据自动生成存储过程
  11. javascript常用校验器
  12. C#上位机与三菱PLC通讯
  13. QT QLabel中字体行间距怎么设置?
  14. 黑鲨重装计算机安装无法继续,图解黑鲨装机大师装机失败无法开机怎么办?
  15. Bulma CSS框架教程
  16. Centos7.5软硬件、IP地址及主机名称配置详细教程
  17. LINUX未来的发展前景
  18. 最简单linux桌面环境,推荐:轻型简易的Linux桌面环境
  19. 【数据库开发】MySQL绿色版的下载和安装
  20. php中的汉字转化为拼音,简繁体转化

热门文章

  1. emmc linux 识别分区_linux下给U盘分区并制作文件系统
  2. mysql scale,Mailchimp Scale:a MySQL Perspective
  3. matlab 查找字符串中第一个不为空格的_替换空格(剑指offer第三题)
  4. 海康、大华等厂家监控摄像机rtsp地址格式
  5. C++程序代码:类实现——【calculator】计算器程序设计
  6. nand flash驱动编写步骤
  7. 如何画ROC曲线和FROC曲线
  8. 基于softmax的文本多分类模型代码实现
  9. AnkhSVN的使用
  10. js获取form表单数据和form表单赋值