Java底子 集合框架 Collection接口和抽象类AbstractCollection

打印 上一主题 下一主题

主题 1677|帖子 1677|积分 5031

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Collection接口简介

Collection接口是Java集合框架的根接口之一,它定义了所有集合类的根本操作,比如添加、删除、遍历元素等,另一个跟接口是Map
核心设计目标

父接口Iterable

  1. public interface Collection<E> extends Iterable<E> {
  2.     Iterator<E> iterator();
  3. }
复制代码
迭代Iterable接口以及迭代器Iterator介绍,Collection接口通过继续Iterable迭代接口实现以及返回Iterator方法实现普通检验迭代功能,这是Collection框架核心实现之一
但基于集合中各种集合列表的数据结构不同,详细的数据结构关于迭代功能又有详细的增强方式,比如子接口List提供了双向迭代器ListIterable,抽象类AbstractList有普通迭代器和增强迭代器,
Collection接口实现的普通迭代器只是提供底子迭代功能,即遍历和删除元素
基于Stream流的操作

  1.     default Spliterator<E> spliterator() {
  2.         return Spliterators.spliterator(this, 0);
  3.     }
  4.     default Stream<E> stream() {
  5.         return StreamSupport.stream(spliterator(), false);
  6.     }
  7.     default Stream<E> parallelStream() {
  8.         return StreamSupport.stream(spliterator(), true);
  9.     }
复制代码
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() 即可创建集合类
  1. public abstract class AbstractCollection<E> implements Collection<E> {
  2.         //未实现具体功能需要具体子类实现的关键抽象方法iterator()和size()
  3.     public abstract Iterator<E> iterator();
  4.     public abstract int size();
  5.         //通用方法提供默认实现的部分方法示例如下
  6.         public boolean isEmpty() {
  7.      return size() == 0;
  8.     }
  9.    public boolean contains(Object o) {
  10.                         `````````
  11.     }
  12.        
  13. }
复制代码
多种集合结构模式,实现多态机制
为了减少开发代码为什么不干脆为所有的方法都提供默认功能实现,还保存两个抽象方法要详细子类实现,是因为不同容器类型结构不同的原因,这就涉及到有序 无序 队列等多种结构模式,而集合底层的实现是依靠迭代器的管理的,不同的结构迭代方式不同,才有了两个核心抽象方法由详细的子类(详细的结构模式)去实现
  1. public class ImmutableCollection<E> extends AbstractCollection<E> {
  2.         //比如数据结构是数组形式的集合结构,那迭代器和容器元素大小都基于数组特性实现
  3.     private E[] elements;
  4.     @Override
  5.     public Iterator<E> iterator() { return Arrays.stream(elements).iterator(); }
  6.     @Override
  7.     public int size() { return elements.length; }
  8. }
复制代码
对 不可变集合 支持

伪实现的方法 如add(),add没有设计成抽象方法是为了提供一个有用的默认举动(抛出不可操作异常),更容易实现对不可修改的集合操作管理
  1.         //伪实现的方法 如果不重写add方法直接调用 会直接抛出不支持操作异常
  2.     public boolean add(E e) {
  3.         throw new UnsupportedOperationException();
  4.     }
复制代码
首先什么是不可变集合
不可修改集合是指集合一旦创建,其内容就不能被修改,包括添加、删除或修改元素,并不是final修饰的就是不可变集合
  1.     public static void main(String[] args) {
  2.         final int[] scores = new int[5];
  3.         scores[0] = 1;//没有报错 依然可以修改添加元素
  4.         int[] tempArray = {90, 70, 50, 80, 60, 85};
  5.         scores = tempArray; // 静态编译报错提示 不可以使用final修饰
  6.         final List<String> list = new ArrayList<>();
  7.         list.add("a");//没有报错 依然可以添加元素
  8.         list = new ArrayList<>(); //静态编译报错提示 不可以使用final修饰
  9.     }
复制代码
final变量用法,修饰类和方法表现类不可以继续,方法不可以重写,修饰变量表现不可以更改,如果修饰的是对象表现对象的引用不可以更改,这里修饰的数组和list对象都表现不可以更改引用,以是重新指向引用就报错了,但是对集合中的元素照旧可以进行操作修改的
为什么必要 不可变集合
集合是存储元素,在特定的环境下我们必要控制不可以改变集合中元素的内容,如多线程下的安全性,比如哈希码值我们渴望能作为常量不可以改变,又或者性能优化不可变的集合可节流空间和时间的开销
  1.         List<String> list = Stream.of("张三", "李四", "王五", "赵六").collect(Collectors.toList());
  2.         // java 1.8实现不可变集合方法
  3.         List<String> immutableList = Collections.unmodifiableList(list);
  4.         immutableList.add("a");//执行到这里抛出不可操作异常UnsupportedOperationException
  5.        //JDK9+ 之后 可以使用 List.of方法 更简单些
  6.         //不可变List集合
  7.         List<Double> lists = List.of(140.5, 120.0, 95.5, 70.5, 80.0); //
  8.         lists.add(123.0); //运行报错 UnsupportedOperationException  不可变
  9.         lists.set(0,140.0); //报错
  10.         //不可变set集合
  11.         //Set<String> sets = Set.of("a", "b", "d", "c","a"); // a 不允许重复 直接报错
  12.         Set<String> sets = Set.of("a", "b", "d", "c");
  13.         sets.add("a"); //报错
  14.         //不可变Map集合
  15.         Map<String,Integer> maps = Map.of("a",100,"b",200,"c",300);
  16.         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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表