【JDK】:Java容器框架

容器框架概述

在JDK8中rt.jar文件中,java.util.*;包中的容器主要包括List、Set、Queue和Map四个大类,其中List、Set、Queue是和Collection接口相关的容器,而Map是单独列出来的容器。使用astah community版绘制了容器框架的类图。

Collection的List、Set、Queue类图如下:

【JDK】:Java容器框架_第1张图片

Map容器的类图如下:

【JDK】:Java容器框架_第2张图片

注意到上面的类图中有几个单独列出的接口或者类:

  • Comparator
    比较器接口,最重要的是compare()方法,对于容器中存储元素item的排序(包括自定义排序等)有重要作用,如果使用的是有序容器(SortedSet、SortedMap、TreeMap),则存放的元素必须是可进行比较的,需要实现Comparator接口。
  • RandomAccess
    随机存取接口,实现容器的随机存取,如ArrayList、Vector(相当于同步的ArrayList)等。
  • Iterator和ListIterator
    Iterator接口使用了迭代器设计模式来对所有的容器进行快速遍历,容器本身不需要关注存储元素item的数据类型(具体是什么类),这些确定类型和转型的工作由iterator负责实现。
    ListIterator是List容器所独有的迭代器,与一般的Iterator相比,ListIterator包含add()、hasPrevious()、previous()、nextIndex()等方法,能够在遍历过程中修改集合、逆向顺序遍历、定位遍历索引;而Iterator只能遍历不能修改、只能顺向顺序遍历、不能定位索引。
  • Iterable
    Iterable是java.lang*;包中的接口,实现该接口的类能后实现“For-each loop”,不要将其与Iterator和ListIterator迭代器混淆。”For-each loop“是增强for循环,例如对于一个ArrayList容器的循环,使用增强for循环能够简化代码,提高效率:
// Iterator迭代器循环模式
ArrayList list = new ArrayList();
for(Iterator it = list.iterator(); it.hasNext(); ) 
    System.out.println(it.next());  // 自动拆箱成int输出

// For-each loop模式
for(Integer i : list)
    System.out.println(i);
  • Arrays和Collections
    Arrays是关于数组的封装类,封装了对数组操作的多种方法,如sort()、copyOf()、binarySearch()、asList()等方法;Collections封装了很多对于容器的操作,如max()、min()、reverse()、sort()等方法,生成同步容器如Collections.synchronizedList()、Collections.synchronizedSet()等。

Set

Set实现了数学中的“集合”容器,一般是不可重复,无序,最多只有一个null值。

【JDK】:Java容器框架_第3张图片

其子容器主要包括:

  • AbstractSet:抽象集合类,实现了equals()和hashCode()方法
  • SortedSet:有序(默认自然序)
  • NavigableSet:继承自SortedSet
  • TreeSet:实现NavigableSet接口,继承AbstractSet
  • HashSet:hash方式存储(实际上是一个Map的实例)
  • LinkedHashSet:双向循环链表,不可重复,顺序与插入顺序保持一致,或者实现自定义的顺序
  • EmumSet:只能存放Emum枚举类型

List

List是List集合类的最上层接口,相当于实现了书序总的“集合”,主要是针对数组和链表。List是一般是可重复、无序、可添加null值的。

【JDK】:Java容器框架_第4张图片

List子容器主要包括:

  • ArrayList:数组实现,随机存取
  • LinkedList:双向循环链表,顺序存取
  • Vector:同步,其他与ArrayList相同
  • Stack:同步,继承自Vector,“先进后出”

Queue

Queue实现了数据结构中的队列,“先进先出”,

【JDK】:Java容器框架_第5张图片

主要的子容器包括:

  • AbstractQueue:抽象队列
  • PriorityQueue:继承自AbstractQueue,数据结构中堆Heap的实现
  • Deque:双端队列,两端都可以插入和删除
    • 输出受限的双端队列
      【JDK】:Java容器框架_第6张图片
    • 输入受限的双端队列
      【JDK】:Java容器框架_第7张图片

Map

Map容器是利用映射关系来存储键值对的,独立于List、Set、Queue。键值对是一一对应的关系,一般允许键值为空,不可重复,是完全抽象类Dictionary的接口版本。

【JDK】:Java容器框架_第8张图片

Map的子容器主要包括:

  • AbstractMap:实现了内部EntrySet接口,实现equals、hashCode方法
  • SortedMap:有序(默认自然序)
  • NavigableMap:继承自SortMap
  • TreeMap:基于红黑树,实现NavigableMap接口,继承Abstractmap
  • HashMap:非同步,允许null
  • LinkedHashMap:非同步,允许null,双向循环链表,顺序与插入顺序一致(类比于LinkedHashSet),或者实现自定义顺序
  • HashTable:同步,不允许null
  • EmumMap:只能存放Emum枚举类型
  • WeakHashMap:弱键(weak key)映射,允许释放映射所指向的对象,为解决某类特殊问题而设计。如果映射之外没有应用指向某个“键”,则该“键”可以被GC回收
  • IdentityHashMap:使用“==”代替equals()对键进行比较的散列映射,专门为解决特殊问题而设计
  • ConcurrentHashMap:线程安全的Map,属于java.util.concurrent并发包中

你可能感兴趣的:(JDK)