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 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期 ...
随机推荐
- 小白_开始学Scrapy__原理
整体架构 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务. 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回. 下载器(Dow ...
- 10 Windows编程——鼠标消息
和鼠标相关的三个属于:click,double-click,drag 鼠标消息和键盘消息不同:只要鼠标跨越某个窗口,或者在某个窗口中按键,消息. 客户去鼠标消息 WM_MOUSEMOVE WM_[L, ...
- Linux命令——netstat
参考:20 Netstat Commands for Linux Network Management Foreword Print network connections, routing tabl ...
- MySQL5.7安装详解及常见安装问题解决
数据库安装 Python开发使用mysql数据库5.5版本以上(django2.0之后放弃mysql5.5之前的支持),在mysql版本当中5.7之前的版本都有.exe或者.msi的可执行安装文件,但 ...
- java_数据类型转换
一.自动转换 目的类型比原来的类型要大,两种数据类型是相互兼容的. byte--->short short--->int char--->int int--->long/dou ...
- 深度学习—从LeNet到DenseNet
CNN从90年代的LeNet开始,21世纪初沉寂了10年,直到12年AlexNet开始又再焕发第二春,从ZF Net到VGG,GoogLeNet再到ResNet和最近的DenseNet,网络越来越深, ...
- Ubuntu系统---安装“搜狗拼音法”导致桌面打不开
Ubuntu系统---安装“搜狗拼音法”导致桌面打不开 ubuntu系统中文版,安装完后,自带中文输入法.中文用着好好的,用一段时间后,就会莫名的出现,切换不过来,中文输入不好用了.只是简单想装一个搜 ...
- Postman----登录接口返回的reponse中token值传递给其他接口的一个简单接口测试示例
注: 在进行接口测试时,我们都需要使用登录,并且其他的接口都要在登录后进行,那么必不可少的会使用到将登录接口的reponse返回结果中的某些参数值需要进行返回,并传递给其他接口,这样才可以进行登录后的 ...
- java判断文件是否为图片
/** * 判断文件是否为图片<br> * <br> * @param pInput 文件名<br> * @param pImgeFlag 判断具体文件类型< ...
- Spring MVC + freemarker实现半自动静态化
这里对freemarker的代码进行了修改,效果:1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件2,自由控制某个页面是否需要静态化原理:对org.springframe ...