1、 什么是 Java 集合 API
Java 集合框架 API 是用来表示和操作集合的统一框架,它包含接口、实现类、以及帮助程序员完成一些编程的算法。简言之,API 在上层完成以下几件事:
- 编程更加省力,提高城程序速度和代码质量
- 非关联的 API 提高互操作性
- 节省学习使用新 API 成本
- 节省设计新 API 的时间
- 鼓励、促进软件重用
具体来说,有 6 个集合接口,最基本的是 Collection 接口,由三个接口 Set、List、SortedSet 继承,另外两个接口是 Map、SortedMap,这两个接口不继承 Collection,表示映射而不是真正的集合。
2、 什么是 Iterator
一些集合类提供了内容遍历的功能,通过 java.util.Iterator 接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用 Iterators 时,在获得 Iterator 的时候包含一个集合快照。通常在遍历一个 Iterator 的时候不建议修改集合本省。
3、 Iterator 与 ListIterator 有什么区别?
Iterator:只能正向遍历集合,适用于获取移除元素。ListIerator:继承 Iterator,可以双向列表的遍历,同样支持元素的修改。
4、 什么是 HaspMap 和 Map?
Map 是接口,Java 集合框架中一部分,用于存储键值对,HashMap 是用哈希算法实现 Map 的类。
5、 HashMap 与 HashTable 有什么区别?对比 Hashtable VS HashMap
两者都是用 key-value 方式获取数据。Hashtable 是原始集合类之一(也称作遗留类)。HashMap 作为新集合框架的一部分在 Java2 的1.2版本中加入。它们之间有一下区别:
- HashMap 和 Hashtable 大致是等同的,除了非同步和空值(HashMap 允许 null 值作为 key 和 value,而 Hashtable 不可以)。
- HashMap 没法保证映射的顺序一直不变,但是作为 HashMap 的子类 LinkedHashMap,如果想要预知的顺序迭代(默认按照插入顺序),你可以很轻易的置换为 HashMap,如果使用 Hashtable 就没那么容易了。
- HashMap 不是同步的,而 Hashtable 是同步的。
- 迭代 HashMap 采用快速失败机制,而 Hashtable 不是,所以这是设计的考虑点。
6、 在 Hashtable 上下文中同步是什么意思?
同步意味着在一个时间点只能有一个线程可以修改哈希表,任何线程在执行 hashtable 的更新操作前需要获取对象锁,其他线程等待锁的释放。
7、 什么叫做快速失败特性
从高级别层次来说快速失败是一个系统或软件对于其故障做出的响应。一个快速失败系统设计用来即时报告可能会导致失败的任何故障情况,它通常用来停止正常的操作而不是尝试继续做可能有缺陷的工作。当有问题发生时,快速失败系统即时可见地发错错误告警。在 Java 中,快速失败与 iterators 有关。如果一个 iterator 在集合对象上创建了,其它线程欲“结构化”的修改该集合对象,并发修改异常 (ConcurrentModificationException) 抛出。
8、 怎样使 Hashmap 同步?
HashMap 可以通过 Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。
9、 什么时候使用 Hashtable,什么时候使用 HashMap
基本的不同点是 Hashtable 同步 HashMap 不是的,所以无论什么时候有多个线程访问相同实例的可能时,就应该使用 Hashtable,反之使用 HashMap。非线程安全的数据结构能带来更好的性能。
如果在将来有一种可能—你需要按顺序获得键值对的方案时,HashMap 是一个很好的选择,因为有 HashMap 的一个子类 LinkedHashMap。所以如果你想可预测的按顺序迭代(默认按插入的顺序),你可以很方便用 LinkedHashMap 替换 HashMap。反观要是使用的 Hashtable 就没那么简单了。同时如果有多个线程访问 HashMap,Collections.synchronizedMap ()可以代替,总的来说 HashMap 更灵活。
10、为什么 Vector 类认为是废弃的或者是非官方地不推荐使用?或者说为什么我们应该一直使用 ArrayList 而不是 Vector
你应该使用 ArrayList 而不是 Vector 是因为默认情况下你是非同步访问的,Vector 同步了每个方法,你几乎从不要那样做,通常有想要同步的是整个操作序列。同步单个的操作也不安全(如果你迭代一个 Vector,你还是要加锁,以避免其它线程在同一时刻改变集合).而且效率更慢。当然同样有锁的开销即使你不需要,这是个很糟糕的方法在默认情况下同步访问。你可以一直使用 Collections.sychronizedList 来装饰一个集合。
事实上 Vector 结合了“可变数组”的集合和同步每个操作的实现。这是另外一个设计上的缺陷。Vector 还有些遗留的方法在枚举和元素获取的方法,这些方法不同于 List 接口,如果这些方法在代码中程序员更趋向于想用它。尽管枚举速度更快,但是他们不能检查如果集合在迭代的时候修改了,这样将导致问题。尽管以上诸多原因,oracle 也从没宣称过要废弃 Vector.