虽是读书笔记,可是如转载请注明出处http://segmentfault.com/blog/exploring/
..拒绝伸手复制党segmentfault
容器之间的区别一般归结为:由什么在背后“支持”它们,即,所使用的接口是由什么样的数据结构实现的。数组
# 对 List 的 选择:
ArrayList 和 LinkedList 基本的 List 操做是相同的。可是 ArrayList 底层是 数组实现的,LinkedList 是双向链表实现的(其中每一个对象包含数据的同时还包含指向链表中前一个元素和后一个元素的应用)。
所以,若是常常在表中插入删除应该使用 LinkedList,若是大量随机访问元素,应该使用ArrayList.安全
最佳的作法多是将 ArrayList 做为默认首选,只有你须要使用额外的功能,或者当程序的性能由于常常插入和删除变差的时候,才去选择LinkedList.数据结构
# 对 Set 的选择
Set 能够被实现为 TreeSet, HashSet, LinkedHashSet. 能够根据所须要的行为来选择不一样的接口。性能
行为: HashSet 最经常使用,特别添加和查询元素的时候速度快;
LinkedHashSet 保持元素的插入顺序; 插入操做,LinkedHashSet 比HashSet 代价更高,这是由维护链表所带来额外开销形成的。
TreeSet 基于TreeMap,1. 生成一个维持元素处于排序状态的Set. 只有当须要一个排好序的 Set 时,才应该使用TreeSet. 由于其内部结构支持排序。 2. 用 TreeSet 迭代速度比 HashSet 速度快。线程
# 对 Map 的选择
除了 IdentityHashMap, 全部的Map实现插入和删除操做都会随着Map尺寸的变大而明显变慢。可是查找的代价要比插入小不少。code
Hashtable 的性能大致上与 HashMap 至关,由于HashMap 是用来替代 Hashtable 的,所以他们使用了相同的底层和查找机制。使用 Map 时候,第一选择应该是hashmap.
LinkedHashMap 比 HashMap 慢, 代价更高,这是由维护散列结构的同时还要维护链表所带来额外开销形成的。
TreeMap 一般比 HashMap 慢。 与使用 TreeSet 同样,TreeMap 是一种建立有序列表的方式。
IdentityHashMap 具备彻底不一样的性能,由于它使用 == 而不是 equal() 来比较元素。对象
应该避免使用Vector,它只存在于支持遗留代码的类库中。blog
ArrayList 和 Vector 区别?
Vector 和 ArrayList 都是基于Object[] array 数组来实现的,根据索引来访问元素。两者最大的区别就是同步的使用。
Vector 中全部方法都是直接或者间接同步的,因此 Vector 是线程安全的(即多个线程操做同一个 vector 对象时是线程安全的),可是只有一个线程操做时考虑到同步控制会耗费系统资源因此效率低。
ArrayList 中的全部方法都是线程非同步的,但有多个线程操做时是不安全的。排序