HashTable的使用和原理


一、---使用方式---



(1)Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。

(2)Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。

(3)Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。

如下是Hashtable 的简单使用方式:在遍历时使用是三种遍历方式来对其进行遍历

package ThreeWeek;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class HashTableTest {

	public static void main(String args[]){
		Hashtable<String, Integer> table = new Hashtable<String, Integer>();
		
		//[1]添加元素
		table.put("zhangsan", 22);
		table.put("lisi", 33);
		table.put("wangwu", 44);
		
		//[2]toString()方式打印
		System.out.println(table.toString());
		
		//[3]Iterator遍历方式1--键值对遍历entrySet()
		Iterator<Entry<String, Integer>> iter = table.entrySet().iterator();
		while(iter.hasNext()){
			Map.Entry<String, Integer> entry = (Map.Entry<String, Integer>)iter.next();
			String key = entry.getKey();
			int value = entry.getValue();
			System.out.println("entrySet:"+key+" "+value);
		}
		
		System.out.println("====================================");
		
		//[4]Iterator遍历方式2--key键的遍历
		Iterator<String> iterator = table.keySet().iterator();
		while(iterator.hasNext()){
			String key = (String)iterator.next();
			int value = table.get(key);
			System.out.println("keySet:"+key+" "+value);
		}
		
		System.out.println("====================================");
		
		//[5]通过Enumeration来遍历Hashtable
		Enumeration<String> enu = table.keys();
		while(enu.hasMoreElements()) {
		    System.out.println("Enumeration:"+table.keys()+" "+enu.nextElement());
		} 
			
	}
}
--------------------output--------------------

{zhangsan=22, lisi=33, wangwu=44}
entrySet:zhangsan 22
entrySet:lisi 33
entrySet:wangwu 44
====================================
keySet:zhangsan 22
keySet:lisi 33
keySet:wangwu 44
====================================
Enumeration:java.util.Hashtable$Enumerator@139a55 zhangsan
Enumeration:java.util.Hashtable$Enumerator@1db9742 lisi
Enumeration:java.util.Hashtable$Enumerator@106d69c wangwu


二、---内部原理---



1、继承关系

java.lang.Object
   ↳     java.util.Dictionary<K, V>
         ↳     java.util.Hashtable<K, V>

public class Hashtable<K,V> extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable { }
与HashMap不同的是Hashtable是继承Dictionary,实现了Map接口。Map是"key-value键值对"接口,Dictionary是声明了操 作"键值对"函数接口的抽象类。 


2、构造函数

(1)Hashtable中提供了四个构造函数,如下:

// 默认构造函数。
public Hashtable() 

// 指定“容量大小”的构造函数
public Hashtable(int initialCapacity) 

// 指定“容量大小”和“加载因子”的构造函数
public Hashtable(int initialCapacity, float loadFactor) 

// 包含“子Map”的构造函数
public Hashtable(Map<? extends K, ? extends V> t)


(2)上面的四个构造方法中,第三个是最重要的,指定初始化容量和构造因子

public Hashtable(int initialCapacity, float loadFactor) {  
        //验证初始容量  
        if (initialCapacity < 0)  
            throw new IllegalArgumentException("Illegal Capacity: "+  
                                               initialCapacity);  
        //验证加载因子  
        if (loadFactor <= 0 || Float.isNaN(loadFactor))  
            throw new IllegalArgumentException("Illegal Load: "+loadFactor);  
  
        if (initialCapacity==0)  
            initialCapacity = 1;  
          
        this.loadFactor = loadFactor;  
          
        //初始化table,获得大小为initialCapacity的table数组  
        table = new Entry[initialCapacity];  
        //计算阀值  
        threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);  
        //初始化HashSeed值  
        initHashSeedAsNeeded(initialCapacity);  
    }  


3、成员变量

(1)table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的"key-value键值对"都是存储在Entry数组中的。 

(2)count是Hashtable的大小,它是Hashtable保存的键值对的数量。 

(3)threshold是Hashtable的阈值,用于判断是否需要调整Hashtable的容量。threshold的值="容量*加载因子"。

(4)loadFactor就是加载因子。

(5)modCount是用来实现fail-fast机制的

 private transient Entry[] table;
// Hashtable中元素的实际数量
private transient int count;
// 阈值,用于判断是否需要调整Hashtable的容量(threshold = 容量*加载因子)
private int threshold;
// 加载因子
private float loadFactor;
// Hashtable被改变的次数
private transient int modCount = 0;


