我们知道Java容器类实际提供了四类接口:Map,List,Set和Queue,如下图所示,每种接口都有不止一个版本的实现,如果在实际编写程序时需要使用某种接口时该如何选择。
- 从Oracle的Java Language Best Practices 中的说明可以看到建议不要在新程序中使用HashTable,Vector,Stack使用HashMap,ArrayList和LinkedList来替换。
- ArrayList和LinkedList都实现了List接口,当ArrayList底层由数组实现,LinkedList由双向链表实现,因此在频繁使用插入删除操作时使用LinkedList,否则应该使用速度更快的ArrayList。
- Set接口由HashSet,TreeSet和LinkedHashSet实现,HashSet最常用,速度最快,LinkedHashSet保持元素的插入顺序,TreeSet实现基于TreeMap,生成处于排序状态的Set。
- List的ArrayList和LinkedList实现在并发编程时会产生所谓的Fail-Fast问题,此时需要使用CopyOnWriteArrayList来代替。
- 除了IdentityHashMap,所有的Map实现的插入操作都会随着Map尺寸的变大而明显变慢,但是查找的代价要比插入的代价小得多,我们使用的查找操作也会更加频繁。
- TreeMap比HashMap慢,TreeMap是一种创建有序列表的方式。
- LinkedHashMap在执行插入操作时比HashMap慢一点,因为它维护散列数据结构的同时还要维护链表。
- IdentityHashMap具有更好的性能,因为它使用==而不是equals()来比较元素。