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 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期 ...
随机推荐
- web容器(weblogic、resin、tomcat、jboss对比)
WebLogic 12c Linux静默安装 weblogic11g 密码忘记解决方案 glassfish和tomcat各自的优势和劣势 Linux Resin4.0 安装配置(优质) 对比 . we ...
- 【JavaWeb】通过邮件找回密码
前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...
- WdatePicker日期控件使用与值获取,以及选择日期完毕触发事件
踩过无数坑,调试了很长时间,写出适合自己需求的方法需求:没有查询按钮,要求选择日期后自动触发查询事件(只有日期选择完成后才触发), 解决方案:代码如下:检索开始时间: <input type=& ...
- 由java派生出来的证书错误
未安装请求对应接口证书时的异常:> javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: ...
- Js调用本地exe的方式
1. 使用记事本(或其他文本编辑器)创建一个myprotocal.reg文件,并写入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSE ...
- less-important
!important关键字:会为所有混合带来的样式,添加!important 在css里面加上!important,是所有样式优先级最高的 在less里面什么场景会用important,在调试的时候 ...
- python3 基础二——基本的数据类型二
一.数字(Number) 1.Python支持三种不同的数值类型:整型(int),浮点型(float),复数(complex) 2.Python数字数据类型用于存储数值 3.数据类型是不允许改变的,这 ...
- go语言合并两个数组
https://stackoverflow.com/questions/16248241/concatenate-two-slices-in-go Add dots after the second ...
- Spring-使用JAVA的方式配置Spring-代理模式
9.使用Java的方式配置Spring 我们现在要完全不使用Spring的xml配置了,全权交给Java来做! JavaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功 ...
- [WebMethod]参数介绍
一.WebService的调试 net 2.0新建webservice为了安全考虑,默认关闭了Post和Get方法 .让其打开,可在Web.config文件的<system.web>下增加 ...