HashMap和HashTable异同点
底层数据: HashMap和HashTable底层数据结构相同,都是以数组加链表形式存储数据。
继承关系: HashMap和HashTable都实现了Clonable ,Map,Serializable接口。 但不同的是HashTable继承了Dictionary接口。
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable{}
增长方式: 扩容时机相同,都是在size大于扩容阈值(数组容量×加载因子)的时候进行扩容。 但HashMap扩容方式是2table.length ,而HashTable是2table.length + 1。
内部方法 : HashTable的put方法,remove方法都有关键字sychronized修饰(确保安全性)。
Key-Value键值对:HashMap中的key不能重复,key和value都可以为null。 而HashTable的key和value都不能为null。
遍历方式:HashMap可以通过迭代器进行遍历。 而HashTable有特有的枚举方法进行遍历。
Key—Value为null情况:HashMap的put方法: HashMap遇到key为null的时候,调用putForNullKey方法进行处理,而对value没有处理;Hashtable遇到null,直接返回NullPointerException。
安全性: HasMap线程不安全,Hashtable线程安全(因为有关键字Sychronized修饰)
其他:
HashMap 和 hashtable= (同时处理(put)10W,100W,40000W数据) ,比较快慢?
HashMap<Integer,Integer> hashMap = new HashMap<>();
long b = System.currentTimeMillis();
for(int i=0; i<NUM; i++) {
hashMap.put((int) (Math.random()*10),(int) (Math.random()*10));
}
long e = System.currentTimeMillis();
System.out.println("hashmap time : " + (e-b));
Hashtable<Integer,Integer> hashtable = new Hashtable<>();
long b1 = System.currentTimeMillis();
for(int i=0; i<NUM; i++) {
hashtable.put((int) (Math.random()*10),(int) (Math.random()*10));
}
long e1 = System.currentTimeMillis();
System.out.println("hashtable time : " + (e1-b1));
结果::HashMap 比 hashtable 快。
原因(hashtable:sychronized修饰,java程序和操作系统相互切换 (用户端和内核相互切换)) 而HashMap只在用户端操作,不用切换。 (在单线程下 数据不多的情况用HashMap。)
sychronized关键字是一个重量级锁(只能有一个线程对其进行操作),涉及用户空间和内核空间的切换 ;