Java 集合源码剖析系列02: Collection架构

1. 概要 :

首先,我们来看下 Collection的一些框架类的关系如下图:

image.png

> 从图中我们可以看到,Collection 是一个接口,主要分支有list 和set接口,list 和set 接口有他们各自的实现类。通过接口进行抽象,接口允许我们操作集合时不必关注具体实现,从而达到“多态”。

为了方便我们抽象出了AbstractCollection抽象类,它实现了Collection中的绝大部分函数;这样,在Collection的实现类中,我们就可以通过继承AbstractCollection省去重复编码。AbstractList和 AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于AbstractSet。

而Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。

接下来,我们分别对 Collection, Listset, AbstractCollection, AbstractList, AbstractSet, iterator, ListIterator 逐个介绍:

2. Collection简介 :

Collection 接口定义如下:

public interface Collection<E> extends Iterable<E> {}

Collection 作为集合的根接口,是高度抽象出来的集合,它定义了一组对象和它的子类需要实现的基本操作:比如 添加、删除、清空、遍历(读取)、是否为空、获取大小等等。

定义了的方法如下:


image.png
    1. 对集合的基础操作,比如 :
      int size() // 获取元素个数
      boolean isEmpty() // 集合里面数据元素是否为空
      boolean contains(Object element) // 是否包含指定元素
      Iterator<E> iterator() // 获取元素的迭代器
      boolean add(E element) / /添加元素,成功时返回 true
      boolean remove(Object element) // 删除元素,成功时返回 true
      int hashCode(); // 返回集合元素的hashcode值
      boolean equals(Object o); // object 对象与此集合元素进行相等性比较
    1. 对整个集合操作的一些方法,如下 :
      boolean containsAll(Collection<?> c); //是否包含指定集合 c 的全部元素
      boolean addAll(Collection<? extends E> c); //添加集合C中所有元素到本 集合中
      boolean removeAll(Collection<?> c); 删除本集合中存在 c 集合中的元素
      default boolean removeIf(Predicate<? super E> filter) {} 删除本集合中满足Predicat 集合要求中的元素
      boolean retainAll(Collection<?> c) // 保留本集合中与 c 集合中两者共有的
      void clear() // 删除所有元素
    1. 对转化为数组操作的方法有:
      Object[] toArray(); // 返回一个包含集合中所有元素的数组
      <T> T[] toArray(T[] a); // 返回一个包含集合中所有元素的数组,运行时根据集合元素的类型指定数组的类型
      default <T> T[] toArray(IntFunction<T[]> generator) {} // 返回一个包含此collection中所有元素的数组,使用函数分配返回的数组。
    1. 还提供了从集合获取连续的或者并行流方法如下:
      default Stream<E> stream() {}
      default Stream<E> parallelStream() {}
3. List 接口简介 :

List接口定义如下:

public interface List<E> extends Collection<E> {}

List 是一个元素有序的、可以重复、可以为 null 的集合
List 接口是继承于Collection接口,它自然就包含了Collection中的全部函数,除此之外新增的方法如下:

// 相比与Collection,List新增的API:

    1. 位置相关:List 和 数组一样,从 0 开始,我们可以根据元素在 list 中的位置进行操作,比如说 get, set, add, addAll, remove;
      E get(int index);
      E set(int index, E element);
      void add(int index, E element);
      boolean addAll(int index, Collection<? extends E> c);
      E remove(int index);
  • 2 . 搜索:查找list 中某个对象的位置,比如 indexOf, lastIndexOf;
    int indexOf(Object o); // 返回 在这个列表中,指定元素第一次出现的索引
    int lastIndexOf(Object o);

  • 3 . 迭代:使用 Iterator 的拓展版 迭代器 ListIterator 进行迭代操作;
    ListIterator<E> listIterator();
    ListIterator<E> listIterator(int index);

    1. 范围性操作:使用 subList 方法对 list 进行任意范围的操作。
      List<E> subList(int fromIndex, int toIndex);
4. Set 接口简介 :

Set 接口定义如下:

public interface Set<E> extends Collection<E> {}

  • Set 接口是一个继承于Collection的接口,Set是一个没有重复元素的集合,关于API方面。Set的API和Collection基本一样。
4. AbstractCollection 简介 :

AbstractCollection的定义如下:

public abstract class AbstractCollection<E> implements Collection<E> {}
------抽象类可以不用实现接口的全部方法

    1. AbstractCollection 是 Java 集合框架中 Collection 接口 的一个直接实现类,它实现了Collection接口中的大部分函数。从而方便其它类实现Collection,比如ArrayList、LinkedList等(通过继承AbstractCollection就已经实现了大部分的接口了)。
      ........
      AbstractCollection 实现Collection 的api 有:
      public boolean contains(Object o) {}
      public Object[] toArray() {}
      public <T> T[] toArray(T[] a) {}
      public boolean add(E e) {}
      public boolean remove(Object o) {}
      public boolean containsAll(Collection<?> c) {}
      public boolean addAll(Collection<? extends E> c) {}
      public boolean removeAll(Collection<?> c) {}
      public boolean retainAll(Collection<?> c) {}
      public void clear() {}
5. AbstractList 简介 :

AbstractList 的定义如下:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}

    1. AbstractList是一个继承于AbstractCollection,所以AbstractList 实现AbstractCollection 中的抽象函数: iterator() 和 size(),如果子类想要能够修改元素,还需要重写 add(), set(), remove() 方法,否则会报 UnsupportedOperationException 错。
    1. AbstractList 内部已经提供了 Iterator, ListIterator 迭代器的实现类,分别为 Itr, ListItr,
6. AbstractSet简介 :

AbstractSet的定义如下:

public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}

    1. AbstractSet是一个继承于AbstractCollection,由于Set接口和Collection接口中的API完全一样,Set也就没有自己单独的API,AbstractSet 抽象类中实现部分函数。
7. Iterator

Iterator的定义如下:

public interface Iterator<E> {}

  • 1 . Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。
    主要函数如下:
    boolean hasNext(); // 是否存在未遍历元素
    E next(); // 返回下一个元素
    default void remove() // 移除一个元素
    default void forEachRemaining(Consumer<? super E> action) {} /// 流式遍历。遍历每个元素,并对其执行相应的择取操作。


    image.png
    1. Iterator遍历Collection时,是fail-fast机制的;
      什么是fail-fast机制
      当某一个线程遍历list的过程中,list的内容被另外一个线程所改变了;就会抛出ConcurrentModificationException异常,产生fail-fast事件。
8 . ListIterator

ListIterator的定义如下:

public interface ListIterator<E> extends Iterator<E> {}

ListIterator是一个继承于Iterator的接口,它是队列迭代器。专门用于便利List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等等API接口。

主要api 函数如下:


image.png

.
.
.
.

---下面我将继续对 集合源码剖析,有兴趣可以继续关注

-- -如果文章帮到了您,或者您感兴趣,请帮忙点赞!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容