Java集合--08HashTable

Hashtable基础

Hashtable叫哈希表或散列表,是根据关键码值(Key value)而直接进行访问的数据结构,采用的是数据结构中所说的链地址法处理冲突的方法 。

public class HashTable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { }

(01)HashMap一样,Hashtable 也是一个散列表初始容量 11和 加载因子0.75,它存储的内容是键值对(key-value)映射,key-value都是存储在table数组中的。 (注意entry 数组里存值了,而传统hash 链表链地址法里没有存值)
(02)继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
(03)函数都是同步的,这意味着它是线程安全的,使用synchronized 。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

Hashtable优缺点

哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。

Hashtable 是非泛型的集合,元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

扩容时所有的数据需要重新进行散列计算(当rehash方法被调用以后,每一个键值对相应的index也会改变,也就等于将键值对重新排序了。虽然Hash具有O(1)的数据检索效率,但它空间开销却通常很大,是以空间换取时间。所以Hashtable适用于读取操作频繁,写入操作很少的操作类型。

总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。其他请参考HashMap

开散列法又叫链地址法(开链法)。 

    开散列法:首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。

开散列法有效的解决了数据溢出,不过需要增设链接指针,增加了存储的开销。但是,总体而言,效率还是快的多。

闭散列(即开放地址法)

    当发生哈希冲突时,如果该哈希表还没有被填满,那么就把该元素放到哈希表的下一个空闲的位置。

    优点:简单 易懂 
    缺点:一旦发生了哈希冲突,所有的冲突连接在一起,很容易产生数据”堆积”。即不同的数据占用可以利用的位置,就使得寻找其余数据的位置需要进行多次比较,就会导致查找的效率降低。

猜你喜欢

转载自blog.csdn.net/u013263066/article/details/86748018