对于java的集合类,首先看张图

这张图大致描绘出了java集合类的总览,两个体系,一个Collection集合体系一个Map集合体系。在说集合类之前,先说说Iterable这个接口,这个接口在jdk1.8之前,里面只有一个方法Iterator<T> iterator(),即返回一个T类型的迭代器,在1.8增加了两个default修饰的方法

  1. default void forEach(Consumer<? super T> action) {
  2. Objects.requireNonNull(action);
  3. for (T t : this) {
  4. action.accept(t);
  5. }
  6. }
  7. default Spliterator<T> spliterator() {
  8. return Spliterators.spliteratorUnknownSize(iterator(), 0);
  9. }

这都是为了实现java函数式编程而加进去的方法,具体使用在这篇里面先不说,以后专门弄一篇来说这个。还有一个接口Iterator<E>,里面包含两个方法boolean hasNext()以及E next(),这两个方法一个用来判断集合有没有下一个元素,一个用来取出下一个元素。同样Iterator里有两个default方法,先跳过。Iterable接口的作用是,如果一个类实现了这个接口,或者它实现得接口继承了这个接口,那么它就可以用增强for循环来循环获得集合中的元素(虽然其实也是用了迭代器);Iterator接口的作用是,如果一个类或它的父类实现了这个接口,那么就可以显式地用迭代器的hasNext()和next()来循环取值。下面我们来看看Collection接口:

  1. public interface Collection<E> extends Iterable<E> {
  2. int size();
  3.  
  4. boolean isEmpty();
  5.  
  6. boolean contains(Object o);
  7. Iterator<E> iterator();
  8. Object[] toArray();
  9.  
  10. <T> T[] toArray(T[] a);
  11.  
  12. boolean add(E e);
  13.  
  14. boolean remove(Object o);
  15.  
  16. boolean containsAll(Collection<?> c);
  17.  
  18. boolean addAll(Collection<? extends E> c);
  19.  
  20. boolean removeAll(Collection<?> c);
  21.  
  22. default boolean removeIf(Predicate<? super E> filter) {
  23. Objects.requireNonNull(filter);
  24. boolean removed = false;
  25. final Iterator<E> each = iterator();
  26. while (each.hasNext()) {
  27. if (filter.test(each.next())) {
  28. each.remove();
  29. removed = true;
  30. }
  31. }
  32. return removed;
  33. }
  34.  
  35. boolean retainAll(Collection<?> c);
  36.  
  37. void clear();
  38.  
  39. boolean equals(Object o);
  40.  
  41. int hashCode();
  42.  
  43. @Override
  44. default Spliterator<E> spliterator() {
  45. return Spliterators.spliterator(this, 0);
  46. }
  47.  
  48. default Stream<E> stream() {
  49. return StreamSupport.stream(spliterator(), false);
  50. }
  51.  
  52. default Stream<E> parallelStream() {
  53. return StreamSupport.stream(spliterator(), true);
  54. }
  55. }

抛开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的一个扩展:

  1. public interface ListIterator<E> extends Iterator<E> {
  2.  
  3. boolean hasNext();
  4. E next();
  5. boolean hasPrevious();
  6. E previous();
  7. int nextIndex();
  8. int previousIndex();
  9. void remove();
  10. void set(E e);
  11. void add(E e);
  12. }

方法的意思也比较明朗,不过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. MySQL数据库——连接查询

    1.基本含义 连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”. 实际上,两个表的完全的连接是这样的一个过程: 左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有 ...

  2. G4560 HD610安装黑苹果Hakintosh

    这一篇主要是写给使用G4560笔记本折腾黑苹果的朋友. 我折腾了几天黑苹果,发现怎么也无法成功,最后我才知道HD610现在还不支持黑苹果. 由于大多数笔记本不支持屏蔽核显,这意味着要想使用黑苹果必须要 ...

  3. 几个递进的make file

    春节在家写的几个递进的make file,部分有点问题.接下来 有空我要把GNU make的手册看完.不然这方面太菜了. GNU make手册 都需要make先设置环境变量BUILD_MODE为run ...

  4. 读取topic数据存储到文件内

    基于python3.6 from pykafka import KafkaClient import logging logging.basicConfig(level=logging.INFO) d ...

  5. OptaPlanner的新约束表达方式 Constraint Streams

    有好些时间没有写过关于OptaPlanner的东西了,其实近半年来,OptaPlanner还是推出了不少有用.好用的新特性.包括本文讲到的以Stream接口实现评分编程.关于OptraPlanner的 ...

  6. UML活动图(二)

    转载于https://www.cnblogs.com/xiaolongbao-lzh/p/4591953.html 活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调 ...

  7. 【全解】Eclipse添加Spring项目插件

    1.Eclipse打开window-preference-InstallNewSoftware 2.先点Manage,取消掉The Eclipse Project Updates 3.选择Add . ...

  8. 基于 abp vNext 微服务开发的敏捷应用构建平台 - 文章目录

    系列文章: <基于 abp vNext 微服务开发的敏捷应用构建平台 - 设计构想> [点击查看] <基于 abp vNext 微服务开发的敏捷应用构建平台 - 文章目录> [ ...

  9. NeoVIM安装使用

    1.What's Neovim Bram Moolenaar 在写 Vim 时还是 90 年代初,至今已经 20 多年 过去了.其中,不仅包含了大量的遗留代码,而且程序的维护.Bug 的 修复.以及新 ...

  10. Java多线程_并发容器ConcurrentHashMap/CopyOnWriteArrayList/CopyOnWriteArraySet

    ConcurrentHashMap         HashMap是线程不安全的,可以使用Collections.synchronizedMap(map)把一个不安全的map变成安全的,但是这里可以直 ...