java集合类源码学习一
对于java的集合类,首先看张图

这张图大致描绘出了java集合类的总览,两个体系,一个Collection集合体系一个Map集合体系。在说集合类之前,先说说Iterable这个接口,这个接口在jdk1.8之前,里面只有一个方法Iterator<T> iterator(),即返回一个T类型的迭代器,在1.8增加了两个default修饰的方法
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
这都是为了实现java函数式编程而加进去的方法,具体使用在这篇里面先不说,以后专门弄一篇来说这个。还有一个接口Iterator<E>,里面包含两个方法boolean hasNext()以及E next(),这两个方法一个用来判断集合有没有下一个元素,一个用来取出下一个元素。同样Iterator里有两个default方法,先跳过。Iterable接口的作用是,如果一个类实现了这个接口,或者它实现得接口继承了这个接口,那么它就可以用增强for循环来循环获得集合中的元素(虽然其实也是用了迭代器);Iterator接口的作用是,如果一个类或它的父类实现了这个接口,那么就可以显式地用迭代器的hasNext()和next()来循环取值。下面我们来看看Collection接口:
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
抛开default方法,剩下的15个方法就是Collection集合系的最基本方法,将在它的实现类里面加以实现,这些方法的名称对应作用都很明显,就不细讲了,值得注意的是,这个接口继承了Iterable<E>接口,里面有个Iterator<E> iterator();方法,这意味着Collection集合系的实现类都可以用增强for循环来取值。在eclipse里Collection接口按F4查看引用,如下图
我们可以看到下面三个接口继承Collection接口(BeanContext不是java.util包下的,忽略),List,Queue和Set,以及一些实现类。这三个接口和图上的对应起来,我们一一来查看。先看List接口,它首先有Collection接口里的所有方法(不包含Collection的default方法),然后有几个自己的方法,需要注意的是里面有个listIterator方法,这个玩意也是个迭代器,不过比起Iterator,这玩意多了几个功能,其实相当于Iterator的一个扩展:
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}
方法的意思也比较明朗,不过set方法是设置最后的值而add方法是往当前索引的前面加值。List有了这个迭代器,就可以任性取值了。同样地,看看Set接口和Queue接口,发现Set接口的方法基本和Collection里的一样,而Queue接口几乎完全不一样,除了add和remove方法,那么它应该是在子类或继承它的接口里去实现了Collection剩余的方法。好,明天继续学习。
java集合类源码学习一的更多相关文章
- java集合类源码学习二
我们查看Collection接口的hierarchy时候,可以看到AbstractCollection<E>这样一个抽象类,它实现了Collection接口的部分方法,Collection ...
- java集合类源码学习三——ArrayList
ArrayList无疑是java集合类中的一个巨头,而且或许是使用最多的集合类.ArrayList继承自AbstractList抽象类,实现了List<E>, RandomAccess, ...
- Java集合类源码学习- Iterabel<T>,Colection<E>,AbstractCollection<E>
Collection<E>接口extends Iteratable<E>接口. Iteratable<T>:实现接口使得对象能够成为“for-each loop”的 ...
- Java集合类源码解析:Vector
[学习笔记]转载 Java集合类源码解析:Vector 引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...
- Java集合类源码解析:HashMap (基于JDK1.8)
目录 前言 HashMap的数据结构 深入源码 两个参数 成员变量 四个构造方法 插入数据的方法:put() 哈希函数:hash() 动态扩容:resize() 节点树化.红黑树的拆分 节点树化 红黑 ...
- Java集合源码学习(一)集合框架概览
>>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...
- java Integer 源码学习
转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...
- Java集合源码学习(五)几种常用集合类的比较
这篇笔记对几个常用的集合实现,从效率,线程安全和应用场景进行综合比较. >>ArrayList.LinkedList与Vector的对比 (1)相同和不同都实现了List接口,使用类似.V ...
- Java集合类源码解析:ArrayList
目录 前言 源码解析 基本成员变量 添加元素 查询元素 修改元素 删除元素 为什么用 "transient" 修饰数组变量 总结 前言 今天学习一个Java集合类使用最多的类 Ar ...
随机推荐
- Java 方法的重载及引用数据类型(类)
方法的重载 我们假设要在程序中实现一个对数字求和的方法,由于参与求和数字的个数和类型都不确定,因此要针对不同的情况去设计不同的方法. Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数 ...
- 看完就能掌握的PHP核心技术 - 面向对象
继承和多态 类的组合与继承 假设我们有两个类,一个 person,另外一个是 family:在 family 类中我们创建 person 类中的对象,并且我们把这个对象视为 family 类的一个属性 ...
- GaussDB连接与登出
连接 连接命令1: gsql -d ${dbName} -U ${userName} -p {port:默认为25308} -h {ip} -W {password} 连接命令2: gsql -d p ...
- 【特别篇】不为人知的U盘秘密
U盘是我们代码爱好者的必要东西,方便于我们更好的拷文件,使用一些已经配置好的东西,比如说:小编经常会将linux系统放进去,平时就可以随时用了. But 你的U盘真的正常吗?你了解多少? 关于U盘 ...
- VMware Workstation 15 Pro安装带图形化界面的CentOS7
1.双击打开“VMware Workstation”,然后选择“创建新的虚拟机” 2.在安装向导中,选择“稍后安装操作系统”,然后点击“下一步”继续安装 3.在“客户机操作系统”中选择“Linux(L ...
- PythonCrashCourse 第五章习题
5.1编写一系列条件测试;将每个测试以及你对其结果的预测和实际结果都打印出来.你编写的代码应类似于下面这样: car = 'subaru' print("Is car == 'subaru' ...
- NOSQL基础
一.mongoDB介绍和使用 1.分布式文件储存数据库,使用C++开发的,可以存储任意数据(文件),允许在服务器端执行脚本,使用JSON形式储存数据{key:value} 2.支持的编程语言有:PHP ...
- 求求大厂给个Offer:List面试题
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 从今天开始,我,三歪,正式开始写面试系列.我给这 ...
- Spring是如何解决循环依赖的
前言 在面试的时候这两年有一个非常高频的关于spring的问题,那就是spring是如何解决循环依赖的.这个问题听着就是轻描淡写的一句话,其实考察的内容还是非常多的,主要还是考察的应聘者有没有研究过s ...
- java23种设计模式—— 二、单例模式
源码在我的github和gitee中获取 介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...