Java总结 - 集合类图关系

简介: 这篇是相当简单的梳理了下Java集合类之间的关系,和各个类是干嘛的,所以如果您知道这些话,那么这篇看到这您就可以关掉了 上面是Java集合的大致继承实现关系,我们只拿出了一部分的实现类,但是本文并不介绍具体的实现类,而只是介绍一下Java的集合的架构.
  • 这篇是相当简单的梳理了下Java集合类之间的关系,和各个类是干嘛的,所以如果您知道这些话,那么这篇看到这您就可以关掉了

markdown_img_paste_20190123135600237

  • 上面是Java集合的大致继承实现关系,我们只拿出了一部分的实现类,但是本文并不介绍具体的实现类,而只是介绍一下Java的集合的架构.


Iterable

  • 其接口定义

    public interface Iterator<E> { {...}
  • 下面是其中的方法

      //判断是否有下一个元素
      boolean hasNext();
      //下一个元素
      E next();
      //默认
      default void remove() {
        ...
      }
      default void forEachRemaining(Consumer<? super E> action) {
        ...
      }
  • 在Java8更新后,那么接口中就增加了默认实现,所以在这个接口中主要担任实现整体集合类的遍历和删除等工作
  • Iterator遍历Collection时,是fail-fast机制的, 即当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了.那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件

Collection

  • 接口定义

    public interface Collection<E> extends Iterable<E> {...}
  • 下面是其中的方法

    int size();
    boolean isEmpty();
    boolean isEmpty();
    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) {
      ...
    }
    boolean retainAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();
    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);
    }
  • 我们从上面的图中可以看到, Collection是List和Set的一个高度抽象,所以此类中定义的方法,都是List和Set一些集合共通的方法,并且其中也包含了Java8的默认方法,为Java8新提供的Stream和Lambda提供默认实现

