1. HashTable是基于哈希表的Map接口的同步实现
  2. HashTable中元素的key是唯一的,value值可重复
  3. HashTable中元素的key和value不允许为null,如果遇到null,则返回NullPointerException
  4. HashTable中的元素是无序的

HashTable跟HashMap一样,同样是链表散列的数据结构,从源码中我们可以看出,Hashtable 继承于Dictionary类,实现了Map, Cloneable,Serializable接口

  1. Dictionary类是任何可将键映射到相应值的类的抽象父类,每个键和值都是对象
  2. Dictionary源码注释指出 Dictionary 这个类过时了,新的实现类应该实现Map接口
  1. table:一个Entry[]数组类型,而Entry(在 HashMap 中有讲解过)就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的
  2. count:Hashtable的大小,它是Hashtable保存的键值对的数量
  3. threshold:Hashtable的阈值,用于判断是否需要调整Hashtable的容量,threshold的值=(容量 * 负载因子)
  4. loadFactor:负载因子
  5. modCount:用来实现fail-fast机制的

Hashtable 一共提供了 4 个构造方法

  1. public Hashtable(int initialCapacity, float loadFactor): 用指定初始容量和指定加载因子构造一个新的空哈希表
  2. public Hashtable(int initialCapacity):用指定初始容量和默认的加载因子 (0.75) 构造一个新的空哈希表
  3. public Hashtable():默认构造函数,容量为 11,加载因子为 0.75
  4. public Hashtable(Map< ? extends K, ? extends V> t):构造一个与给定的Map具有相同映射关系的新哈希表

存储的流程如下:

  1. 判断value是否为空,为空则抛出异常
  2. 计算key的hash值,并根据hash值获得key在table数组中的位置index
    • 如果table[index]元素为空,将元素插入到table[index]位置
    • 如果table[index]元素不为空,则进行遍历链表,如果遇到相同的key,中老年女装则新的value替代旧的value,并返回旧
      value,否则将元素插入到链头,返回null

获取的流程如下:

  1. 通过 hash()方法求得key的哈希值
  2. 根据hash值得到index索引
  3. 迭代链表,返回匹配的key的对应的value,找不到则返回null

Hashtable有4种遍历方式:

Hashtable HashMap
方法是同步的 方法是非同步的
基于Dictionary类 基于AbstractMap,而AbstractMap基于Map接口的实现
key和value都不允许为null,遇到null,直接返回 NullPointerException key和value都允许为null,遇到key为null的时候,调用putForNullKey方法进行处理,而对value没有处理
hash数组默认大小是11,扩充方式是old*2+1 hash数组的默认大小是16,而且一定是2的指数
  1. 如果涉及到多线程同步时,建议采用HashTable
  2. 没有涉及到多线程同步时,建议采用HashMap
  3. Collections 类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的 Map
    对象,并把它作为一个封装的对象来返回

synchronizedMap()其实就是对Map的方法加层同步锁,从源码中可以看出

最新文章

  1. Linux 服务器 安装 memcached
  2. express请求及对应的获取说明
  3. 2-3. Using Type Deduction
  4. 用“MEAN”技术栈开发web应用(二)express搭建服务端框架
  5. IO流-文件管理
  6. [转]Redis实现分析
  7. T-SQL 小数点转换百分数
  8. Windows 8操作技巧之快捷键大全
  9. 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式
  10. C++异常以及异常与析构函数
  11. centos安装memcache与telnet
  12. 【转】如何在Ubuntu11.10(32位)下编译Android4.0源码(图文)
  13. windows 7文件共享方法
  14. mybatis foreach where test用法
  15. Linux内存详解
  16. [HNOI2007]分裂游戏
  17. 第29月第14天 evpp
  18. 三报文握手 四报文握手 TCP运输连接管理
  19. JDK8到JDK12各个版本的重要特性整理
  20. Django学习手册 - ORM数据类型

热门文章

  1. 题解 hdu4624 Endless Spin
  2. ThinkPHP 3.2 生成静态页面
  3. HDU 5523:Game
  4. GNS3 模拟免费ARP
  5. Golang gin开源实例——表设计
  6. Delphi 10.3.3 THTTPClient Post问题
  7. 编译安装常用包+阿里镜像源-常用资源-系统-下载-科莱软件下载-docker仓库包-安全圈-杏雨梨云-图形界面安装-docker私有双仓库-阿里源报错处理-centos7目录大小
  8. redis简单的实现(java)
  9. 动态弹出框,iframe的name包含一串随机数
  10. Asp.net禁用site.Mobile.Master