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集合的抽象过程,即最通用的抽象出来接口后在依次丰富其接口,这样可扩展性就会很好了
目录
相关文章
|
23天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
29天前
|
算法 Java 数据处理
Java集合框架的优缺点
Java集合框架的优缺点
|
1月前
|
网络协议 算法 Java
|
1月前
|
Java API 图形学
Java代码可以做出动图
Java代码可以做出动图
21 1
|
1月前
|
安全 算法 Java
Java中的线程安全集合
【2月更文挑战第23天】本文将介绍Java中的线程安全集合,包括它们的使用场景、优缺点以及如何在实际项目中应用。通过阅读本文,你将了解到线程安全集合的重要性以及如何在多线程环境下使用它们来提高程序的性能和稳定性。
27 0
|
1月前
|
Java C语言
用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
28 0
|
6天前
|
存储 Java 编译器
Java集合丛林:深入了解集合框架的秘密
Java集合丛林:深入了解集合框架的秘密
11 0
Java集合丛林:深入了解集合框架的秘密
|
9天前
|
Java BI
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
|
20天前
|
存储 安全 Java
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
30 1
|
28天前
|
缓存 NoSQL Java
java中复杂业务情况下的集合操作(增减集合同步数据)
java中复杂业务情况下的集合操作(增减集合同步数据)
26 0