论 JAVA 集合框架中 接口与类的关系

ops/2024/9/22 19:27:13/

前言

这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出 JAVA集合框架中 所有类与接口的关系

本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶紧写下来.

这不是一篇看起来很专业的文章,但我希望它是最好懂的.

正文

首先请看图

Java 集合框架包括多个接口,每个接口定义了一类集合的通用操作和行为。主要接口包括:

  • Collection 接口:这是所有集合类的根接口,它定义了一些基本的集合操作方法,如 add(), remove(), size(), isEmpty() 等。Collection 接口的主要实现包括 Set, List, 和 Queue

  • Set 接口:继承自 Collection,表示一个不允许重复元素的集合。常见实现类有 HashSet, LinkedHashSet, 和 TreeSetSet 主要关注元素的唯一性。

  • List 接口:继承自 Collection,表示一个有序的集合,允许重复元素。常见实现类有 ArrayList, LinkedList, 和 VectorList 提供按索引访问元素的方法。

  • Map 接口:与 Collection 不同,Map 表示键值对的映射关系。常见实现类有 HashMap, TreeMap, 和 LinkedHashMapMap 用于存储和管理键值对,其中键是唯一的。

我们知道, 接口可以被看做是一种"行为指导准则". 定义了可以实现的方法

而我们的类,它就是"执行者",类不仅仅负责实现接口定义的方法,还包含了更多关于数据、逻辑和具体功能的实现细节。

结论一

一个类实现了不同的接口,功能也会改变

举例:ArrayListLinkedList

ArrayListLinkedList 是 Java 集合框架中的两个常见类,它们都实现了多个接口,但由于它们的实现方式不同,表现的行为也有差异。

ArrayList 实现的接口:

  • List:这是最重要的接口,定义了有序、可重复的元素集合。
  • RandomAccess:这是一个标识接口,表明该类支持快速的随机访问(按索引访问元素)。
  • Cloneable:表明该类可以被克隆。
  • Serializable:表明该类的对象可以被序列化,便于保存到文件或通过网络传输。

LinkedList 实现的接口:

  • List:同样实现了 List 接口,表明它支持有序集合。
  • Deque:这是 Queue 的子接口,表明 LinkedList 可以作为双端队列使用。
  • CloneableSerializable:和 ArrayList 一样,它也可以被克隆和序列化。
java">List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();// ArrayList 随机访问效率高
String arrayElement = arrayList.get(2);// LinkedList 插入/删除操作效率高
linkedList.addFirst("First Element");

 其次,不同类对于接口的实现程度也是有区别的

例如

完全实现:

  • ArrayList 实现了 List 接口,提供了按索引访问和操作元素的方法,并维护元素的顺序。
  • HashSet 实现了 Set 接口,确保集合中元素的唯一性,并不维护元素的顺序。
  • HashMap 实现了 Map 接口,提供了对键值对的高效存储和检索。

部分实现:

AbstractListAbstractSet 是抽象类,它们提供了 ListSet 接口的一部分实现。它们允许子类继承并补充实现。

结论二

一个接口用不同类去实现,效果也会不同

以  Queue 接口举例

有很多类都可以实现 这个接口

以笔者能完全掌握的知识举例

1. LinkedList 实现 Queue 接口

  • LinkedList 是基于链表的实现,插入和删除元素时效率较高(O(1) 操作),尤其是在队列的头尾操作时。
  • 它可以作为队列,也可以作为双端队列使用,支持从头部和尾部的操作。

效果

  • 适用于需要频繁插入和删除操作的场景,且元素不需要按顺序排序。
java">import java.util.LinkedList;
import java.util.Queue;public class LinkedListQueueExample {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();// 添加元素到队列queue.offer("A");queue.offer("B");queue.offer("C");// 查看队首元素System.out.println("队首元素: " + queue.peek()); // 输出: A// 移除队首元素System.out.println("移除: " + queue.poll());     // 输出: A// 再次查看队首元素System.out.println("队首元素: " + queue.peek()); // 输出: B}
}

2. PriorityQueue 实现 Queue 接口

  • PriorityQueue 是基于的实现,插入元素时按照优先级顺序插入,取出元素时总是取出优先级最高的元素。
  • 虽然也是队列,但并不保证元素按插入顺序排布,而是按优先级排序。

效果

  • 适用于需要根据优先级处理元素的场景,例如任务调度、事件处理等。