List

  • 定义如下

    public interface List<E> extends Collection<E> {...}
  • 下面是其中的方法

    boolean addAll(int index, Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    int indexOf(Object o);
    ListIterator<E> listIterator();
    List<E> subList(int fromIndex, int toIndex);
    E get(int index);
    E set(int index, E element);
    void add(int index, E element);
    ...
  • List继承Collection,所以除了将Collection的方法继承过来后,又定义实现了自己的一些特有方法,比如subList,get,add等等,List是有序的队列,List中的每一个元素都有一个索引,第一个元素的索引值是0,往后的元素的索引值依次+1,List中允许有重复的元素.

AbstractCollection

  • 定义

    public abstract class AbstractCollection<E> implements Collection<E> {}
  • 包含的方法

    public abstract Iterator<E> iterator();
    public abstract int size();
    public boolean contains(Object o) {...}
    public Object[] toArray() {...}
    public Object[] toArray() {...}
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    ....
  • 我们可以看到这个抽象类是在直接实现了Collection接口,并在自己的类中部分实现了Collection中的方法,其目的就是为其子类提供一些默认实现,而子类一些行为,并没有给出默认实现,这就利用了继承的便利来复用代码

Set

  • 定义

    public interface Set<E> extends Collection<E> {...}
  • 包含的方法

    int size();
    boolean isEmpty();
    boolean add(E e);
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    Object[] toArray();
    ...
  • Set实现了Collection接口,并且我发现Set的API基本跟Collection一致,并没有一一对比,所以这个Set接口也没有什么特殊要说的

AbstractList

  • 定义

      public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {...}
  • 包含的方法

    abstract public E get(int index);
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public void clear() {
        removeRange(0, size());
    }
    public ListIterator<E> listIterator(final int index) {
        rangeCheckForAdd(index);
        return new ListItr(index);
    }
    ...
  • 这个类是继承自AbstractCollection,那么AbstractCollection继承Collection,所以这也就形成了一层层的包装,使得之后的实现类更容易实现自己的逻辑,达到代码复用的目的
  • 并且其中包含了一些内部类,其定义如下

    private class Itr implements Iterator<E> {...}
    private class ListItr extends Itr implements ListIterator<E> {...}
  • 还有两个类的定义是在其同源文件中定义的类

    class SubList<E> extends AbstractList<E> {...}
    class RandomAccessSubList<E> extends SubList<E> implements RandomAccess {...}

RandomAccess&Serialiable&Cloneable

  • 这三个的定义分别是

    public interface RandomAccess {
    }
    public interface Cloneable {
    }
    public interface Serializable {
    }
  • 三个接口并没有一个方法的定义或者实现,其目的在于标识这个接口可以干什么,即可随机访问又可以序列化可克隆

剩余

  • 除了详细实现的实现类,剩余的AbstractList,AbstractSet,AbstractMap都是对其父类的简单实现,以方便其子类实现逻辑,那么单独出来的Map接口我们需要注意的是,虽然同属于Java集合,但是他并不是继承自Collection,这是要注意的,其每个接口的具体实现类,之后会进行说明

总结

  • 其实今天的很简单,并且自己感觉这篇比较水,但是这也为自己梳理了下Java集合的类关系图,所以这也为之后深入Java集合提供了一个简单的基础,那么我们还可以吸收到能为自己所用的一点是,Java集合的抽象过程,即最通用的抽象出来接口后在依次丰富其接口,这样可扩展性就会很好了
目录
相关文章
|
Java Android开发
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
1331 0
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
|
弹性计算 关系型数据库 MySQL
如何通过RDS MySQL数据库内网访问
本场景基于1台Linux云服务器实例和1台RDS MySQL实例,通过操作控制台和系统实现ECS内网访问RDS MySQL实例。
|
Ubuntu 安全
Ubuntu 安全重启 / Ubuntu 系统死机解决方法
初装Ubuntu双系统时,经常会遇到各种各样的问题导致系统崩溃、卡死、黑屏等情况,新手或者小白可能直接选择长按电源键强制重启了
5301 0
|
资源调度 监控 JavaScript
3倍+提升,高德地图极致性能优化之路
伴随着高德地图APP近几年的高速发展,也面临到这些问题,从2019年开始,我们开启了一系列性能优化专项,对高德地图APP进行了深入性能分析和极致优化,取得比较显著的效果。在这个过程中总结了一系列优化思路和技术方案,希望对同样面临超级应用性能问题的你有所帮助。
|
Oracle 关系型数据库 MySQL
arm服务器OceanBase初始化安装体验
OceanBase初始化安装体验
824 0
|
前端开发 容器
前端基础(十五)_多栏布局(两列自适应布局、圣杯布局---三列布局、双飞翼布局--三列布局、等高布局)
本文介绍了前端开发中的多种自适应布局技术,包括两列自适应布局、圣杯布局(三列布局)、双飞翼布局(三列布局)和等高布局。文章通过代码示例展示了如何使用HTML和CSS实现这些布局,以及如何通过flex布局简化实现过程。
659 2
|
存储 监控 供应链
深入理解操作系统:从理论到实践
本文将深入探讨操作系统的基本概念、功能和结构,以及它们如何影响计算机系统的性能和稳定性。我们将通过实例和代码示例来揭示操作系统的工作原理,并讨论其在现代计算环境中的重要性。无论你是计算机专业的学生,还是对操作系统感兴趣的技术爱好者,这篇文章都将为你提供有价值的见解和知识。
|
图计算
软考高项笔记(一):进度类计算
本篇博文开始,笔者将分享在学习高项中所收获的知识,第一篇博文我要归纳的笔记是在软考上午选择题和下午案例题都很重要的计算题类型中的进度类计算笔记。本篇博文主要用于学习和交流。归纳总结不仅是学习的重要方法,也是一种分享的途径,我在此希望与各位准项目经理共同努力,为早日实现人生理想而奋斗!
2797 6
软考高项笔记(一):进度类计算
|
关系型数据库 Shell PostgreSQL
GreenPlum入门
本文旨在小白入门。 我开始研究GP的动机是因为它在MPP和数仓方面的名声,另外,GP也是集团技术栈的一员。 ### 1 GPDB简介 > Pivotal **Greenplum** Database is a MPP (massively parallel processing) database built on open source [PostgreSQL](https:/
17329 0
|
Java
Java 中 notify() 和 notifyAll() 的区别
【8月更文挑战第22天】
488 4

热门文章

最新文章

下一篇
开通oss服务