一、HashMap和Hashtable的区别
1.共同点:都是双列集合,底层都是哈希算法
2.区别:
- HashMap是线程不安全的,效率高,Hashtable是线程安全的,效率低;
- HashMap可以存储null键和null值,Hashtable不可以存储null键和null值
- HashMap和Hashtable父类是不一样的。HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口
- 对外提供的接口不同 Hashtable比HashMap多提供了elments() 和contains() 两个方法。
⚠️ HashTable已经被淘汰了,不要在代码中再使用它。
简单来说就是,如果你不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。
二、Iterator
1. 底层原理
2. Java要求集合必须实现Iterable接口,才能使用for-each语法糖遍历该集合的实例。
- foreach底层采用iterator对元素进行遍历。因为创建iterator的代价很小。
- for-each遍历的集合对象不能为null. 既然对集合的for-each遍历实际上是使用迭代器,会调用集合对象的iterator()方法获得迭代器,那么,对null集合的for-each遍历,就会在null集合对象上调用方法,势必会抛出空指针异常。
- for-each遍历时不能改变正在遍历的集合. 因为在使用迭代器遍历集合时,不能够改变集合,所以for-each遍历时改变集合,同样会引发ConcurrentModificationException异常。