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集合的抽象过程,即最通用的抽象出来接口后在依次丰富其接口,这样可扩展性就会很好了
目录
相关文章
|
10月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
418 100
|
10月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
392 101
|
10月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
12月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
513 80
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
419 83
|
9月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
230 7
|
11月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
1282 23
|
10月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
288 4
|
11月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
525 12
|
11月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。