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);
}
}

最新文章

  1. 如何拿到国内IT巨头的Offer
  2. 【UESTC 482】Charitable Exchange(优先队列+bfs)
  3. Spring声明式事务的配置~~~
  4. spring-data-redis --简单的用spring-data-redis
  5. (转)几种HtmlEncode的区别
  6. Windows命令行(DOS命令)教程-5 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_4.html
  7. [Unity3D]Unity3D发展偷看游戏初期阶段NGUI
  8. OSGi-开发环境的建立和HelloWorld(04)
  9. nginx与Elasticsearch结合使用
  10. python __getattra__()
  11. 记一次zookeeper单机伪集群分布
  12. 深入理解内存模型JMM
  13. Linux之Redis安装
  14. os.walk() 目录生成器
  15. python 内置方法join 给字符串加分隔符
  16. 使用CSS渐变
  17. GGSN与SGSN简介
  18. Spring JDBC批量操作
  19. HBase(八)HBase的协处理器
  20. [置顶] VS 2017 众多重构插件

热门文章

  1. SpringCloud之RabbitMQ消息队列原理及配置
  2. Linux shell循环遍历
  3. 云服务器搭建Jupyter-主要部分为配置服务器安全组
  4. asp.netMVC中使用aop进行关注点分离
  5. 【转】Elastic-Job
  6. 2018年长沙理工大学第十三届程序设计竞赛 I 连续区间的最大公约数
  7. 从c到c++&lt;一&gt;
  8. nginx用指针的值的最后一位来判断过期事件
  9. ocr 识别 字体大小问题?
  10. iView的tree组件实现单选功能