Java集合(三、Hashtable)
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)相关推荐
- Java集合:Hashtable源码分析
1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍.HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区 ...
- JAVA集合三:几种Set框架
参考链接: HOW2J.CN HashSet简单讲解 HashSet HashSet与C++STL中Set基本类似,具有的特点便是: 集合中元素不可重复 集合中元素顺序 ≠ 插入顺序 常用方法 功能 ...
- java基础—自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存(java集合三)
自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存 import java.util.Comparator; import java.util.Iterator; import java ...
- Java集合(三):Queue队列
前面介绍了列表,其中包括List接口和LinkedList链表和ArrayList数组列表.这节介绍一个也很常见的数据结构:队列. 我们知道,队列是一个可以从尾部添加新元素.从头部删除元素的数据结构. ...
- Java集合之Hashtable源码分析
概述 Hashtable也是基于哈希表实现的, 与map相似, 不过Hashtable是线程安全的, Hashtable不允许 key或value为null. 成员变量 Hashtable的数据结构和 ...
- Java集合(一):Java集合概述
注:本文基于JDK 1.7 1 概述 Java提供了一个丰富的集合框架,这个集合框架包含了许多接口.虚拟类和实现类.这些接口和类提供了丰富的功能,能够满足基本的聚合需求.下图就是这个框架的整体结构图: ...
- 【Java集合 1】java集合有哪些
目录 一.数组Array和集合的区别 二.Java集合 三.Collection接口 四.Set 五.List
- java comparable接口_Java面试题之Java集合篇三
Java面试题之Java集合篇三1.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的, ...
- 深入Java集合系列之七:Hashtable
之前一直是看别人对于其他几个集合框架的分析,现在自己也来分析一下Hashtable的源码以及用法. 首先,为了提高兴趣,我们先来看看这个源码是谁写的. * @author Arthur van Hof ...
最新文章
- jni android 参数 字符串 jstring,2.4.5 jstring介绍
- 在线答题系统开发经验mysql,php
- 人工智能还给我们留多少空间?
- C# winform 编写记事本
- android 定位服务 耗电吗,关于Android的定位服务
- 【通俗易懂】层次聚类算法的原理及实现
- mysql单点故障_如何解决云服务商单点故障频发的问题?
- python 数据类型 、运算符
- api中文文档 mws_中英文排版规范化 API
- 小系统单据自动生成存储过程
- javascript常用校验器
- C#上位机与三菱PLC通讯
- QT QLabel中字体行间距怎么设置?
- 黑鲨重装计算机安装无法继续,图解黑鲨装机大师装机失败无法开机怎么办?
- Bulma CSS框架教程
- Centos7.5软硬件、IP地址及主机名称配置详细教程
- LINUX未来的发展前景
- 最简单linux桌面环境,推荐:轻型简易的Linux桌面环境
- 【数据库开发】MySQL绿色版的下载和安装
- php中的汉字转化为拼音,简繁体转化
热门文章
- emmc linux 识别分区_linux下给U盘分区并制作文件系统
- mysql scale,Mailchimp Scale:a MySQL Perspective
- matlab 查找字符串中第一个不为空格的_替换空格(剑指offer第三题)
- 海康、大华等厂家监控摄像机rtsp地址格式
- C++程序代码:类实现——【calculator】计算器程序设计
- nand flash驱动编写步骤
- 如何画ROC曲线和FROC曲线
- 基于softmax的文本多分类模型代码实现
- AnkhSVN的使用
- js获取form表单数据和form表单赋值