当前位置: 首页 > news >正文

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

前言

这是笔者在学习过程中的一篇"备忘录",其目的是能用最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 一样,它也可以被克隆和序列化。
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) 操作),尤其是在队列的头尾操作时。
  • 它可以作为队列,也可以作为双端队列使用,支持从头部和尾部的操作。

效果

  • 适用于需要频繁插入和删除操作的场景,且元素不需要按顺序排序。
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 是基于的实现,插入元素时按照优先级顺序插入,取出元素时总是取出优先级最高的元素。
  • 虽然也是队列,但并不保证元素按插入顺序排布,而是按优先级排序。

效果

  • 适用于需要根据优先级处理元素的场景,例如任务调度、事件处理等。
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 元素,并且容量可以动态调整。
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的基础知识,笔者今天只是捋一捋,防止未来的自己又忘记这些基础知识了,如果有问题,请各位斧正.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3(整合版)
  • mysql学习教程,从入门到精通,SQL 更新数据(UPDATE 语句)(17)
  • 【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作
  • 解决uniapp开发的app,手机预览,上下滑动页面,页面出现拉伸,抖动的效果问题,
  • Gitlab学习(009 gitlab冲突提交)
  • Shiro-认证绕过漏洞(CVE-2020-1957)
  • 排序----数据结构
  • Lanterns (dp 紫 线段树 二分 维护dp)
  • Java 入门指南:Java 8 新特性 —— Stream 流
  • golang操作mysql利器-gorm
  • 大学生必看!60万人在用的GPT4o大学数学智能体有多牛
  • 大数据新视界 --大数据大厂之 Node.js 与大数据交互:实现高效数据处理
  • Codeforces Round 973 (Div. 2) - D题
  • 数据库事务中的四大问题:脏读、脏写、不可重复读与幻读详解
  • 【HTTPS】对称加密和非对称加密
  • 【css3】浏览器内核及其兼容性
  • 30天自制操作系统-2
  • Android Volley源码解析
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • dva中组件的懒加载
  • Laravel Mix运行时关于es2015报错解决方案
  • Mybatis初体验
  • 阿里研究院入选中国企业智库系统影响力榜
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 复杂数据处理
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何解决微信端直接跳WAP端
  • 实现简单的正则表达式引擎
  • 我与Jetbrains的这些年
  • 小程序测试方案初探
  • 学习ES6 变量的解构赋值
  • 一、python与pycharm的安装
  • 用简单代码看卷积组块发展
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #FPGA(基础知识)
  • #mysql 8.0 踩坑日记
  • ${factoryList }后面有空格不影响
  • (4)事件处理——(7)简单事件(Simple events)
  • (Java数据结构)ArrayList
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (四)模仿学习-完成后台管理页面查询
  • (转) RFS+AutoItLibrary测试web对话框
  • .apk 成为历史!
  • .NET Core 成都线下面基会拉开序幕
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net专家(高海东的专栏)
  • .Net组件程序设计之线程、并发管理(一)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @html.ActionLink的几种参数格式
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [ 数据结构 - C++]红黑树RBTree
  • [1181]linux两台服务器之间传输文件和文件夹
  • [20171102]视图v$session中process字段含义