在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection。

早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。

虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。

集合框架被设计成要满足以下几个目标。

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

  • 对一个集合的扩展和适应必须是简单的。

为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedListHashSet, 和 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 的一些基本操作,在之前的文章我们想要创建一个数组之前必须先定义好类型和数组的长度,然后填充数组,如果数组长度要增加或减少时需要扩容或减容,代码如下:

 import java.util.Arrays;

 public class Main {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// int[] arr = {1, 2, 3}; // 这种方法也可以创建数组
for (int i = 0; i < arr.length; i++) {
// 输出 arr1 数组值
System.out.println(arr[i]); // 1 2 3
}
// arr 源数组 arr.length+1 扩容数组长度
arr = Arrays.copyOf(arr, arr.length + 1);
for (int i : arr) {
System.out.println(i); // 1 2 3 0
}
}
}

从上面的代码中可以看出,创建一个数组并且对数组进行操作还是很麻烦的,那我们通过 Collection 进行操作呢?如下:

 import java.util.ArrayList;
import java.util.Collection; /**
* java.util.Collection 包
* 集合,用于存储一组元素,提供了维护集合的相关操作
* 其派生了两个子接口:
* List:可重复集
* Set:不可重复集
* 元素是否重复是依靠元素资深 equals 方法比较的结果而定的
*/
public class Main {
public static void main(String[] args) {
/**
* boolean add(E e)
* 向集合中添加元素
* 当元素成功添加到集合后返回 true
*/
Collection collection = new ArrayList();
collection.add(0);
// collection.add("one"); 可以添加成功,但不建议添加不同类型的数据,避免取出时造成麻烦
collection.add(1);
collection.add(2);
System.out.println(collection); // [0, 1, 2] /**
* int size()
* 返回当前集合的元素个数
* */
System.out.println(collection.size()); // /**
* boolean isEmpty()
* 判断当前集合是否含有任何元素
* 空集合
* */
System.out.println(collection.isEmpty()); // false /**
* boolean contains(E e)
* 判断当前集合是否包含给顶元素
* */
System.out.println(collection.contains(1)); // true /**
* boolean remove(E e)
* 从集合中删除指定元素,删除成功返回 true
* 值删除集合中第一个与给定元素 equals 比较为 true 的元素
* */
collection.add(1);
System.out.println(collection.remove(1)); // true
System.out.println(collection); // [0, 2, 1]
System.out.println(collection.remove(1)); // true
System.out.println(collection); // [0, 2] /**
* void clear()
* 清空集合
* */
collection.clear();
System.out.println(collection.size()); //
System.out.println(collection.isEmpty()); // true
}
}

在上面的代码中,我们实现了 Collection 的一些基本用法,但是都是对 Collection 中的元素进行单体操作,当然 Collection 还有一些整体多元素操作,如下:

 import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet; /**
* java.util.Collection 包
* 集合,用于存储一组元素,提供了维护集合的相关操作
* 其派生了两个子接口:
* List:可重复集
* Set:不可重复集
* 元素是否重复是依靠元素资深 equals 方法比较的结果而定的
*/
public class Main {
public static void main(String[] args) {
Collection collection1 = new ArrayList();
collection1.add("one");
collection1.add("two");
collection1.add("three");
collection1.add("four");
System.out.println(collection1); // [one, two, three, four] Collection collection2 = new HashSet(); // set 集合内不能有重复元素,且为无序
collection2.add("one");
collection2.add("two");
collection2.add("three");
System.out.println(collection2); // [one, two, three] /**
* 取并集
* boolean addAll(Collection c)
* 将给定集合中的所有元素添加到当前集合中
* 添加后只要当前集合元素数量发生了变化,则返回 true
* */
System.out.println(collection1.addAll(collection2)); // true
System.out.println(collection1); // [one, two, three, four, one, two, three]
System.out.println(collection2.addAll(collection1)); // true
System.out.println(collection2); // [four, one, two, three] /**
* boolean containsAll(Collection c)
* 判断当前集合是否包含给定集合中的所有元素
* */
System.out.println(collection1.containsAll(collection2)); // true /**
* boolean containsAll(Collection c)
* 从当前集合中删除两个集合中共有的元素
* */
System.out.println(collection2.removeAll(collection1)); // true
System.out.println(collection2); // []
}
}

