Hashtable和HashMap深入学习心得

来源:互联网 发布:张艺兴新经纪人知乎 编辑:程序博客网 时间:2024/06/08 06:27

转自: http://hi.baidu.com/onlylamplight/blog/item/4b42345d0a65b248fbf2c0b7.html

 

在弄清楚这几个集合类前先必须要清楚的知道Hash所谓Hash,一般是一个整数,通过某种算法,可以把一个字符串"压缩成一个整数,这个数称为Hash。当然,一个32位的数是不可能反映出全部的字符串的,所以有的时候会出现Hash冲突。(ps哈希表又名散列表)哈希表主要目的是用于解决数据的快速定位问题。我们在在所有的线性数据结构的查找中数组是最快的因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的。只是哈希表通过一个哈希算法把key转换成了这个数组下标,所以在hash算法中的key不能为null

 

Hashtable

 

jdk帮助文档中是这样写HashTable的:此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。HashTable中有两个重要的参数(初始容量 加载因子),其中初始容量就是是哈希表中 (哈希表并不是用一个简单的数组来表示的,他的数组元素也是一个复杂的数据结构,这里的桶我想就是指的这些元素吧)的数量。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。通过Hashtable的源码我们可以发现,他的很多操作前面都加了synchronized关键字,就是为了使Hashtable线程安全,所以Hashtable是同步的。

 

HashMap

HashMapHashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key,由于非线程安全,效率上可能高于HashtableHashMap的数据是无序的。在jdk帮助文档上对HashMap的实例化这样写到:最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

                      Map m = Collections.synchronizedMap(new HashMap(...));

原创粉丝点击