Hashtable 与 HashMap 有什么不同?
HashTable和HashMap都是常用的Java集合类,它们的不同之处如下:
一、线程安全性:
HashTable是线程安全的:
即使多个线程同时访问HashTable中的元素也不会导致数据不一致和竞争条件等问题;
而HashMap是非线程安全的:如果多个线程同时访问HashMap中的元素,可能导致数据不一致和竞争条件问题。
二、迭代器不同:
Hashtable的迭代器(Iterator)是通过Enumeration接口实现的,而HashMap的迭代器是通过Iterator实现的,Iterator接口在功能上更加强大灵活,可以双向遍历集合元素(如List),并且可以进行删除操作。
Hashtable<String, Integer> hashtable = new Hashtable<>();
hashtable.put("one", 1);
hashtable.put("two", 2);
hashtable.put("three", 3);
Enumeration<Integer> enumeration = hashtable.elements();
while (enumeration.hasMoreElements()) {
Integer value = enumeration.nextElement();
System.out.println(value);
}
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("one", 1);
hashMap.put("two", 2);
hashMap.put("three", 3);
Iterator<Map.Entry<String,Integer>> iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String,Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " : " + value);
}
三、初始容量和扩容机制不同:
Hashtable默认的初始容量是11,每次扩容时容量变为原来的两倍加一;(2n+1)而HashMap默认的初始容量是16,每次扩容时容量变为原来的两倍。
综上所述,如果需要在多线程环境中使用集合类,应该选择Hashtable;如果不需要考虑线程安全问题,可以选择HashMap。同时,由于HashMap支持null值,因此在使用HashMap时要注意空指针异常的问题。