AbstractCollection类源码理解

35 篇文章 0 订阅
34 篇文章 0 订阅
文章详细介绍了Java中的AbstractCollection类,它是Collection接口的抽象实现,提供了如size、isEmpty、iterator、contains等方法的框架实现。此外,文章还解析了add、addAll、remove等操作以及clear方法,强调了这些方法在不同场景下的行为和可能抛出的UnsupportedOperationException。
摘要由CSDN通过智能技术生成


前言

本文章帮助大家对AbstractCollection类的理解。


一、概述

AbstractCollection意为集合(无特殊说明,本文章“集合”指AbstractCollection)。顾名思义,Collection集合的抽象实现类。参考Collection接口。

二、源码理解

package java.util;
import java.util.AbstractCollection;

使用AbstractCollection类时,需引入此包。

AbstractCollection类

public abstract class AbstractCollection<E> implements Collection<E> { /*...*/ }

使用类时传入泛型E,为集合元素的类型。继承了Collection接口,使其具有Collection的表现。

其提供Collection的框架实现,尽可能减少其他类实现Collection所需的工作量。

AbstractCollection方法

AbstractCollection

protected AbstractCollection() {}

受保护构造函数,不做处理。

size

public abstract int size();

重写Collection接口的int size()方法,参考Collection.size方法。

抽象方法。返回元素个数。

isEmpty

public boolean isEmpty() { return size() == 0; }

重写Collection接口的boolean isEmpty()方法,参考Collection.isEmpty方法。

判断集合是否为空。size方法返回值是否为0。

toString

public String toString() { /*...*/ }

重写Object类的String toString()方法,参考Object.toString方法。

将此集合“转换”为字符串,由中括号“[]”包裹,逗号加空格“, ”分隔元素,若元素是此集合本身,则用“(this Collection)”表示。使用迭代器遍历元素,将元素“转换”为字符串后拼接。

iterator

public abstract Iterator<E> iterator();

重点:重写Collection接口的Iterator<E> iterator()方法,参考Collection.iterator方法。

抽象方法。返回遍历元素的迭代器。

contains

public boolean contains(Object o) { /*...*/ }

重写Collection接口的boolean contains(Object o)方法,参考Collection.contains方法。

判断集合是否包含对象o。通常认为找到一个元素e,存在Objects.equals(o, e)则返回true。参考Objects.equals方法。使用迭代器遍历元素,与o作比较。

containsAll

public boolean containsAll(Collection<?> c) { /*...*/ }

重写Collection接口的boolean containsAll(Collection<?> c)方法,参考Collection.containsAll方法。

判断此集合是否包含集合c的所有元素。若都包含则返回true。遍历c的所有元素,逐个用contains方法判断是否在此集合中。

add

public boolean add(E e) { throw new UnsupportedOperationException(); }

重写Collection接口的boolean add(E e)方法,参考Collection.add方法。

添加元素e到此集合中(可选)。若成功添加,返回true;若集合规定不能有重复元素但e为重复元素,则不添加,返回false。不支持add方法,调用它将抛出UnsupportedOperationException异常。

addAll

public boolean addAll(Collection<? extends E> c) { /*...*/ }

重写Collection接口的boolean addAll(Collection<? extends E> c)方法,参考Collection.addAll方法。

添加集合c的所有元素到此集合中(可选)。若成功添加,返回true。遍历c的所有元素,逐个用add方法添加到此集合中。

注意:若不支持add操作,则抛出UnsupportedOperationException异常。

remove

public boolean remove(Object o) { /*...*/ }

重写Collection接口的boolean remove(Object o)方法,参考Collection.remove方法。

从集合中移除一个等于对象o的元素(可选)。通常认为找到一个元素e,存在Objects.equals(o, e)则移除。若成功移除,返回true

注意:使用迭代器遍历、判断、删除。若迭代器不支持remove操作,则抛出UnsupportedOperationException异常。

removeAll

public boolean removeAll(Collection<?> c) { /*...*/ }

重写Collection接口的boolean removeAll(Collection<?> c)方法,参考Collection.removeAll方法。

从此集合中移除集合c中的所有元素(有包含的话)(可选)。若成功移除,返回true。使用迭代器遍历此集合所有元素,若有包含在c中则移除。

注意:使用迭代器遍历、判断、删除。若迭代器不支持remove操作,则抛出UnsupportedOperationException异常。

retainAll

public boolean retainAll(Collection<?> c) { /*...*/ }

重写Collection接口的boolean retainAll(Collection<?> c)方法,参考Collection.retainAll方法。

保留此集合中有包含在集合c中的所有元素,即移除其它c中没有的元素(可选)。若移除成功,返回true。使用迭代器遍历此集合所有元素,若不包含在c中则移除。

注意:使用迭代器遍历、判断、删除。若迭代器不支持remove操作,则抛出UnsupportedOperationException异常。

clear

public void clear() { /*...*/ }

重写Collection接口的void clear()方法,参考Collection.clear方法。

清空集合(可选)。使用迭代器遍历此集合所有元素并移除。

注意:使用迭代器遍历、判断、删除。若迭代器不支持remove操作,则抛出UnsupportedOperationException异常。

finishToArray

private static <T> T[] finishToArray(T[] r, Iterator<?> it) { /*...*/ }

传入泛型T,为返回数组的元素的类型。返回包含r数组元素拼接迭代器it覆盖的元素的对象数组。若it无覆盖元素,则返回r;否则将创建返回新的数组。

toArray

public Object[] toArray() { /*...*/ }

重写Collection接口的Object[] toArray()方法,参考Collection.toArray方法。

返回包含所有元素的对象数组。使用到finishToArray方法。

重点:数组为新分配的空间,大小为迭代器覆盖的元素数,不一定等于size方法返回值(因为集合可能会被并发修改,size方法只能作为参考),元素顺序同迭代器遍历顺序。

public <T> T[] toArray(T[] a) { /*...*/ }

重写Collection接口的<T> T[] toArray(T[] a)方法,参考Collection.toArray方法。

传入泛型T,为返回数组的元素的类型。返回包含所有元素的对象数组。若a数组大小足够存储列表元素,那元素将存它里面(多余的空间第一个位置设空);否则将创建返回新的数组。使用到finishToArray方法。

重点:前部分元素顺序同迭代器遍历顺序。


总结

新人源码理解,望大家多多指点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值