java.util.HashTable (JDK1.8)
1.Hashtable 特性(先总结下面会详细讲的):
1.Hashtable 存储的内容是键值对(key-value)映射,其底层实现是一个Entry数组+链表。
2.Hashtable是线程安全(他的put和get 方法都被synchronized 修饰)的它的key、value都不可以为null。
3.Hashtable中的映射不是有序的,key、value值均不可为null。
4.Hashtable属性如下,跟HashMap一样,也是一个数组,初始容量是11,负载英子是0.75。
5.目前hashtable仍然只使用了链表去解决hash碰撞问题(对与链表中新添加的元素是放在链表的头部的),因此,如果tab[index]没找到,则遍历链表继续查找即可,算法复杂读O(n)。
6.线程安全的,进去源码你会发现HashTable的 get put remove 的方法上都加的有synchronized 关键字。
2. java.util.Hashtable继承关系

3. Java.util.Hashtable属性
private transient Entry<?,?>[] table; //数组+链表实现
private transient int count; //Entry的总数
private int threshold; //count>=此值时,扩容rehash
private float loadFactor; //负载因子
private transient int modCount = 0; //用来帮助实现fail-fast机制
加载因子loadFactor是Hashtable扩容前可以达到多满的一个尺度。这个参数是可以设置的,默认是0.75。加载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间(在大多数 Hashtable 操作中,包括 get 和 put 操作,都反映了这一点)。
4. Hashtable的四个构造函数




其实上面的前三个构造方法,最终都调用了第四个构造方法。如果在初始化Hashtable时,不指定加载因子loadFactor,那么加载因子会被设置为0.75f。
5. Hashtable的关键方法
Hashtable的contains方法

这里使用的是很简单的两层for循环,外层是在table上,内层是在链表上检索,通过equals方法来比对。
Hashtable的get方法

get方法是synchronized方法,多线程执行的时候给整个hashtable对象加锁,这样一来效率肯定会打折扣,但是线程是安全的。
在hashtable中,index = (hash & 0x7FFFFFFF) % tab.length,将key.hashCode()除去符号位模上tab.length。目前hashtable仍然只使用了链表去解决hash碰撞问题,因此,如果tab[index]没找到,则遍历链表继续查找即可,算法复杂读O(n)。
在查找的时候除了比较hash值以外还会要求e.key.equals(key)对内容进行比较,因为key不允许为null,因此e.key也能保证不为null。
Hashtable的put方法

上面为put方法,put方法还是比较简单的,已经存在就更新value值,冲突了就添加到链表头部。
Hashtable的addEntry方法

