JDK1.7源码分析01-Collection
时间:2022-05-06
本文章向大家介绍JDK1.7源码分析01-Collection,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
同步发布:http://www.yuanrengu.com/index.php/20180221.html
Java的集合类主要由两个接口派生而出:Collection和Map。Collection是一个接口,它主要的两个分支为List和Set,Map的介绍会在后面的系列中进行详细的分析。如下图所示为Collection接口、子接口及其实现类的继承树。
源码分析如下:
package java.util;
/**
* Collection继承了迭代器的接口,即整个集合类都采用了迭代器模式
*/
public interface Collection<E> extends Iterable<E> {
// Query Operations
/**
* 返回集合的大小。
* 如果集合的大小超过Integer.MAX_VALUE,则返回Integer.MAX_VALUE
*/
int size();
/**
* 判断集合是否为空
*/
boolean isEmpty();
/**
* 判断集合中是否有元素o。
* 这里要特别注意下元素o是否与集合里的元素类型兼容,以及o是否为null
*/
boolean contains(Object o);
/**
* 返回集合中元素的迭代器,但不能保证返回顺序(除非集合指定了顺序)
*/
Iterator<E> iterator();
/**
* 返回一个数组(包含集合中所有的元素)。
* 如何集合中的元素是有序的,则返回的数组中的元素也是有序的。
* 这个方法可用于集合与数组之间的转换
*/
Object[] toArray();
/**
* 以数组形式返回指定数组类型的集合元素
*/
<T> T[] toArray(T[] a);
// Modification Operations
/**
* 用于向集合里添加元素
* 如果集合对象被添加操作改变了则返回true
*/
boolean add(E e);
/**
* 删除元素
*/
boolean remove(Object o);
// Bulk Operations
/**
* 用来判断是否含有指定集合c中的所有元素
*/
boolean containsAll(Collection<?> c);
/**
* 将指定集合c中的所有元素添加至调用者的集合中
*/
boolean addAll(Collection<? extends E> c);
/**
* 删除集合中所包含的c里面的元素
*/
boolean removeAll(Collection<?> c);
/**
* 保留与集合c中相同的元素(即移除与指定集合不同的元素)
* 相当于把调用该方法的集合变成该集合和集合c的交集
*/
boolean retainAll(Collection<?> c);
/**
* 清除集合里的所有元素,集合长度变为0
*/
void clear();
// Comparison and hashing
/**
* 判断与指定元素是否相等
*/
boolean equals(Object o);
/**
* 返回集合的哈希码值
*/
int hashCode();
}
Collection继承了Iterable,如图所示:
Iterable源码分析如下:
/**
* 迭代器接口
*/
public interface Iterable<T> {
/**
* 返回元素类型为T的迭代器
*/
Iterator<T> iterator();
}
其中Iterator的源码如下:
/**
* 迭代器接口类
*/
public interface Iterator<E> {
/**
* 如果被迭代的集合元素还没有被遍历,则返回true
*/
boolean hasNext();
/**
* 返回集合里的下一个元素
*/
E next();
/**
* 删除集合里上一次next方法返回的元素
*/
void remove();
}
Iterator仅用于遍历集合,Iterator本身并不提供装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。Iterator必须依附于Collection对象,如有一个Iterator对象,则必然有一个与之关联的Collection对象。特别要注意的是,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
- 仿大总点评浮动效果
- Linq to xml API中 XName 的奇怪实现
- Vue.js系列之一初识Vue
- EF 数据库连接约定(Connection String Conventions in Code First)
- 微信小程序使用WebSokcet实现相关请求
- Vue.js系列之二Vue实例
- autoload自动加载机制使用
- EF 约定介绍
- 关于EF Code First模式不同建模方式对建表产生的影响
- C# 命名空间和程序集
- C# new关键字和对象类型转换(双括号、is操作符、as操作符)
- 防止小程序多次点击跳转解决方案
- 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
- Web API系列之三 基本功能实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux部署python爬虫脚本,并设置定时任务的方法
- centos6编译及安装ZLMediaKit解析
- CentOS7.5安装配置Harbor1.7的全过程
- Linux CentOS 定时运行脚本配置的方法
- 从Centos7升级到Centos8的教程(图文详解)
- Linux(Centos7)下redis5集群搭建和使用说明详解
- CentOS7下安装yum源及上传下载命令rz、sz安装方法(图解)
- C#实例:四路激光测距雷达数据采集和波形图绘制
- Linux 中有效用户组和初始用户组的实现
- ubuntu 16.04 64位兼容32位程序三步曲
- crontab执行结果未通过发送mail通知用户的方法
- 如何将CentOS7升级至CentOS8(详细步骤)
- leetcode树之二叉树的所有路径
- 如何利用Bash脚本监控Linux的内存使用情况
- Ubuntu18 给terminal改个漂亮的命令行提示符的方法