Java学习之集合一

本文根据 The Java Tutorials 整理 Java 集合相关内容。主要对Introduction 和 Intefaces 部分进行介绍。

一、简介

1. 集合

集合 指的是由多个元素组成的一个单元,可以用来存储数据、获取数据、维护数据以及数据间的通信。

2. 集合框架

集合框架 指用于表示和操作集合的统一结构。包含以下三个方面: * 接口: 表示集合的 抽象数据类型 。 * 实现: 集合接口的具体实现,即可重用的 数据结构 * 算法: 对实现集合接口的对象进行计算的方法。即可重用的 函数

3. Java 集合框架的优势 * 提高编程效率 * 增加程序的速度和质量 * 允许非关联API的互操作 * 降低学习和使用新API的成本 * 降低设计新API的成本 * 提高软件的可重用性

二、接口

核心集合接口封装了不同的集合类型。它们是 Java 集合框架的基础。核心接口主要分为 CollectionMap 两大类所有的接口都是泛型的。 核心集合接口 * Collection: 集合层次的根。Collection 接口是所有集合实现的通用版本, 且用于传递和操作最大泛型数据的需要。该接口没有具体的实现。 * Set: 一个不能存储重复元素的集合。 * List: 一个有序集合(或序列)。可以存储重复的元素。 * Queue: 在 Collection 集合的基础上有新增的操作。通常以 FIFO 的方式组织元素。 * Deque: 在 Collection 集合的基础上有新增的操作。可以通过 FIFO 或 LIFO 的方式组织元素。 * Map: 对象的键值映射。不能包含重复的键。一个键只能对应一个值。 * SortedSet: Set 接口的有序版本。 * SortedMap: Map 接口的有序版本。

1. Collection 接口

  • 基本操作的方法。 Java int size() 获取集合大小 boolean isEmpty() 判断集合是否为空 boolean contains(Object element) 判断集合是否包含element元素 boolean add(E element) 向集合中添加一个元素 boolean remove(Object element) 从集合中删除元素element Iterator<E> iterator() 获取集合的迭代器
  • 操作整个集合的方法。 Java boolean containsAll(Collection<?> c) 判断当前集合时候包含集合c中的所有元素,可用于判断集合之间时候是超集和子集的关系 boolean addAll(Collection<? extends E> c) 将集合c中的元素全部添加到当前集合中,可用于计算两个集合的并集 boolean removeAll(Collection<?> c) 移除当前集合中与集合c相同的元素,可用于计算两个集合的差集 boolean retainAll(Collection<?> c) 保留当前集合中与集合c相同的元素,可用于计算两个集合的交集 void clear() 清空整个集合
  • 操作数组的方法。 ```Java Object[] toArray() 将当前集合转成数组
T[] toArray(T[] a) 将当前集合中的元素存入指定类型的数组a中。 ``` * 遍历集合 * 使用聚合函数 在JDK 8 或以后版本中,推荐使用该方法。通过 stream 和相应的聚合函数来操作集合。 ```Java myShapesCollection.stream() .filter(e -> e.getColor() == Color.RED) .forEach(e -> System.out.println(e.getName())); ``` * 使用 for-each ```Java for (Object o : collection) System.out.println(o); ``` * 使用 Iterators ```Java for (Iterator<?> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); ``` **2. Set 接口** * 三个实现: * HashSet 元素存储在一个hash表中,无序的,性能最优。 * TreeSet 元素存储在一个红黑树种,根据值进行排序,慢于HashSet。 * LinkedHashSet 元素存储在一个使用链表的hash表中,依据元素插入的顺序排序。 * 求集合的对称差集(元素仅存在于一个集合中) ```Java Set symmetricDiff = new HashSet(s1); symmetricDiff.addAll(s2); Set tmp = new HashSet(s1); tmp.retainAll(s2); symmetricDiff.removeAll(tmp); ``` **3. List 接口** * 位置存取 ```Java E get(int index) 获取指定位置的元素 E set(int index, T element) 在指定位置设置元素 boolean add() 添加元素 E remove() 删除元素 ``` * 查询 ```Java indexOf 获取元素首次出现的位置 lastIndexOf 获取元素末次出现的位置 ``` * 迭代 ```Java iterator listIterator 返回一个 ListIterator 类型的迭代器,可以从任何方向遍历 List,可以在迭代是修改 List 或者获取当前的位置。 for (ListIterator it = list.listIterator(list.size()); it.hasPrevious(); ) { Type t = it.previous(); ... } ``` * 范围视图 ```Java subList(int fromIndex, int toIndex) 获取一个左闭右开的子列表。 ``` **4. Quque 接口** 元素从头部获得,从尾部插入。每个 Queue 接口的实现都要指定 ordering 属性。 ```Java public interface Queue extends Collection { E element(); boolean offer(E e); E peek(); E poll(); E remove(); } ``` **5. Deque 接口** 是一个双端 Queue。 * 插入 ```Java addfirst offerFirst addLast offerLast ``` * 删除 ```Java removeFirst pollFirst removeLast pollLast ``` * 读取 ```Java getFirst peekFirst getLast peekLast ``` * 特殊方法 ```Java removeFirstOccurence 移除特定元素第一次的实例 removeLastOccurence 移除特定元素最后一次的实例 ``` **6. Map 接口** * 基本操作 ```Java put get containsKey containsValue size isEmpty ``` * 批量操作 ```Java clear putAll ``` * 集合视图 ```Java keySet values entrySet ``` **7. SortedSet 接口** SortedSet 是一个根据元素升序排序的集合。 ```Java public interface SortedSet extends Set { // Range-view SortedSet subSet(E fromElement, E toElement); SortedSet headSet(E toElement); SortedSet tailSet(E fromElement); // Endpoints E first(); E last(); // Comparator access Comparator<? super E> comparator(); } ``` * 范围视图操作 ```Java SortedSet subSet(E fromElement, E toElement); 创建一个左闭右开的新的有序集合 SortedSet headSet(E toElement); 从头元素到指定元素的新集合,不包含指定元素 SortedSet tailSet(E fromElement); 从指定元素到为元素的新集合,包含指定元素 ``` 例如: ```Java SortedSet volume1 = dictionary.headSet("n"); 返回 a-m 的集合,不含n SortedSet volume2 = dictionary.tailSet("n"); 返回 n-z 的集合,包含n ``` * 端点操作 ```Java E first(); 获取第一个元素 E last(); 获取最后一个元素 ``` * Comparator 访问器 ```Java Comparator<? super E> comparator(); ``` **8. SortedMap 接口** SortedMap 是一个按升序排列的 Map。操作方法含义与 SortedSet 接口基本一致。 ```Java public interface SortedMap<K, V> extends Map<K, V>{ Comparator<? super K> comparator(); SortedMap<K, V> subMap(K fromKey, K toKey); SortedMap<K, V> headMap(K toKey); SortedMap<K, V> tailMap(K fromKey); K firstKey(); K lastKey(); } ```