java">import java.util.PriorityQueue;
import java.util.Queue;public class PriorityQueueExample {public static void main(String[] args) {Queue<Integer> priorityQueue = new PriorityQueue<>();// 添加元素priorityQueue.offer(10);priorityQueue.offer(20);priorityQueue.offer(15);// 移除优先级最高的元素(最小元素)System.out.println("移除: " + priorityQueue.poll());  // 输出: 10System.out.println("队首元素: " + priorityQueue.peek()); // 输出: 15}
}

3. ArrayDeque 实现 Queue 接口

  • ArrayDeque 是基于动态数组的双端队列,既可以作为栈使用,也可以作为队列使用,插入和删除操作效率较高(O(1))。
  • 它不允许 null 元素,并且容量可以动态调整。
java">import java.util.ArrayDeque;
import java.util.Queue;public class ArrayDequeExample {public static void main(String[] args) {Queue<String> arrayDeque = new ArrayDeque<>();// 添加元素arrayDeque.offer("A");arrayDeque.offer("B");arrayDeque.offer("C");// 查看和移除队首元素System.out.println("队首元素: " + arrayDeque.peek()); // 输出: ASystem.out.println("移除: " + arrayDeque.poll());     // 输出: ASystem.out.println("队首元素: " + arrayDeque.peek()); // 输出: B}
}

所以说

  • LinkedList:适合频繁插入和删除的场景;
  • PriorityQueue:适合按优先级排序的场景;
  • ArrayDeque:适合队列和栈操作场景。

结尾

这些大部分都是JAVASE的基础知识,笔者今天只是捋一捋,防止未来的自己又忘记这些基础知识了,如果有问题,请各位斧正.


http://www.ppmy.cn/ops/114387.html

相关文章

React 中的延迟加载

延迟加载是 Web 开发中的一种有效的性能优化技术&#xff0c;尤其是对于 React 等库和框架。它涉及仅在需要时加载组件或资源&#xff0c;无论是响应用户操作还是当元素即将在屏幕上显示时。这可以减少应用程序的初始加载时间&#xff0c;减少资源消耗&#xff0c;并改善用户体…

Ubuntu 不重装系统增加交换空间大小

目录 一、设置交换文件 二、删除重新创建交换文件 一、设置交换文件 1、创建新的交换文件 使用 dd 命令创建一个新的交换文件。例如&#xff0c;创建一个4GB的交换文件&#xff1a; sudo dd if/dev/zero of/swapfile bs1G count4 2、设置交换文件的权限 为了安全起见&am…

分享课程:云LAN到家视频教程

云LAN到家项目包括四个端&#xff1a;用户端(小程序)、服务端&#xff08;app&#xff09;、机构端(PC)、运营管理端(PC)&#xff0c; 四个端对应四类用户角色&#xff1a; 家政需求方&#xff1a;通过用户端小程序完成在线预约下单、支付、评价、投诉、退款等操作。 家政服务人…

Python在数据科学与机器学习中的应用

Python 是数据科学与机器学习领域的首选语言之一&#xff0c;广泛应用于数据处理、分析、建模以及预测任务中。Python 拥有丰富的库和工具&#xff0c;能够帮助开发者高效处理数据&#xff0c;并构建各种机器学习模型。下面我们将详细介绍 Python 在数据科学与机器学习中的应用…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

一、MySQL连接池 我们在基础I/O中学习了线程池&#xff0c;因此&#xff0c;我们可以将MySQL引入线程池中。如果在实际业务中出现频繁连接数据库的情况时&#xff0c;我们需要创建一些线程&#xff0c;然后通过线程来创建MySQL的连接。在每一个线程中&#xff0c;我们线程启动前…

UniApp一句话经验: px -> rpx动态转换和动态元素区域的获取

px->rpx转换 在多终端条件下&#xff0c;什么devicePixelRatio&#xff0c;upx2px都是不靠谱的&#xff0c;最直接的是这样&#xff1a; const { screenWidth } uni.getSystemInfoSync()const pixelUnit screenWidth / 750 // rpx->px比例基数 动态元素区域获取 多终…

SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report

上一章讲了Fiori UI5开发环境搭建和实践&#xff1a; - VSCode 安装Fiori Tools插件 - SEGW 创建后台程序&#xff0c;注册服务&#xff0c;Gateway Client确认服务 - 使用SEGW公开的服务来查询数据显示到页面 SAP学习笔记 - 开发05 - Fiori UI5 开发环境搭建2 Fiori Tools…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目&#xff0c; 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本&#xff1a;DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…