专栏首页Android机动车Java 基础(三)——集合源码解析 Collection

Java 基础(三)——集合源码解析 Collection

前面我们讲到了集合的定义以及集合的 Iterator。我们知道集合分为 Collection和 Map,今天我们的重点是学习 Collection。

什么是集合

我们再来回顾一下集合解决了什么问题:在编译期间不知道要多少个对象,但是数组必须在申明的时候明确指明数组长度,如果使用数组,申请太多的空间就会造成资源浪费,如果申请太少空间,就不够用,所以引出了一个概念叫“集合”。

从这里我们可以看出,集合的特性有:

  • 类似于数组,包含了多个元素的对象
  • 可根据需要动态申请内存空间。

因此,我们可以理解集合是一个高级的数组。可能这种说法不太合理,那我换个说法吧,集合是许多个体组织成的一个整体。

既然是整体,那么肯定有增删改查等各种操作,我们前面在面向对象的理解中讲了接口的理解:接口就是对一个对象的行为进行规范,使对象具有做某些事情的能力。集合本身只是用来存储数据的,如果需要具有增删改查功能,肯定是用接口来扩展。不多说了,我们来看代码。

不看代码了,Collection 就是一个接口,定义了集合的行为规范,我们直接看类结构图就好。

  • int size(); 获取元素个数
  • boolean isEmpty();是否为空
  • boolean contains(Object var1);是否包含指定元素
  • Iterator iterator();获取迭代器
  • Object[] toArray();转换成数组
  • T[] toArray(T[] var1);转换成数组,指定类型
  • boolean add(E var1);添加一个元素
  • boolean remove(Object var1);删除一个元素
  • boolean containsAll(Collection var1);是否包含一组元素
  • boolean addAll(Collection var1);添加一组元素
  • boolean removeAll(Collection var1);删除一组元素
  • default boolean removeIf(Predicate var1) 模式实现方法,删除指定条件元素
  • boolean retainAll(Collection var1);保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true
  • void clear();清空集合
  • boolean equals(Object var1);比较
  • int hashCode();获取哈希值
  • default Spliterator spliterator() 获取分割迭代器,并行操作
  • default Stream stream()
  • default Stream parallelStream() 同上

集合的抽象实现类 AbstractCollection

AbstractCollection是所有 Collection 系集合的父类。从类结构上来看,List、Set 系列的集合都继承自 AbstractCollection。

AbstractCollection 没有太多的代码,主要实现了 Collection 接口方法。其实这个类设计还是蛮有意思的。仅仅抽象了两个方法iterator()和size(),其余所有的操作都在AbstractCollection 里面实现了,在数据结构都不清楚的情况下,仅仅通过 iterator 就实现了对集合的增删改查。如果是我们自己来设计一个集合,能否在不清楚数据结构的情况下,就写出对集合的增删改查方法的具体实现呢?我想这就是面向对象编程 OOP 的魅力所在吧。

预告

接下来我会根据 List、Set、Queue 三个 Collection 接口的继承接口来学习 Collection 集合的各种实现。

  • List 基于数组实现的集合类,元素有序可重复
  • Set 基于 HashMap 实现的集合类,无序且不能重复
  • Queue 基于数组实现的集合类,模拟队列,遵循 FIFO

本文分享自微信公众号 - Android机动车(JsAndroidClub),作者:diamond_lin

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 约束布局ConstraintLayout1.1.0 版详解

    在http://dyg8.com/20180205/Android-ConstraintLayout-Detailed/这篇文章中,我们对 Constraint...

    蜻蜓队长
  • Java 基础(六)——集合源码解析 Queue

    Queue继承自 Collection,我们先来看看类结构吧,代码量比较少,我直接贴代码了。

    蜻蜓队长
  • Java 基础(二)——集合源码解析 Iterator

    针对一个特定的问题,如果事先不知道需要多少个对象,或者它们的持续时间有多长,那么也不知道如何保存那些对象。既然如此,怎样才能知道那些对象要求多少空间呢?事先上根...

    蜻蜓队长
  • AI 储备系列索引目录

    为了更好地进入AI 领域,一些重要的概念,是不得不去自习体会的,为了方便大家查阅,在此将已推送的消息索引在这里: 1 机器学习储备(1):协方差和相关系数 概率...

    double
  • 从 CVE-2018-8495 看 PC 端 url scheme 的安全问题

    本文受 CVE-2018-8495 漏洞的启发,以学习的目的,针对 PC 端 url scheme 的安全问题进行了分析研究。

    Seebug漏洞平台
  • 跟我一起写Makefile

    makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序。 首先,我们用一个示例来说明makefil...

    _gongluck
  • 如何在跨多云平台实现部署管理

    关于云计算服务的讨论往往都是从AWS开始的,但是对于绝大多数企业来说,这并不是云计算应用的全部。在业内,越来越多的企业都在实施使用多个云计算平台的发展策略,所谓...

    静一
  • 不看技术文,还想不想去腾讯了

    今天的内容主要是讲解指针数组。这部分内容实际上是要结合数组指针一起讲的,但是由于篇幅的问题,只能拆成两篇来写。今天这篇介绍指针数组,下一篇介绍数组指针。

    谭庆波
  • 跟我一起写Makefile:MakeFile介绍

    http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:...

    bear_fish
  • 如何在Debian 9上为用户目录设置vsftpd

    FTP是文件传输协议的缩写,是一种曾经广泛用于在客户端和服务器之间移动文件的网络协议。它已被更快,更安全,更方便的文件传输方式所取代。很多休闲互联网用户希望直接...

    丰一川

扫码关注云+社区

领取腾讯云代金券