zoukankan      html  css  js  c++  java
  • 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);
    }
    }

  • 相关阅读:
    当上微软MVP了
    关于南京四校联合程序设计大赛
    毕业生的商业软件开发之路初入职场
    开源XDesigner ORM 框架设计
    中国计算机软件行业分析3软件倾销
    中国计算机软件行业分析6软件外包的缺陷
    搜狐首页出现一个硕大的错别字
    中国计算机软件行业分析4外企的商业贿赂
    大家快来玩转盘抽奖游戏(走在网页游戏开发的路上(七))
    走在网页游戏开发的路上(四)
  • 原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/10537050.html
Copyright © 2011-2022 走看看