4、put和get方法

(1)put方法

从下面的代码中我们可以看出,Hashtable中的key和value是不允许为空的,当我们想要想Hashtable中添加元素的时候,首先计算key的hash值,然

后通过hash值确定在table数组中的索引位置,最后将value值替换或者插入新的元素,如果容器的数量达到阈值,就会进行扩充。

public synchronized V put(K key, V value) {  
        // 确保value不为null  
        if (value == null) {  
            throw new NullPointerException();  
        }  
  
        /* 
         * 确保key在table[]是不重复的 
         * 处理过程: 
         * 1、计算key的hash值,确认在table[]中的索引位置 
         * 2、迭代index索引位置,如果该位置处的链表中存在一个一样的key,则替换其value,返回旧值 
         */  
        Entry tab[] = table;  
        int hash = hash(key);    //计算key的hash值  
        int index = (hash & 0x7FFFFFFF) % tab.length;     //确认该key的索引位置  
        //迭代,寻找该key,替换  
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {  
            if ((e.hash == hash) && e.key.equals(key)) {  
                V old = e.value;  
                e.value = value;  
                return old;  
            }  
        }  
  
        modCount++;  
        if (count >= threshold) {  //如果容器中的元素数量已经达到阀值,则进行扩容操作  
            rehash();  
            tab = table;  
            hash = hash(key);  
            index = (hash & 0x7FFFFFFF) % tab.length;  
        }  
  
        // 在索引位置处插入一个新的节点  
        Entry<K,V> e = tab[index];  
        tab[index] = new Entry<>(hash, key, value, e);  
        //容器中元素+1  
        count++;  
        return null;  
    }  

(2)get方法

同样也是先获得索引值,然后进行遍历,最后返回

public synchronized V get(Object key) {  
        Entry tab[] = table;  
        int hash = hash(key);  
        int index = (hash & 0x7FFFFFFF) % tab.length;  
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {  
            if ((e.hash == hash) && e.key.equals(key)) {  
                return e.value;  
            }  
        }  
        return null;  
    }  


五、---比较不同---



Hashtable和HashMap到底有哪些不同呢

(1)基类不同:HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

(2)null不同:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。

(3)线程安全:HashMap时单线程安全的,Hashtable是多线程安全的。

(4)遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。



尊重作者,尊重原创,参考文章:

http://www.cnblogs.com/skywang12345/p/3310887.html#a1

http://cmsblogs.com/?p=618


