本文是阅读《Java编程的逻辑》进行的学习笔记总结,如有错误望各位指正

抽象容器类与接口和具体容器类的关系下图所示。
虚线框表示接口,有CoIIction、List、Set、Queue、Deque和Map。有6个抽象容器类。

  1. AbstractCollection:实现了 Collection接口,被抽象类 AbstractList、 AbstractSet、 AbstractQueue继承, ArrayDeque也继承自 AbstractCollection(图中未画出)
  2. AbstractList:父类是 AbstractCollection,实现了List接口,被 ArrayList、 Abstract-SequentialList继承。
  3. AbstractSequentialList:父类是 AbstractList,被 LinkedList继承
  4. AbstractMap:实现了Map接口,被 TreeMap、 HashMap、 EnumMap继承
  5. AbstractSet:父类是 Abstract Collection,实现了Set接口,被 HashSet、 TreeSetEnumSet和继承。
  6. AbstractQueue:父类是 AbstractCollection,实现了 Queue接口,被 Priority Queue继承。

java 容器位置 java 容器类 详解_容器类

Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也 没有规定是否有重复元素。

List是 Collection的子接口,表示有顺序或位置的数据集合,增加了根据索引位置进行操作的方法。它 有两个主要的实现类: ArrayListLinkedList和。 ArrayList基于数组实现, LinkedList基于链表实现;ArrayList的随机访问效率很高,但从中间插入和删除元素需要移动元素,效率比较低, LinkedList则正好相反,随机访问效率比较低,但增删元素只需要调整邻近节点的链接。

Set也是Collection的子接口,它没有增加新的方法,但保证不含重复元素。它有两个主要的实现类: HashSet和TreeSet。HashSet基于哈希表实现,要求键重写 hash Code方法,效率更高,但元素间没有顺序; TreeSet基于排序二叉树实现,元素按比较有序,元素需要实现 Comparable接口,或者创建 TreeSet时提供 一个Comparator对象。 HashSet还有一个子类LinkedHashSet可以按插入有序。还有一个针对枚举类型的实现类 EnumSet,它基于位向量实现,效率很高。

Queue是Collection的子接口,表示先进先出的队列,在尾部添加,从头部查看或删除。 Deque是 Queue的子接口,表示更为通用的双端队列,有明确的在头或尾进行查看、添加和删除的方法。普通队列 有两个主要的实现类: LinkedList和ArrayDeque。LinkedList基于链表实现, ArrayDeque基于循环数组实现。一般而言,如果只需要 Deque接口,ArrayDeque的效率更高一些。

Map接口表示键值对集合,经常根据键进行操作,它有两个主要的实现类: HashMap和TreeMap。

HashMap基于哈希表实现,要求键重写 hashCode方法,操作效率很高,但元素没有顺序。 TreeMap基于排序二叉树实现,要求键实现 Comparable接口或提供一个 Comparator对象,操作效率稍低,但可以按键有序。

HashMap还有一个子类LinkedHashMap,它可以按插入或访问有序。之所以能有序,是因为每个元素还加入到了一个双向链表中。如果键本来就是有序的,使用 LinkedHashMap而非TreeMap可以提高效率。按访问有序的特点可以方便地用于实现LRU缓存。

如果键为枚举类型,可以使用专门的实现类 EnumMap,它使用效率更高的数组实现。
需要说明的是,除了 Hashtable、 Vector和Stack,我们介绍的各种容器类都不是线程安全的,也就是说,如果多个线程同时读写同一个容器对象,是不安全的。如果需要线程安全,可以使用 Collections提供的 synchronizedXXX方法对容器对象进行同步,或者使用线程安全的专门容器类。

此外,容器类提供的迭代器都有一个特点都会在迭代中间进行结构性变化检测,如果容器发生了结构性变化,就会抛出 ConcurrentModificationExcep,所以不能在迭代中间直接调用容器类提供的 add/remove方法,如需添加和删除,应调用迭代器的相关方法。