学习目标
- 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 | for (Object element: set) |
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 接口
- 规则集中只能存放不重复的元素。
- 为了允许在集合内存储重复元素,需要使用线性表。
- 线性表不但可以存储重复元素,还可以让用户指定元素存储位置。
- 用户可以使用下标来随机访问元素。
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 类包含许多静态方法用于对数组进行排序、查找、比较数组、填充数组元素,以及把数组转换成线性表。