这个方法需要注意链接新节点的时候,新的结点是链表表头。
6. hashtable 的5中遍历方式(本地试了下 第4中最快就是枚举遍历)。
//第一种hashtable遍历方式
System.out.println("第一种遍历方式");
for(Iterator<String> iterator=hashtable.keySet().iterator();iterator.hasNext();){
String key=iterator.next();
System.out.println("key-----"+key);
System.out.println("value--------"+hashtable.get(key));
}
//第二种hashtable遍历方式
System.out.println("第二种遍历方式");
for(Iterator<Entry<String, String>> iterator=hashtable.entrySet().iterator();iterator.hasNext();){
Entry<String,String> entry=iterator.next();
.ge
tKey());
System.out.println("value------------"+entry.getValue());
}
//第三种hashtable遍历方式
System.out.println("第三种遍历方式");
for(Map.Entry<String, String> entry: hashtable.entrySet()){
System.out.println("key---------"+entry.getKey());
System.out.println("value--------"+entry.getValue());
}
//第四种遍历方式
System.out.println("第四种遍历方式");
Enumeration<String> e=hashtable.keys();
while(e.hasMoreElements()){
String key=e.nextElement();
System.out.println("key-----"+key);
System.out.println("value-------"+hashtable.get(key));
}
//第五中遍历方式(获取所有的值)
System.out.println("第五种遍历方式");
Enumeration<String> e2=hashtable.elements();
while (e2.hasMoreElements()) {
String string = (String) e2.nextElement();
System.out.println(string);
}
}
java.util.HashTable (JDK1.8)的更多相关文章
- java.util.HashMap和java.util.HashTable (JDK1.8)
一.java.util.HashMap 1.1 java.util.HashMap 综述 java.util.HashMap继承结构如下图 HashMap是非线程安全的,key和value都支持nul ...
- java.util.Hashtable源码分析
Hashtable实现一个键值映射的表.任何非null的object可以用作key和value. 为了能存取对象,放在表里的对象必须实现hashCode和equals方法. 一个Hashtable有两 ...
- 分析 java.util.Hashtable 源码
概述 基于J11,该类已经淘汰,如果使用线程安全的则用 ConcurrentHashMap ,用线程不安全的则使用 HashMap .仅与HashMap进行比较 结构以及依赖关系 HashTable ...
- java.util.HashSet, java.util.LinkedHashMap, java.util.IdentityHashMap 源码阅读 (JDK 1.8)
一.java.util.HashSet 1.1 HashSet集成结构 1.2 java.util.HashSet属性 private transient HashMap<E,Object> ...
- java.util.HashSet, java.util.LinkedHashMap, java.util.IdentityHashMap 源码阅读 (JDK 1.8.0_111)
一.java.util.HashSet 1.1 HashSet集成结构 1.2 java.util.HashSet属性 private transient HashMap<E,Object> ...
- java util包概述
util是utiliy的缩写,意为多用途的,工具性质的包这个包中主要存放了:集合类(如ArrayList,HashMap等),随机数产生类,属性文件读取类,定时器类等类.这些类极大方便了Java编程, ...
- Java:Hashtable
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- java.util包详解
介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...
- Java-API:java.util百科
ylbtech-Java-API:java.util百科 包含集合框架.遗留的 collection 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期 ...
随机推荐
- 《浏览器工作原理与实践》<11>this:从JavaScript执行上下文的视角讲清楚this
在上篇文章中,我们讲了词法作用域.作用域链以及闭包,接下来我们分析一下这段代码: var bar = { myName:"time.geekbang.com", printName ...
- C# Winfrom DataGridView DataSource绑定数据源后--解决排序问题
帮助类: public class SortBindingHelper<T> : BindingList<T> { private bool isSortedCore = tr ...
- Djang drf:APIView源码分析
Django REST framework 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 开发REST AP ...
- 机器学习(十)—聚类算法(KNN、Kmeans、密度聚类、层次聚类)
聚类算法 任务:将数据集中的样本划分成若干个通常不相交的子集,对特征空间的一种划分. 性能度量:类内相似度高,类间相似度低.两大类:1.有参考标签,外部指标:2.无参照,内部指标. 距离计算:非负性, ...
- PHP数组赋值
<?php $array1 = array('a','b'); $array2 = array('a'=>array('1','2'),'b'=>array('3','4')); $ ...
- 大数据之路week02 Collection 集合体系收尾(Set)
1.Set集合(理解) (1)Set集合的特点 无序,唯一. (2)HashSet集合(掌握) A: 底层数据结构是哈希表(是一个元素为链表的数组) B: 哈希表底层依赖两个方法: hashCode( ...
- laravel本地开发环境的安装及配置 - Windows:安装 Laravel Homestead 虚拟机
一.安装 VirtualBox-5.2.22-126460-Win.exe 和 vagrant_2.2.2_x86_64.msi(可视化安装包安装); 安装在D盘 二.导入 Homestead Vag ...
- Oracle12c-ADG搭建
实验环境: 角色 IP hostname CDB name db_unique_name pdb name 版本 主 192.168.0.115 Node11 cdb1 cdb_p pdb1 12.2 ...
- Shiro (包含权限满足其中一个就通过的用法)
方法/步骤 1 web.xml添加配置 <!-- shiro过滤器 --> <filter> <filter-name>shiroFilter</filter ...
- Apache 下载+安装
1.官网下载Apache 官网地址:https://httpd.apache.org/ 点击Download 上面那段话,大致意思:很高兴Apache服务器2.4.18版本的发布.在2.4.x的分支的 ...