java collection 结构_java集合之Collection架构

本文详细介绍了Java集合框架中的Collection接口,包括其作为Iterable接口的子接口特性,以及List和Set两个主要分支。文章讲解了AbstractCollection、AbstractList和AbstractSet抽象类的作用,并阐述了如何使用Iterator和ListIterator遍历集合。此外,还讨论了Collection接口中的核心方法,如add、remove和contains等。
摘要由CSDN通过智能技术生成

Java集合之Collection架构

首先,我们对Collection进行说明。下面先看看Collection的一些框架类的关系图:

28b02a756d595c662281a82b151b78f7.png

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

为了方便,我们抽象出了AbstractCollection抽象类,它实现了Collection中的绝大部分函数;这样,在Collection的实现类中,我们就可以通过继承AbstractCollection省去重复编码。

AbstractList和AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于AbstractSet。

另外,Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。 接下来,我们看看各个接口和抽象类的介绍;然后,再对实现类进行详细的了解。

接下来我们来看Collection接口:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagejava.util;importjava.util.function.Predicate;importjava.util.stream.Stream;importjava.util.stream.StreamSupport;/***继承了Iterable接口,Iterable是一个迭代器接口,里面有返回迭代器的抽象方法*/

public interface Collection extends Iterable{int size();//返回集合元素个数

boolean isEmpty();//是否为空

boolean contains(Object o);//集合中是否存在这个对象

Iterator iterator();//从Iterable中继承而来

Object[] toArray();//将集合转换为object数组

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);//retain保留

void clear();//清空

boolean equals(Object o);//Object中方法

int hashCode();//hash函数

default boolean removeIf(Predicate super E> filter) {//如果有就删除,接口默认实现

Objects.requireNonNull(filter);boolean removed = false;final Iterator each =iterator();while(each.hasNext()) {if(filter.test(each.next())) {

each.remove();

removed= true;

}

}returnremoved;

}

@Overridedefault Spliteratorspliterator() {return Spliterators.spliterator(this, 0);

}default Streamstream() {return StreamSupport.stream(spliterator(), false);

}default StreamparallelStream() {return StreamSupport.stream(spliterator(), true);

}

}

Collection接口

我们可以看到Collection中定义了几个集合基本操作的抽象方法,然后这个接口继承于Iterable接口,Iterable接口中定义了返回迭代器的抽象函数,这个Iterator迭代器中定义迭代函数,集合的实现类一般是通过内部类的方式来实现这个Iterator接口,然后再通过iterator函数new一个实例返回,以后我们看到具体的实现类是再分析。

packagejava.lang;importjava.util.Iterator;importjava.util.Objects;importjava.util.Spliterator;importjava.util.Spliterators;importjava.util.function.Consumer;public interface Iterable{//这个抽象方法会返回一个Iterator接口,//所以所有集合类只要支持迭代就必须实现这个函数并且实现Iterator接口中的函数(一般以内部类中实现)

Iteratoriterator();default void forEach(Consumer super T> action) {//Objects.requireNonNull(action);for (T t : this) {

action.accept(t);

}

}default Spliteratorspliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);

}

}

接下来我们看一下List接口:

List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。关于API方面。既然List是继承于Collection接口,它自然就包含了Collection中的全部函数接口;由于List是有序队列,它也额外的有自己的API接口。主要有“添加、删除、获取、修改指定位置的元素”、“获取List中的子队列”等。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagejava.util;importjava.util.function.UnaryOperator;/***list接口继承了Colleciton接口。*/

public interface List extends Collection{//List新增的抽象方法。我们可以发现List接口这些新增的抽象方法有个特点就是可以通过数组下标访问,//这就体现list集合的特性有序且可随机访问

E remove(intindex);

E get(int index);//随机访问方法

E set(int index, E element);//指定下标添加元素,并返回这个元素

void add(intindex, E element);boolean addAll(int index, Collection extends E>c);int indexOf(Object o);//从前往后通过元素找下标

intlastIndexOf(Object o);

ListIterator listIterator();//返回List特有的迭代器,可以向前向后迭代等

ListIterator listIterator(int index);//返回从某个下标开始的List特有的迭代器

List subList(int fromIndex, int toIndex);//截取部分List集合//Collection中的抽象方法

intsize();booleanisEmpty();booleancontains(Object o);

Iteratoriterator();

Object[] toArray();T[] toArray(T[] a);booleanadd(E e);booleanremove(Object o);boolean containsAll(Collection>c);boolean addAll(Collection extends E>c);boolean removeAll(Collection>c);boolean retainAll(Collection>c);voidclear();booleanequals(Object o);inthashCode();default void replaceAll(UnaryOperatoroperator) {

Objects.requireNonNull(operator);final ListIterator li = this.listIterator();while(li.hasNext()) {

li.set(operator.apply(li.next()));

}

}

@SuppressWarnings({"unchecked", "rawtypes"})default void sort(Comparator super E> c) {//通过外部排序进行排序的方法,我们发现他是通过Arrays工具类实现的

Object[] a = this.toArray();

Arrays.sort(a, (Comparator) c);

ListIterator i = this.listIterator();for(Object e : a) {

i.next();

i.set((E) e);

}

}

@Overridedefault Spliteratorspliterator() {return Spliterators.spliterator(this, Spliterator.ORDERED);

}

}

List接口

Set接口:

Set接口也是继承于Collection接口,它里面的元素不允许重复,后面会解释为啥不允许重复。

cb7fb2d755f54ea7060f8b9490c96f30.png

94758dd2d4cd9a7a8bea5631f3297df2.png

接下来是AbstractCollection抽象类:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值