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 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
30 6
|
10天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
27 3
|
10天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
20 2
|
12天前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
23 3
|
18天前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
40 1
Java面试题之Java集合面试题 50道(带答案)
|
18天前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
229 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
6天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
34 5
|
8天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
27 3
|
10天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
18 4
|
12天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
16 5