| 
 
| Java容器: Collection
 ├List       接口
 │├LinkedList       链表
 │├ArrayList         顺序结构动态数组类
 │└Vector         向量
 │ └Stack       栈
 └Set
 
 
 
 Collection中常用的又分为两种类型的接口:List和Set,两者最明显的差别为List支持放入重复的对象,而Set不支持。List接口常用的实现类有:ArrayList,LinkedList,Vector和Stack;Set接口常用的实现有HashSet,TreeSet。而Map的常用实现有TreeMap和HashMap。
 
 List (inteface)
 
 次序是List 的最重要特点,它确保维护元素特定的顺序.
 --ArrayList 允许对元素快速随机访问.
 --LinkedList 对顺序访问进行优化,向List 中间插入与移除的开销并不大,具有addFrist(),addLast(),getFirst,getLast,removeFirst和removeLast().这些方法使得LinkedList可当作堆栈/队列/双向队列.
 
 1. ArrayList基于数组方式实现,无容量的限制。
 
 2. ArrayList在执行插入元素时可能要扩容,在删除数组时并不会减少数组的容量(如希望相应的减少数组的容量,可以调用ArrayList的trimToSize()),在查找元素时需要遍历数组,对于非null的元素采取equals的方式寻找。
 
 3.ArrayList是非线程安全的。
 
 1. LinkedList基于双向链表机制实现。
 
 2. LinkedList在插入元素时,必须创建一个新的Entry对象,并切换相应元素的前后元素的引用;在查找元素时,须遍历列表;在删除元素时,要遍历列表,找到要删除的元素,然后从列表上将此元素删除即可。
 
 3. LinkedList是非线程安全的。
 
 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
 
 Set (inteface)
 
 存入Set 的每个元素必须唯一,不保证维护元素的次序.加入Set 的Object必须定义equals()方法
 --HashSet 为快速查找而设计的Set ,存入HashSet对象必须定义hashCode().
 --TreeSet  保护次序的Set ,使用它可以从Set 中提取有序序列.
 --LinkedHashSet  具有HashSet的查询速度,且内部使用链表维护元素的次序.
 它们之间的存储方式不一样:
 TreeSet采用红黑树的树据结构排序元素.
 HashSet采用散列函数,这是专门为快速查询而设计的.
 LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序.
 
 使用HashSet/TreeSet时,必须为类定义equals();而HashCode()是针对HashSet,作为一种编程风格,当覆盖equals()的时候,就应该同时覆盖hashCode().
 
 | 
 |