转载请注明源出处:http://www.cnblogs.com/lighten/p/7426522.html

1.前言

  HashTable这个类很奇特,其继承了Dictionary这个没有任何具体实现类,而后实现了Map接口。Dictionary对大部分人而言都十分陌生,因为这个类并没有什么用,其出现在JDK1.0,而Map接口最早出现在JDK1.2。这个应该是JDK自己的类体系进行了调整,使得Dictionary类没有什么价值。在HashMap中我就提到过HashTable,这两个类最大的区别就是HashTable是线程安全的,且HashTable不允许空的键值。实际上现在使用HashTable的可能性比较低了,其表现不如HashMap,线程安全也可以选择性能更高的ConcurrentHashMap。不过还是对其进行简单的介绍,实现也是比HashMap简单多了。

2.Hashtable

  Hashtable拥有和HashMap相似的结构,这里不进行过多描述。threshold就是表需要扩容的阈值,loadFactor就是用来计算这个阈值的载入因子,其乘上表的大小就是阈值了。一般为0.75f,意味着hash表的3/4有数据就进行扩容。

  上面是一般的构造函数,默认大小11,载入因子0.75f。

  get方法就可以看出,其对null没有进行处理。插入hash表也是一般的方法,计算hash值,先做与操作保证hash值为正数,再取余保证落在hash表上。之后就是hash桶的链表遍历了,找到对应的值。

  put方法限制了存入空值。插入也是一样的,先计算出落在hash表上的位置,再查找其原来存在与否,存在就替换旧值,返回。不存在就添加。

  添加的过程先判断是否达到扩容的阈值,到了就扩容。重新计算键的hash值和在hash表上的位置。之后就将其放在链表表头。这个过程和WeakHashMap是类似的。

  remove方法一样,找到Hash表上的位置,遍历找到该值,将前面的节点和后面的节点连起来就可以了。

  其它的方法不进行介绍了,较为简单。

3.后记

  HashTable是最早的类之一,目前使用的场景不大,键值不为null可以自己判断,至于线程安全也可以被Collections.synchronizedMap(HashMap)或者效率更高的ConcurrentHashMap取代。所以该类不推荐使用,毕竟HashMap和ConcurrentHashMap进行了大量的优化。

Java之集合(十四)Hashtable的更多相关文章

  1. Java中的集合(十四) Map的实现类LinkedHashMap

    Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...

  2. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  3. “全栈2019”Java多线程第二十四章:等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. 《Java程序设计》十四次作业

    <Java程序设计>十四次作业实验总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 3. 代码量统计 周次 总代码量 新增代码量 总文件数 新增 ...

  5. “全栈2019”Java多线程第十四章:线程与堆栈详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. “全栈2019”Java异常第十四章:将异常输出到文本文件中

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第七十四章:内部类与静态内部类相互嵌套

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第六十四章:接口与静态方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. python面向对象开发的自我理解

    ​详细代码理解可以参考 笨鸟教程博客:http://www.runoob.com/python3/python3-class.html 面向对象经常被提起,那到底什么是面向对象呢? 它的基本概念:类, ...

  2. Hadoop分布式远程Debug方式

    1.进入目录修改配置文件 cd /cloud/hadoop-2.2.0/etc/hadoop vim hadoop-env.sh2.加入内容(文本最后): #远程调试NameNode export H ...

  3. ubuntu编译centos7部署大象医生 dr-elephant

    github下载源码 ubuntu上安装play,配置好环境变量 暂时不支持基于spark2.x的编译,所以compile.conf中spark版本不变 调用build.sh开始编译 编译好后dist ...

  4. vivado用法

    声明为”DEBUG”,即使没有连接到其他模块,也不会被优化掉.但并不是所有的信号都是在声明为“debug”属性之后就不会优化掉. (2)同一个bank中能设置一个电平. (3)

  5. Linux 部署 tomcat 常用命令

    1.  文件夹重命名 mv somedir somedir1 2. 授权所有子目录 chmod -R 777 somedir 3.授权单个目录 chmod 777 somedir 4.实时打印控制台日 ...

  6. python网络编程应用(一)

     在之前的一篇博客<python网络编程基础>中介绍了socket.socket()函数及其应用,其实socket模块中还有很多属性可供网络应用程序使用.这里将详细讲解一下socket模块 ...

  7. Lucene 中自定义排序的实现

    使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...

  8. hdu 4888 最大流慢板

    http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...

  9. Intellij IDEA 14的注册机(Java版)

    import java.math.BigInteger; import java.util.Date; import java.util.Random; import java.util.zip.CR ...

  10. SQL SERVER存储过程中使用事务与捕获异常

    https://www.douban.com/note/559596669/ 格式类似于 CREATE PROCEDURE YourProcedure ASBEGIN    SET NOCOUNT O ...