Java HashMap、HashTable详解

来源:互联网 发布:linux ftp登录 编辑:程序博客网 时间:2024/06/06 18:09

    Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。


HashMap:

    1、HashMap中key和value都允许为null

    2、线程不安全。为实现线程安全,可以Collections.synchronizedMap()方法来获取一个线程安全的集合

    3、HashMap在不指定容量的情况下的默认容量为16,HashMap底层数组的容量要求一定为2的整数次幂

    4、加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 resize 操作(即扩容)。默认为0.75

    5、如果key为null,则直接从哈希表的第一个位置table[0]对应的链表上查找。如果key不为null,则先求的key的hash值,根据hash值找到在table中的索引。



HashTable:

    1、HashTable中key和value都不允许为null

    2、线程安全的,用于多线程下

    3、HashTable在不指定容量的情况下的默认容量为11,HashTable不要求底层数组的容量一定要为2的整数次幂


共同点:

    1、二者的存储结构(哈希表--》数组+链表)和解决冲突的方法都是相同的。

不同点:

1、两者计算hash的方法不同,Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模

2、线程安全性

3、初始化容量

4、HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类

5、HashMap可以使用null作为key,而Hashtable则不允许null作为key


   

0 0