在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection。
早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。
虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。
集合框架被设计成要满足以下几个目标。
-
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
-
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
-
对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
-
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
-
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
-
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
集合框架体系如图所示
声明:以上内容节选自菜鸟教程,觉得总结的非常不错就直接拿过来用了,通俗易懂。
接下来我们就用代码来实现一下 Collection 的一些基本操作,在之前的文章我们想要创建一个数组之前必须先定义好类型和数组的长度,然后填充数组,如果数组长度要增加或减少时需要扩容或减容,代码如下:
1 import java.util.Arrays; 2 3 public class Main { 4 public static void main(String[] args) { 5 int[] arr = new int[3]; 6 arr[0] = 1; 7 arr[1] = 2; 8 arr[2] = 3; 9 // int[] arr = {1, 2, 3}; // 这种方法也可以创建数组 10 for (int i = 0; i < arr.length; i++) { 11 // 输出 arr1 数组值 12 System.out.println(arr[i]); // 1 2 3 13 } 14 // arr 源数组 arr.length+1 扩容数组长度 15 arr = Arrays.copyOf(arr, arr.length + 1); 16 for (int i : arr) { 17 System.out.println(i); // 1 2 3 0 18 } 19 } 20 }
从上面的代码中可以看出,创建一个数组并且对数组进行操作还是很麻烦的,那我们通过 Collection 进行操作呢?如下:
1 import java.util.ArrayList; 2 import java.util.Collection; 3 4 /** 5 * java.util.Collection 包 6 * 集合,用于存储一组元素,提供了维护集合的相关操作 7 * 其派生了两个子接口: 8 * List:可重复集 9 * Set:不可重复集 10 * 元素是否重复是依靠元素资深 equals 方法比较的结果而定的 11 */ 12 public class Main { 13 public static void main(String[] args) { 14 /** 15 * boolean add(E e) 16 * 向集合中添加元素 17 * 当元素成功添加到集合后返回 true 18 */ 19 Collection collection = new ArrayList(); 20 collection.add(0); 21 // collection.add("one"); 可以添加成功,但不建议添加不同类型的数据,避免取出时造成麻烦 22 collection.add(1); 23 collection.add(2); 24 System.out.println(collection); // [0, 1, 2] 25 26 /** 27 * int size() 28 * 返回当前集合的元素个数 29 * */ 30 System.out.println(collection.size()); // 3 31 32 /** 33 * boolean isEmpty() 34 * 判断当前集合是否含有任何元素 35 * 空集合 36 * */ 37 System.out.println(collection.isEmpty()); // false 38 39 /** 40 * boolean contains(E e) 41 * 判断当前集合是否包含给顶元素 42 * */ 43 System.out.println(collection.contains(1)); // true 44 45 /** 46 * boolean remove(E e) 47 * 从集合中删除指定元素,删除成功返回 true 48 * 值删除集合中第一个与给定元素 equals 比较为 true 的元素 49 * */ 50 collection.add(1); 51 System.out.println(collection.remove(1)); // true 52 System.out.println(collection); // [0, 2, 1] 53 System.out.println(collection.remove(1)); // true 54 System.out.println(collection); // [0, 2] 55 56 /** 57 * void clear() 58 * 清空集合 59 * */ 60 collection.clear(); 61 System.out.println(collection.size()); // 0 62 System.out.println(collection.isEmpty()); // true 63 } 64 }
在上面的代码中,我们实现了 Collection 的一些基本用法,但是都是对 Collection 中的元素进行单体操作,当然 Collection 还有一些整体多元素操作,如下:
1 import java.util.ArrayList; 2 import java.util.Collection; 3 import java.util.HashSet; 4 5 /** 6 * java.util.Collection 包 7 * 集合,用于存储一组元素,提供了维护集合的相关操作 8 * 其派生了两个子接口: 9 * List:可重复集 10 * Set:不可重复集 11 * 元素是否重复是依靠元素资深 equals 方法比较的结果而定的 12 */ 13 public class Main { 14 public static void main(String[] args) { 15 Collection collection1 = new ArrayList(); 16 collection1.add("one"); 17 collection1.add("two"); 18 collection1.add("three"); 19 collection1.add("four"); 20 System.out.println(collection1); // [one, two, three, four] 21 22 Collection collection2 = new HashSet(); // set 集合内不能有重复元素,且为无序 23 collection2.add("one"); 24 collection2.add("two"); 25 collection2.add("three"); 26 System.out.println(collection2); // [one, two, three] 27 28 /** 29 * 取并集 30 * boolean addAll(Collection c) 31 * 将给定集合中的所有元素添加到当前集合中 32 * 添加后只要当前集合元素数量发生了变化,则返回 true 33 * */ 34 System.out.println(collection1.addAll(collection2)); // true 35 System.out.println(collection1); // [one, two, three, four, one, two, three] 36 System.out.println(collection2.addAll(collection1)); // true 37 System.out.println(collection2); // [four, one, two, three] 38 39 /** 40 * boolean containsAll(Collection c) 41 * 判断当前集合是否包含给定集合中的所有元素 42 * */ 43 System.out.println(collection1.containsAll(collection2)); // true 44 45 /** 46 * boolean containsAll(Collection c) 47 * 从当前集合中删除两个集合中共有的元素 48 * */ 49 System.out.println(collection2.removeAll(collection1)); // true 50 System.out.println(collection2); // [] 51 } 52 }