zoukankan      html  css  js  c++  java
  • Java 集合系列02之 Collection架构

    目录 

    Collection概述

    1 Collection接口

    2 List接口

    3 Set接口

    4. AbstractCollection抽象类

    5 AbstractList抽象类

    6 AbstractSet抽象类

    7 Iterator

    8 ListIterator

    Collection概述

    Collection是一个接口,它主要有两个子接口:List 和 Set。List和Set都是接口,它们继承于Collection。List是有序的队列,List中可以有重复的元素;而Set是数学概念中的集合,Set中没有重复元素,List和Set都有各自的实现类。

     AbstractCollection抽象类是Collection接口的实现类,实现了Collection中的绝大部分函数;在以后的集合类中就可以通过继承AbstractCollection省去重复编码。AbstractList和AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于AbstractSet。

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

    Collection的一些框架类的关系图:

     

    1 Collection接口

    Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。

    Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。

    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(java.util.Collection<?> c);
        boolean        addAll(java.util.Collection<? extends E> c
        boolean        removeAll(java.util.Collection<?> c);
        boolean        retainAll(java.util.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);
        }
    }

    2 List接口

    List是一个继承于Collection的接口,List是有序的队列,List中的每一个元素都有一个索引,都可以根据索引随机访问;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。

    List是继承于Collection接口,它自然就包含了Collection中的全部函数接口;同时List也有自己的API接口。主要有“添加、删除、获取、修改指定位置的元素”、“获取List中的子队列”等。

    List方法列表:

    public interface List<E> extends Collection<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);
        boolean      retainAll(Collection<?> c);
        void         clear();
        boolean      equals(Object o);
        int          hashCode();
        
        @Override
        default Spliterator<E> spliterator() {
            return Spliterators.spliterator(this, Spliterator.ORDERED);
        }
    
        
        boolean             addAll(int index, Collection<? extends E> c);
        E                   get(int index);
        E                   set(int index, E element);
        void                add(int index, E element);
        E                   remove(int index);
        int                 indexOf(Object o);
        int                 lastIndexOf(Object o);
        ListIterator<E>     listIterator();
        ListIterator<E>     listIterator(int index);
        java.util.List<E>   subList(int fromIndex, int toIndex);
        
        default void replaceAll(UnaryOperator<E> operator) {
            Objects.requireNonNull(operator);
            final ListIterator<E> li = this.listIterator();
            while (li.hasNext()) {
                li.set(operator.apply(li.next()));
            }
        }
    
        @SuppressWarnings({"unchecked", "rawtypes"})
        default void sort(Comparator<? super E> c) {
            Object[] a = this.toArray();
            Arrays.sort(a, (Comparator) c);
            ListIterator<E> i = this.listIterator();
            for (Object e : a) {
                i.next();
                i.set((E) e);
            }
        }
    }

    说明:相比与Collection,List方法列表中红色部分的方法是新增的,大多数方法是跟List集合中索引相关;ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。

    3 Set接口

    Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。

    Set的方法列表和Collection完全一样,Set接口方法列表:

    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(java.util.Collection<?> c);
        boolean        addAll(java.util.Collection<? extends E> c
        boolean        removeAll(java.util.Collection<?> c);
        boolean        retainAll(java.util.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);
        }
    }

     4. AbstractCollection抽象类

    AbstractCollection的定义如下:

    public abstract class AbstractCollection<E> implements Collection<E> {}

    AbstractCollection是一个抽象类,它实现了Collection中除iterator()size()之外的函数。
    AbstractCollection的主要作用:它实现了Collection接口中的大部分函数。从而方便其它类实现Collection,比如ArrayList、LinkedList等,它们这些类想要实现Collection接口,通过继承AbstractCollection就已经实现了大部分的接口了。

    5 AbstractList抽象类

    AbstractList的定义如下:

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

    AbstractList是一个继承于AbstractCollection,并且实现List接口的抽象类。它实现了List中除size()、get(int location)之外的函数。
    AbstractList的主要作用:它实现了List接口中的大部分函数。从而方便其它类继承List。
    另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()接口。

    6 AbstractSet抽象类

    AbstractSet的定义如下: 

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

    AbstractSet是一个继承于AbstractCollection,并且实现Set接口的抽象类。由于Set接口和Collection接口中的方法完全一样,Set也就没有自己单独的方法。和AbstractCollection一样,它实现了List中除iterator()和size()之外的函数。
    AbstractSet的主要作用:它实现了Set接口中的大部分函数。从而方便其它类实现Set接口。

    7 Iterator

    Iterator的定义如下:

    public interface Iterator<E> {}

    Iterator是一个接口,它是Collection所有子类集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator功能有:是否存在下一个元素、获取下一个元素、删除当前元素。
    注意:Iterator遍历Collection时,是fail-fast机制的。即,当通过iterator遍历某集合的过程中,若该集合的内容被修改,就会抛出ConcurrentModificationException异常,产生fail-fast事件。 

    boolean hasNext()
    E next()
    void remove()

    8 ListIterator

    ListIterator的定义如下:

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

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

  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/9162203.html
Copyright © 2011-2022 走看看