今天我们来分析一下Hashtable的底层实现。提到Hashtable可能对于有些人来说会比较陌生,因为不经常使用。这是因为Hashtable是很早就有的集合类了,因为它是在JDK1.0版本中存在的。HashMap集合是在Hashtable集合之后才有的。也可以理解为HashMap集合是优化后的Hashtable。所以它们底层的实现方式几乎是一样,但它们也有些不同的地方要注意,并且它们都是用哈希表的方式存储的。既然我们已经掌握了HashMap的底层实现,那么我们在分析Hashtable时会比较容易,所以本篇中将直接分析Hashtable的底层源码,将不在介绍哈希表的相关知识了。还是和其它集合一样,我们还是先看Hashtable的初始化。

  • 初始化

上面源码是Hashtable集合初始化时所调用的方法,也就是我们通过默认无参的构造方法创建Hashtable对象时,就会执行上述代码。因为我们已经分析过HashMap中的源码了,所以在这里我们将不做过多的解释了。我们将重点分析一下Hashtable初始化与HashMap初始化有何不同。

我们在HashMap这篇文章中分析过,在通过无参的构造方法创建HashMap对象时,只会设置HashMap中的加载因子为默认的0.75,并不会执行底层数组的初始化。而在Hashtable中,不但设置了默认的加载因子为0.75,并且已经将底层的数组初始化了。默认初始化的数组大小为为了11。

下面我们看一下Hashtable中的put方法的底层实现逻辑。

  • 总结

通过对上面源码的分析,我们可以得出以下Hashtable的特性。

  • 当我们通过无参构造方法创建Hashtable对象时,底层的数组就会执行初始化,并将数组大小设置为默认大小为11,将加载因子设置为默认值0.75
  • Hashtable中不允许保存null元素,无论是key还是value
  • Hashtable不能保存相同的key元素,如果元素的key相同,则将后添加到Hashtable中的元素的value覆盖原Hashtable已经存在的元素的value
  • Hashtable执行再散列时,会创建比原来数组大2倍+1的新数组
  • Hashtable中我们发现方法中添加了同步关键字synchronized,这就说明在Hashtable是线程安全的集合类,在多线程开发时,无需添加额外的同步代码,就可以保证集合的线程安全

无法使用集合初始化_Java集合类解析之Hashtable相关推荐

  1. java 集合 介绍_java集合类基本简介

    java集合类基本简介 序号 类描述 1 AbstractCollection 实现了大部分的集合接口. 2 AbstractList 继承于AbstractCollection 并且实现了大部分Li ...

  2. java 类 解析_Java集合类解析 ***

    collection集合 Map集合 Hashtable和HashMap的区别: Hashtable的方法是同步的,而HashMap的方法不是. HashMap可以将空值作为一个表的条目的key或va ...

  3. java集合表_java集合类散列表

    哈希表 是种数据结构,它可以提供快速的插入操作和查找操作.第一次接触哈希表时,它的优点多得让人难以置信.不论哈希表中有多少数据, 插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级.实际 ...

  4. 获取后台集合并遍历_java集合类汇总,终于出总结了,再也不用担心混淆了

    一:集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  5. 集合类 Java中的集合类解析和一些有深入的面试题

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

  6. c#中常用集合类和集合接口之集合类系列

    常用集合类: 数组(Array)的不足(即:集合与数组的区别) 1. 数组是固定大小的,不能伸缩.虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小 ...

  7. java-List集合初始化的几种方式与一些常用操作-持续更新

    目录 list集合初始化 map初始化 获取list集合中的最大最小值 list排序 list对象时间排序 treeMap 中(基于key的排序) TreeMap的按value排序 Map按value ...

  8. Mybatis源码阅读(一):Mybatis初始化1.3 —— 解析sql片段和sql节点

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  9. java集合基础_java常用集合基础知识

    [纯出自个人笔记,如有错误,望改正,谢谢哈! 学习~] 一.Java集合 1.集合类:容器类 装对象的(不能存放基本数据类型,但是里面看到的其实是包装类型) java.util包 ArrayList底 ...

最新文章

  1. 从jvm角度看懂类初始化、方法重写、重载。
  2. Java编程思想——到底选择合成还是继承
  3. Java SE 重点知识笔记
  4. Windows 系统下使用 MinGW + MSYS + GCC 编译 FFMPEG
  5. phpcms文件所需权限
  6. c语言可变参数 printf,c语言 使用可变参数列表实现printf(my_printf)
  7. 华为鸿蒙系统腾讯,腾讯内容开放平台
  8. echarts 不显示标题_图标echarts使用
  9. 一)golang的单例模式
  10. HPC:鱼与熊掌可以兼得
  11. JavaSpring菜鸟教程,附Java面经
  12. NRC词典应用实例——英文文本情感分析
  13. Visual Studio发生‘DLL Initialization Failed‘的解决方法
  14. 王可欣作业一 统计软件简介与数据操作
  15. 对抗样本(五)DeepFool
  16. andriod studio 开发
  17. 八段数码管动态显示(输入数据为BCD编码)
  18. 2022-4-16 c++ 杂记 mutex GUARDED_BY std::unique_ptr unordered_map ::开头
  19. 光学系统总体布局设计方法
  20. 量子计算与量子信息之量子信息概述

热门文章

  1. 中读取数据_Flink入门实战 (中)
  2. mysql left join第一个_MySQL 之 LEFT JOIN 避坑指南
  3. 云端之战:Thomas Kurian离职,Java 11趋向收费,Ellison豪赌ERP和云数据库
  4. 华为云企业级Redis:集群搭载多DB,多租隔离更降本
  5. 华为云企业级Redis:助力VMALL打造先进特征平台
  6. 因为这几个TypeScript代码的坏习惯,同事被罚了500块
  7. 搞事 | 5分钟部署一个机器人帮你告别 “信息焦虑”
  8. python异常处理与上下文管理器
  9. 使用CSE实现滚动升级零中断
  10. Android BroadcastReceiver之 静态广播 笔记+demo