他们内部都有一个数组,每个元素可能存储一个entry链表,存储每个entry的时候先计算key的hash值与数组长度取模%即可得到所在数组的位置下标
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,线程安全,而HashMap是非同步的,线程不安全,效率上逼hashTable要高。
3.hashMap允许空键值,而hashTable不允许。
4.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
5.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
6.HashMap的NULL key是放在table[0]的位置上
HashMap实现同步的方法:调用Collections的静态方法Collections.synchronizedMap(Map map);,返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
同时说一下,ArrayList和HashSet,他们也都不是同步的,都是线程不安全的,对其实现同步的方式和HashMap的方式相同,都允许使用null元素,ArrayList分配的初始空间为10,HashSet分配的初始空间为16