在之前的文章我们介绍了一下 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. 原生_H5交互插件(适用于与V2.1)

    这是js代码 /* * 适合版本为 2.1.0 * 前提是url上加 from=app */ var Native = {}; var ua = navigator.userAgent; var oU ...

  2. Python--day69--ORM多对多查询

    ManyToManyField class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器. 它存在于下面两种情况: 外键关系的反向查询 ...

  3. pytorch 状态字典:state_dict 模型和参数保存

    pytorch 中的 state_dict 是一个简单的python的字典对象,将每一层与它的对应参数建立映射关系.(如model的每一层的weights及偏置等等) (注意,只有那些参数可以训练的l ...

  4. 递归求gcd(a,b)

    int gcd(int a,int b) { ) return a; else return gcd(b,a%b); }

  5. java声明异常(throws)

    在可能出现异常的方法上声明抛出可能出现异常的类型: 声明的时候尽可能声明具体的异常,方便更好的处理. 当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非RuntimeExceptio ...

  6. H5 拖拽元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. dot net double 数组转 float 数组

    本文告诉大家如果遇到 double 数组转 float 数组千万不要使用 Cast ,一般都使用 select 强转. 最近在开发Avalonia ,有大神告诉我,下面的代码可以这样写 dashes ...

  8. linux设备编号的内部表示

    在内核中, dev_t 类型(在 <linux/types.h>中定义)用来持有设备编号 -- 主次部分都包 括. 对于 2.6.0 内核, dev_t 是 32 位的量, 12 位用作主 ...

  9. 【git】Git回退代码到指定版本

    1. 查看所有的历史版本,获取你git的某个历史版本的id, git log2. 回退本地代码库:git reset --hard ID3. 推送到远程服务器:git push -f -u origi ...

  10. P1080 探测器

    题目描述 一个 n*n 的网格图上有 m 个探测器,每个探测器有个探测半径r,问这 n*n 个点中有多少个点能被探测到. 网格图上的点的坐标从(1,1)到(n,n). 输入格式 第一行3个整数n,m, ...