对于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集合类源码学习一的更多相关文章

  1. java集合类源码学习二

    我们查看Collection接口的hierarchy时候,可以看到AbstractCollection<E>这样一个抽象类,它实现了Collection接口的部分方法,Collection ...

  2. java集合类源码学习三——ArrayList

    ArrayList无疑是java集合类中的一个巨头,而且或许是使用最多的集合类.ArrayList继承自AbstractList抽象类,实现了List<E>, RandomAccess, ...

  3. Java集合类源码学习- Iterabel<T>,Colection<E>,AbstractCollection<E>

    Collection<E>接口extends Iteratable<E>接口. Iteratable<T>:实现接口使得对象能够成为“for-each loop”的 ...

  4. Java集合类源码解析:Vector

    [学习笔记]转载 Java集合类源码解析:Vector   引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...

  5. Java集合类源码解析:HashMap (基于JDK1.8)

    目录 前言 HashMap的数据结构 深入源码 两个参数 成员变量 四个构造方法 插入数据的方法:put() 哈希函数:hash() 动态扩容:resize() 节点树化.红黑树的拆分 节点树化 红黑 ...

  6. Java集合源码学习(一)集合框架概览

    >>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...

  7. java Integer 源码学习

    转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...

  8. Java集合源码学习(五)几种常用集合类的比较

    这篇笔记对几个常用的集合实现,从效率,线程安全和应用场景进行综合比较. >>ArrayList.LinkedList与Vector的对比 (1)相同和不同都实现了List接口,使用类似.V ...

  9. Java集合类源码解析:ArrayList

    目录 前言 源码解析 基本成员变量 添加元素 查询元素 修改元素 删除元素 为什么用 "transient" 修饰数组变量 总结 前言 今天学习一个Java集合类使用最多的类 Ar ...

随机推荐

  1. Grazing on the Run 题解

    [题目大意] 大致题意就是,你的初始坐标为\(x\),你要去数轴上的\(n\)个点,问你到达所有点的时间总和最小是多少. 直接贪心肯定不行,所以考虑\(DP\) 先把坐标离散(也就是预处理两点距离\( ...

  2. Socket 由浅入深,开发一个真正的通信应用

    在说socket之前.我们先了解下相关的网络知识: 端口  在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上, ...

  3. 19c新环境安装补丁(三)_推荐

    本次安装Oracle RAC 19.3 版本 Linux red-hat 7.8  DB安装补丁  RUR 20200717. 本次安装Oracle补丁的方法类似于11G RAC打补丁的方法.  [可 ...

  4. 在eclipse中搜索 datasource.xml 文件:

  5. Maven工程 install和run包配置

    1.New一个Environment变量: Name:global.config.path Value:D:\490993\config;

  6. apache+djnago+websocket 部署配置

    部署Apache服务器 1.apache服务的安装这里不做赘述,因为网上一大堆. 链接:https://blog.csdn.net/qq_24394093/article/details/905501 ...

  7. linux系统相关参数查询(内存,磁盘,CPU)

    1.服务器型号:dmidecode -s system-product-name 出厂日期:dmidecode -s bios-release-date 2.磁盘大小:parted -l 3.物理内存 ...

  8. python基础 Day7

    python Day7 基础数据类型的补充 str的数据类型补充 capitalize函数将首字母大写,其余变小写 s1="taibei" print(s1.capitalize( ...

  9. vscode下终端返回中文乱码

    用python写个爬虫,配置个VScode环境,发现输出都是乱码,翻阅网站后发现一个简单有效的方法,在此谢过网络上的大牛们的无私分享,我也在此记录一下,以备后用: 文件---->首选项----& ...

  10. github 加速方法

    登录网址:https://github.com.ipaddress.com/codeload.github.com#ipinfo 更改hosts: