马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Collection接口简介
Collection接口是Java集合框架的根接口之一,它定义了所有集合类的根本操作,比如添加、删除、遍历元素等,另一个跟接口是Map
核心设计目标
父接口Iterable
- public interface Collection<E> extends Iterable<E> {
- Iterator<E> iterator();
- }
复制代码 迭代Iterable接口以及迭代器Iterator介绍,Collection接口通过继续Iterable迭代接口实现以及返回Iterator方法实现普通检验迭代功能,这是Collection框架核心实现之一
但基于集合中各种集合列表的数据结构不同,详细的数据结构关于迭代功能又有详细的增强方式,比如子接口List提供了双向迭代器ListIterable,抽象类AbstractList有普通迭代器和增强迭代器,
Collection接口实现的普通迭代器只是提供底子迭代功能,即遍历和删除元素
基于Stream流的操作
- 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);
- }
复制代码 Stream详细介绍,Collection接口提供了关于流的底子操作,流是Java 8 引入的,结合 Stream API 和 Lambda 表达式,实现高效数据处理。其中又分为串行流和并行流,而并行流的底层实现原理是分割迭代spliterator
定义了所有集合类的根本操作
它定义了所有集合类的根本操作,比如添加、删除、遍历元素等,如下Collection接口底子方法介绍功能
Collection接口方法
(1) 元素操作
方法说明boolean add(E e)添加元素,成功返回 true(Set 中重复元素会返回 false)。boolean remove(Object o)删除指定元素,存在则返回 true。boolean contains(Object o)判断是否包含指定元素。 (2) 批量操作
方法说明boolean addAll(Collection<?> c)添加另一个集合的所有元素。boolean removeAll(Collection<?> c)删除与另一集合的交集元素。boolean retainAll(Collection<?> c)仅保存与另一集合的交集元素。void clear()清空集合。 (3) 查询与转换
方法说明int size()返回集合元素数量。boolean isEmpty()判断集合是否为空。Object[] toArray()将集合转换为数组。<T> T[] toArray(T[] a)将集合转换为指定类型的数组(更安全)。 (4) 迭代与遍历
方法说明Iterator<E> iterator()返回迭代器,用于遍历集合。default void forEach(Consumer<? super E> action)Java 8+ 支持,使用 Lambda 遍历元素。 (5) Java 8+ 新增默认方法
方法说明default Stream<E> stream()返回顺序流,支持 Stream API 操作。default Stream<E> parallelStream()返回并行流,支持多线程处理。 Collection接口总结
核心角色:Collection 是 Java 集合框架的底子,定义了单列集合的统一操作。
灵活扩展:通过子接口 List、Set、Queue 满足不同场景需求。
当代特性:结合 Stream API 和 Lambda 表达式,实现高效数据处理。
抽象类AbstractCollection简介
AbstractCollection是Java集合框架中为 Collection 接口提供骨架实现的核心抽象类,旨在简化集合类的开发
核心设计目标
减少重复代码
复用代码 减少开发
抽象类 AbstractCollection是集合框架中为 Collection 接口的通用方法提供默认实现(如 contains()、isEmpty()、remove() 等),开发者需实现关键抽象方法 iterator() 和 size() 即可创建集合类
- public abstract class AbstractCollection<E> implements Collection<E> {
- //未实现具体功能需要具体子类实现的关键抽象方法iterator()和size()
- public abstract Iterator<E> iterator();
- public abstract int size();
- //通用方法提供默认实现的部分方法示例如下
- public boolean isEmpty() {
- return size() == 0;
- }
- public boolean contains(Object o) {
- `````````
- }
-
- }
复制代码 多种集合结构模式,实现多态机制
为了减少开发代码为什么不干脆为所有的方法都提供默认功能实现,还保存两个抽象方法要详细子类实现,是因为不同容器类型结构不同的原因,这就涉及到有序 无序 队列等多种结构模式,而集合底层的实现是依靠迭代器的管理的,不同的结构迭代方式不同,才有了两个核心抽象方法由详细的子类(详细的结构模式)去实现
- public class ImmutableCollection<E> extends AbstractCollection<E> {
- //比如数据结构是数组形式的集合结构,那迭代器和容器元素大小都基于数组特性实现
- private E[] elements;
- @Override
- public Iterator<E> iterator() { return Arrays.stream(elements).iterator(); }
- @Override
- public int size() { return elements.length; }
- }
复制代码 对 不可变集合 支持
伪实现的方法 如add(),add没有设计成抽象方法是为了提供一个有用的默认举动(抛出不可操作异常),更容易实现对不可修改的集合操作管理
- //伪实现的方法 如果不重写add方法直接调用 会直接抛出不支持操作异常
- public boolean add(E e) {
- throw new UnsupportedOperationException();
- }
复制代码 首先什么是不可变集合
不可修改集合是指集合一旦创建,其内容就不能被修改,包括添加、删除或修改元素,并不是final修饰的就是不可变集合
- public static void main(String[] args) {
- final int[] scores = new int[5];
- scores[0] = 1;//没有报错 依然可以修改添加元素
- int[] tempArray = {90, 70, 50, 80, 60, 85};
- scores = tempArray; // 静态编译报错提示 不可以使用final修饰
- final List<String> list = new ArrayList<>();
- list.add("a");//没有报错 依然可以添加元素
- list = new ArrayList<>(); //静态编译报错提示 不可以使用final修饰
- }
复制代码 final变量用法,修饰类和方法表现类不可以继续,方法不可以重写,修饰变量表现不可以更改,如果修饰的是对象表现对象的引用不可以更改,这里修饰的数组和list对象都表现不可以更改引用,以是重新指向引用就报错了,但是对集合中的元素照旧可以进行操作修改的
为什么必要 不可变集合
集合是存储元素,在特定的环境下我们必要控制不可以改变集合中元素的内容,如多线程下的安全性,比如哈希码值我们渴望能作为常量不可以改变,又或者性能优化不可变的集合可节流空间和时间的开销
- List<String> list = Stream.of("张三", "李四", "王五", "赵六").collect(Collectors.toList());
- // java 1.8实现不可变集合方法
- List<String> immutableList = Collections.unmodifiableList(list);
- immutableList.add("a");//执行到这里抛出不可操作异常UnsupportedOperationException
- //JDK9+ 之后 可以使用 List.of方法 更简单些
- //不可变List集合
- List<Double> lists = List.of(140.5, 120.0, 95.5, 70.5, 80.0); //
- lists.add(123.0); //运行报错 UnsupportedOperationException 不可变
- lists.set(0,140.0); //报错
- //不可变set集合
- //Set<String> sets = Set.of("a", "b", "d", "c","a"); // a 不允许重复 直接报错
- Set<String> sets = Set.of("a", "b", "d", "c");
- sets.add("a"); //报错
- //不可变Map集合
- Map<String,Integer> maps = Map.of("a",100,"b",200,"c",300);
- maps.put("d",200); //报错
复制代码 add方法并没有被设计成抽象方法,而是提供了一个默认的实现,这个默认实现是抛出一个UnsupportedOperationException异常。通过提供一个默认的异常抛出举动,AbstractCollection.add(E)使得开发者在实现不可修改的集合时更加方便。如果add方法被设计成抽象方法,那么每一个继续自AbstractCollection的类都必须提供一个add方法的实现,这大概会导致一些不必要的复杂性
AbstractCollection关键方法实现
方法实现逻辑依赖的抽象方法contains(Object)遍历迭代器,逐个比较元素是否相当(支持 null 检查)iterator()toArray()创建新数组,通过迭代器填充元素iterator(), size()(优化提示)remove(Object)遍历迭代器查找元素,调用迭代器的 remove() 删除,但迭代器的 remove() 方法 也是默认抛出 UnsupportedOperationException,以是也需子类重写以实现 可修改集合iterator()isEmpty()直接调用 size() == 0size()add(E)默认抛出 UnsupportedOperationException,需子类重写以实现 可修改集合- AbstractCollection在集合框架中的构造位置
- 父类关系:实现集合框架两大根接口之一的Collection接口、提供默认通用模板方法
- 子类关系:AbstractList、AbstractSet、AbstractQueue等均继续 AbstractCollection,进一步细化列表、集合的特性
AbstractCollection总结与使用注意事项
总结:
- 模板方法模式:通过抽象方法 iterator() 和 size() 定义算法框架,详细实现延迟到子类。比方,contains() 的遍历逻辑固定,但元素访问方式由子类决定。
- 代码复用:所有集合共享通用方法(如 toString() 天生 [a, b, c] 格式字符串),制止重复实现。
- 扩展性:子类可选择性重写方法以优化性能(如 ArrayList 直接通过索引实现 contains(),比迭代遍历更高效)
注意事项:
- 方法限制:默认 add() 和 remove() 大概抛出 UnsupportedOperationException,需根据集合类型重写。
- 性能考量:通用方法如 containsAll() 通过迭代实现,数据量大时大概服从低下,子类可优化
- 并发题目:AbstractCollection并没有特殊表明多线程下安全管理,以是黑白线程安全的,多线程环境需外部同步或使用并发集合类。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |