总的来说java容器分为两大派系,即Collection和Map
Collection实现了Itarable接口,这是为了给其子类提供规范的遍历方法,比如ArrayList使用数组存储,HashSet使用散列存储,其遍历方法肯定是不一致的,要求所有子类实现统一的Itarator方法,向调用者返回迭代器遍历(迭代器模式):迭代器迭代过程中,不允许进行除迭代器自己的remove之外的方法操作集合,否则报错;另外List接口还提供了ListIterator(Iterator子类)的方法,可以正/逆序遍历集合,也可对集合进行系列操作(使用ListIerator的API)。
Collection主要子接口包括Set(无序,不可重复)、List(有序,可重复)、Queue.
Set主要有HashSet、LinkedHashSet、TreeSet等实现类。
其中HashSet使用散列数据结构存储元素,底层利用HashMap,储存的元素无序,且不能重复(HashMap键不能重复)。那么HashSet是如何判断元素是否重复的呢?因为是散列结构,储存的元素先调用hashCode方法,得到Hash值,如果已有元素没有hash值重复的,直接存入,否则会继续调用equals方法,若equals方法相等则视为重复元素,否则可存入。哈希冲突,使用链表法解决。
LinkedHashSet是HashSet的子类,该实现类可以保证存入的顺序与遍历的顺序一致。
TreeSet二叉树结构。可存入的元素排序,关键点:存入的元素必须满足实现Comparable接口(CompareTo方法),否则报错,在构造TreeSet时,也可传入一个实现了Comparator接口的实现类(策略模式。底层判断Comparator是否为空,为空执行默认策略,否则执行新的比较策略)
Comparator和Comparable比较:实体类实现Comparable接口,使用TreeHashSet/TreeHashMap时,使用默认策略CompareTo方法进行比较,或者在客户端编写代码时需要改变比较策略,则实现一个Comparator的比较策略传入。
List主要有ArrayList、LinkedList、Vector、Stack等子类
其中ArrayList底层使用数组实现,查询快,删除慢,线程不安全。
Vector使用数组实现,查询快,删除慢,方法都加 有syncrolized,线程安全。Vector扩容一倍,ArrayList扩容0.5倍,有利于节省空间。
Stack是Vector的子类。栈结构
增强for循环必须有被遍历的目标。目标只能是Collection或者是数组。
Map接口:
主要子类有HashMap,LinkedHashMap,TreeMap,HashTable,Properties
其中,HashMap储存顺序与遍历顺序不一样,LinkedHashMap则可保证顺序一致,TreeMap底层是红黑树,对键值会进行排序,当然要求键的类型实现Comparable
HashMap与HashTable区别:HashMap允许空值、线程不安全,HashTable不能为空值、线程安全,HashMap把HashTable的contains方法去掉了,加入了containsKey和containsValue,HashTable的子类Properties应用得多。
Queue接口:
子接口Dueue,LikedList,优先队列是实现类.优先队列按自然顺序排序或者自己传入一个比较器