相关推荐
<p> <strong><span style="color:#E53333;font-size:24px;"> 课程总体目标:</span></strong> </p> <p> <span style="font-size:16px;">    本中级篇面向的学员不再是完全的编程“小白”,而是具备一定C#编程经验,需要进一步查漏补缺、或者需要进一步全面完善自己C#编程知识体系的广大Unity学员。相信通过本中级篇的学习,可以使得Unity初中级开发人员对于编程语言的掌握更进一步;对于开发中大型游戏项目,在编程语言这一层级进一步打下坚实的语言基础。</span> </p> <p> <br /> </p> <p> <span style="font-size:24px;"><span style="color:#E53333;font-size:18px;"><strong>“中级</strong></span><span style="color:#E53333;font-size:18px;"><strong>篇”课程讲解特点:</strong></span></span> </p> <p> <span style="font-size:16px;">      本中级篇面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法难点,使得学员最短时间掌握语法本质。</span> </p> <p> <br /> </p> <p> <span style="font-size:18px;color:#E53333;"><strong>本课程讲解内容:</strong></span> </p> <p> <span style="font-size:16px;"> </span><span style="font-size:16px;">     </span><span style="font-size:16px;">"C#(for Unity)中级篇" 在“C#入门”、“基础篇”的基础之上,从以下四个方面着重研究我们游戏开发(包含软件开发)过程中,C#最重要、最实用的技能模块,使得广大游戏研发人员,对于C#这门Unity脚本有进一步更加完善的认识。</span><br /> <br /> <br /> <span style="font-size:16px;"><strong>一:.Net 框架讲解。</strong></span><br /> <span style="font-size:16px;">    A) .Net 发展历史。</span><br /> <span style="font-size:16px;">    B)  IL  中间语言。 CLR  公共语言运行时。</span><br /> <span style="font-size:16px;">    C) 多维数据(常用二维数组)与交错数组。</span><br /> <span style="font-size:16px;">    D) 可变参数 Params</span><br /> <span style="font-size:16px;">    E) 进一步解释“实参”,“形参”。</span><br /> <span style="font-size:16px;">    F) 类的实例化内存分配机制。</span><br /> <br /> <span style="font-size:16px;"><strong>二:深入学习对象类型</strong></span><br /> <span style="font-size:16px;">    A)  里氏替换原则(LSP)</span><br /> <span style="font-size:16px;">    B)  类的属性极其本质特性</span><br /> <span style="font-size:16px;">    C)  IS ,AS 关键字</span><br /> <span style="font-size:16px;">    D)  深入学习字符串理论</span><br /> <span style="font-size:16px;">        1] 字符串的“驻留性” 原理。</span><br /> <span style="font-size:16px;">        2] 字符串==与Equals() 的本质区别</span><br /> <span style="font-size:16px;">        3] 更多字符串常用方法学习。</span><br /> <span style="font-size:16px;">    E)  枚举类型以及适用场合。</span><br /> <br /> <span style="font-size:16px;"><strong>三:深入学习集合特性</strong></span><br /> <span style="font-size:16px;">    A)  什么是索引器,以及索引器的适用范围。</span><br /> <span style="font-size:16px;">    B)  学习自定义集合类,以及深入了解Foreach 语句的原理。</span><br /> <span style="font-size:16px;">    C)  深入学习 ArrayList,了解内部存储机制以及原理。</span><br /> <span style="font-size:16px;">    D)  深入学习 HashTable,了解内部存储机制以及原理。</span><br /> <span style="font-size:16px;">    E)  为什么学习泛型集合?</span><br /> <span style="font-size:16px;">    F)  泛型集合与普通集合的性能测试对比实验。</span><br /> <span style="font-size:16px;">    G)  学习“泛型约束”,以及“泛型约束”的适用条件。</span><br /> <br /> <span style="font-size:16px;"><strong>四:委托与事件</strong></span><br /> <span style="font-size:16px;">        A)  什么是委托,先从讲故事学习起:“老板来啦”!</span><br /> <span style="font-size:16px;">    B)  反编译掌握委托的本质。</span><br /> <span style="font-size:16px;">    C)  委托的四大开发步骤。</span><br /> <span style="font-size:16px;">    D)  什么是事件,以及委托与事件的区别。</span><br /> <span style="font-size:16px;">    E)  事件的常用使用方式。</span> </p> <p> <br /> </p> <p> <span style="font-size:18px;color:#E53333;">温馨提示:</span> </p> <p> <span style="font-size:16px;">      本C# for Unity 使用Virtual Studio2012,进行开发与讲解。(学员使用更高版本,对学习没有任何影响)</span> </p> <p> <!--StartFragment --> </p> <div> 一、热更新系列(技术含量:中高级):<br /> A:《lua热更新技术中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27087<br /> B:《热更新框架设计之Xlua基础视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27110<br /> C:《热更新框架设计之热更流程与热补丁技术》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27118<br /> D:《热更新框架设计之客户端热更框架(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27132<br /> E:《热更新框架设计之客户端热更框架(中)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27135<br /> F:《热更新框架设计之客户端热更框架(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27136<br /> 二:框架设计系列(技术含量:中级):<br />  A:《游戏UI界面框架设计系列视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27142<br /> B:《Unity客户端框架设计PureMVC篇视频课程(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27172<br /> C:《Unity客户端框架设计PureMVC篇视频课程(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27173<br /> D:《AssetBundle框架设计_框架篇视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27169<br /> 三、Unity脚本从入门到精通(技术含量:初级)<br /> A:《C# For Unity系列之入门篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4560<br /> B:《C# For Unity系列之基础篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4595<br /> C: 《C# For Unity系列之中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24422<br /> D:《C# For Unity系列之进阶篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24465<br /> 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)<br /> A:《虚拟现实之汽车仿真模拟系统 》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/26618<br /> 五、Unity基础课程系列(技术含量:初级)<br />  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》<br />  <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24643<br /> B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24645<br />  C:《Unity ECS(二) 小试牛刀》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27096<br /> 六、Unity ARPG课程(技术含量:初中级):<br /> A:《MMOARPG地下守护神_单机版实战视频课程(上部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24965<br /> B:《MMOARPG地下守护神_单机版实战视频课程(中部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24968<br /> C:《MMOARPG地下守护神_单机版实战视频课程(下部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24979<br /> </div> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页