Java 集合框架

学习目标

  • Java集合框架的层次结构
  • Collection 接口
  • HashSet 、LinkedHashSet 和 TreeSet
  • Comparable 和Comparator 接口
  • ArrayList 和LinkedList
  • 规则集和线性表性能比较
  • Vector 和Stack
  • Queue和 PriorityQueue
  • Map接口及 HashMap, LinkedHashMap和TreeMap

Java集合框架的层次结构

  • 一个集合就是一个容器对象,用来代表一组对象,其中的每个对象称为元素。
  • Java 集合框架支持三种类型的集合:规则集sets, 线性表lists, 和映射 maps。

Set 和 List 是Collection的子接口

映射的实例是一组关联关键字的对象。
可以使用关键字从映射中获取一个对象或者把一个对象放到映射中

Collection 接口

Collection接口是处理对象集合的根接口

Set 接口

  • Set接口继承 Collection 接口。它没有引入新的方法或者常量,只是规定Set的实例不能包含重复元素。
  • 实现Set的类必须确保没有重复元素添加到这个规则集。也就是说,在一个规则集中,一定不存在两个元素e1 、 e2 使得 e1.equals(e2) 的返回值是true。

Set 接口继承结构

AbstractSet 类

  • AbstractSet 类是一个便利类,它继承 AbstractCollection 并实现Set。
  • AbstractSet类提供了 equals 和 hashCode 方法的具体实现。一个规则集的散列码是这个规则集中所有元素散列码的和。
  • 由于AbstractSet类没有实现size 和iterator 方法,所以 AbstractSet 是一个抽象类。

HashSet 类

  • HashSet 类是一个实现Set接口的具体类。
  • 它可以用来存储互不相同的元素。
  • 考虑到效率,添加到散列集中对象必须以一种正确分散散列码的方式实现 hashCode 方法。

for-each 循环
可以使用 JDK 1.5中的加强循环来替代迭代器:

1
2
for (Object element: set)
System.out.print(element.toString() + " ");

SortedSet 接口和 TreeSet 类

  • SortedSet 是 Set的一个子接口,它确保规则集中的元素是有序的。
  • TreeSet 是实现 SortedSet 接口的一个具体类。可以使用迭代器以排序次序遍历规则集元素有两种排序方式。

使用 TreeSet 对规则集元素排序

方式一:使用 Comparable 接口。

方式二:如果元素所属的类没有实现 Comparable 接口,或者在实现 Comparable 接口的类中不想使用 compareTo 方法,那么就可以指定一个比较器。

Comparator 接口

  • 有时希望将不同类型的元素插入到树形集。这些元素可能不是 Comparable
    的实例或者是不可以比较的。这时就可以定义比较器来比较这些元素。
  • 为了做到这点,需要创建一个实现 java.util.Comparator 接口的类。 Comparator 接口有两个方法:
    compare 和 equals。

public int compare(Object element1, Object element2)
如果 element1 小于 element2 ,就返回一个负值;如果 element1 大于element2,就返回一个正值;若相等就返回0

public boolean equals(Object element)
如果指定对象也是一个比较器,并且与这个比较器具有相同的排序,就返回true

List 接口

  1. 规则集中只能存放不重复的元素。
  2. 为了允许在集合内存储重复元素,需要使用线性表。
  3. 线性表不但可以存储重复元素,还可以让用户指定元素存储位置。
  4. 用户可以使用下标来随机访问元素。

List 迭代器

ArrayList 和 LinkedList

ArrayList 类和 LinkedList 类是 实现 List 接口的两个具体类。
要选用这两种类中的哪一个取决于特定需求:

  • 如果需要通过下标随机访问元素,除了在末尾之外,无需再其他位置上插入或者删除元素,那么 ArrayList 提供了更高效率。
  • 如果应用程序需要在线性表的任意位置上插入或者删除元素,就应该选择LinkedList。
  • 线性表的大小是可以动态增大或者减小的,而数组一旦被创建,它的大小就是固定的。如果应用程序不需要插入或者删除元素,那么数组是效率最高的数据结构。

ArrayList:

LinkedList:

Collections 类

Collections 类提供了许多静态方法用来操作集合和映射、创建同步集合类、创建只读集合类。

Collections 类 UML 图:

规则集和线性表的性能

Vector 和 Stack

Java 集合框架式在Java2中引入的。Java2之前也支持一些数据结构,其中就有 Vector 类和 Stack 类。为了适应Java集合框架,这些类被重新设计,但为了向后兼容,保留了它们旧形式的方法。

Vector 类

在 Java 2中,除了包含用于访问和修改向量的同步方法外, Vector 与 ArrayList 是一样的。至此介绍过的集合数据结构中没有一个是同步的。如果需要同步,可以使用集合类中同步版本。

Stack 类

Stack 类是用来表示后进先出的栈对象的 。只有栈顶元素可以被访问, 可以返回、插入、删除栈顶元素。

队列和优先队列

  • 队列是一种先进先出的数据结构。在队尾添加元素,在队头删除元素。
  • 在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级的元素首先被删除。

Queue 接口

PriorityQueue 类

Map 接口

Map 是一种依照键值存储元素的容器,键值类似于下标。在List中,下标是整数的;而在 Map中,键值可以是任意类型。

Map 接口 UML 图

具体Map 类

HashMap 和 TreeMap

  • HashMap 和 TreeMap 类是Map 接口的两个具体实现。
  • 对于定位一个值,插入一个映射或者删除一个映射而言, HashMap类是高效的。
  • TreeMap 类实现了,所以它在遍历排好顺序的键值时是高效的。

LinkedHashMap

  • LinkedHashMap 在JDK 1.4中引入。它用链表实现来扩展 HashMap,支持映射中条目的排序。
  • HashMap中的条目是没有顺序的,但是在 LinkedHashMap 中,元素既可以按照它们插入映射的顺序排序 (称为插入顺序), 也可以按照它们最后一次访问时的顺序,从早到晚排序 (访问顺序). LinkedHashMap 的无参构造方法是以插入顺序来创建对象的。
  • 要按访问顺序创建LinkedHashMap 对象,应使用LinkedHashMap(initialCapacity, loadFactor, true)。

Arrays 类

Arrays 类包含许多静态方法用于对数组进行排序、查找、比较数组、填充数组元素,以及把数组转换成线性表。

Arrays 类 UML 图

热评文章