不太简单的来说hashtable和hashmap

hashMap只是使用的hashtable的原理,并没有继承关系
所以
数组与链表。数组的特点就是查找容易,插入删除困难;而链表的特点就是查找困难,但是插入删除容易。既然两者各有优缺点,那么我们就将两者的有点结合起来,让它查找容易,插入删除也会快起来。哈希表就是讲两者结合起来的产物

为什么hashMap的key和value都允许为null值但是key只能为一个null
在hashMap中key为null的键值对永远都放在以table[0]为头结点的链表中。
hashMap的存储结构
不太简单的来说hashtable和hashmap
图中,数字部分即代表哈希表,也称为哈希数组,数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。

hashMap的扩容机制
HashMap内存储数据的Entry数组默认是16,如果没有对Entry扩容机制的话,当存储的数据一多,Entry内部的链表会很长,这就失去了HashMap的存储意义了。所以HasnMap内部有自己的扩容机制。HashMap内部有:
变量size,它记录HashMap的底层数组中已用槽的数量;
变量threshold,它是HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子)
变量DEFAULT_LOAD_FACTOR = 0.75f,默认加载因子为0.75
HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容

hashMap的构造方法中提供了自定义初始容量和加载因子的方法

更深入的讲解hashMap:
http://blog.****.net/ns_code/article/details/36034955

hashMap只是使用的hashtable的原理,并没有继承关系
所以
数组与链表。数组的特点就是查找容易,插入删除困难;而链表的特点就是查找困难,但是插入删除容易。既然两者各有优缺点,那么我们就将两者的有点结合起来,让它查找容易,插入删除也会快起来。哈希表就是讲两者结合起来的产物

为什么hashMap的key和value都允许为null值但是key只能为一个null
在hashMap中key为null的键值对永远都放在以table[0]为头结点的链表中。

hashMap的扩容机制
HashMap内存储数据的Entry数组默认是16,如果没有对Entry扩容机制的话,当存储的数据一多,Entry内部的链表会很长,这就失去了HashMap的存储意义了。所以HasnMap内部有自己的扩容机制。HashMap内部有:
变量size,它记录HashMap的底层数组中已用槽的数量;
变量threshold,它是HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子)
变量DEFAULT_LOAD_FACTOR = 0.75f,默认加载因子为0.75
HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容

hashMap的构造方法中提供了自定义初始容量和加载因子的方法

更深入的讲解hashMap:
http://blog.****.net/ns_code/article/details/36034955