Java 从入门到进阶之路(二十一)的更多相关文章

  1. Java 从入门到进阶之路(十一)

    之前的文章我们介绍了一下 Java 中的继承,接下来我们继续看一下 Java 中的继承. 在有些时候,我们通过类继承的方式可以获取父类的方法,但是有些时候父类为我们提供的方法并不完全符合我们的需求,这 ...

  2. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

  3. Java 从入门到进阶之路(二十三)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...

  4. Java 从入门到进阶之路(二)

    之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...

  5. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  6. Java 从入门到进阶之路(二十二)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

  7. Java 从入门到进阶之路(二十四)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...

  8. Java 从入门到进阶之路(二十五)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List的 增删改查和与数组间相互转换的方法,本章我们来看一下 Java 集合框架中的Collection 的 ...

  9. Java 从入门到进阶之路(二十六)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ...

随机推荐

  1. Win7如何显示文件后缀

    有些时候,我们需要修改文件的后缀名,但是Windows7系统默认不显示文件后缀.我们怎样显示和修改文件后缀呢?请接着往下看. 工具/原料   一个win7系统 方法/步骤   1 如图所示,此时是无法 ...

  2. hdu 1434 幸福列车 (Leftist Tree)

    Problem - 1434 网上题解是普通的堆合并,都是用优先队列直接做的.可是正解的堆合并应该是用左偏堆或者斐波那契堆的吧,不然O(X * N ^ 2)的复杂度应该是过不了的.斐波那契堆的实现相对 ...

  3. Redis在Laravel项目中的应用实例详解

    https://mp.weixin.qq.com/s/axIgNPZLJDh9VFGVk7oYYA 在初步了解Redis在Laravel中的应用 那么我们试想这样的一个应用场景 一个文章或者帖子的浏览 ...

  4. win10 uwp 解决 SerialDevice.FromIdAsync 返回空

    调用 SerialDevice.FromIdAsync 可能返回空,因为没有设置 package.appmanifest 可以使用端口 打开 package.appmanifest 文件添加下面代码 ...

  5. linux Do-it-yourself 探测

    探测也可以在驱动自身实现没有太大麻烦. 它是一个少有的驱动必须实现它自己的探测, 但是看它是如何工作的能够给出对这个过程的内部认识. 为此目的, short 模块进行 do- it-yourself ...

  6. WPF 一个性能比较好的 gif 解析库

    本文介绍 Magick.NET ,这是 ImageMagick 的 .Net 封装,他支持 100 多种格式的图片,而 gif 也是他支持的.本文告诉大家如何使用这个库播放 gif 图 先给大家看一下 ...

  7. 2018-8-10-win10-uwp-修改Pivot-Header-颜色

    title author date CreateTime categories win10 uwp 修改Pivot Header 颜色 lindexi 2018-08-10 19:17:19 +080 ...

  8. 2018-9-30-C#-使用外部别名

    title author date CreateTime categories C# 使用外部别名 lindexi 2018-09-30 18:37:23 +0800 2018-07-02 14:31 ...

  9. Vue仿网易云PC端的网页

    贴个网址:https://github.com/wangjie3186594/-PC- 声明一下:这个网页没做完!没做完!没做完!      本人新人一枚,按照的是我当前的学习进度做的项目,很多效果未 ...

  10. CodeForces 1204 (#581 div 2)

    传送门 A.BowWow and the Timetable •题意 给你一个二进制数,让你求小于这个数的所有4的幂的个数 •思路 第一反应是二进制与四进制转换 (其实不用真正的转换 QwQ) 由于二 ...