论 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的基础知识,笔者今天只是捋一捋,防止未来的自己又忘记这些基础知识了,如果有问题,请各位斧正.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146962.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【练习16】求最小公倍数

链接&#xff1a;求最小公倍数_牛客题霸_牛客网 (nowcoder.com) 题目分析&#xff1a; 要求最小公倍数&#xff0c;要先用辗转相除法求最大公约数。假如有两个数a、b&#xff1a; 最小公倍数a*b / a和b的最大公约数 最大公约数 &#xff08;b, a % b&#xff09;&#xff0c;直…

Redis数据结构之zset

一.zset有序集合 它和集合唯一不同的就是&#xff0c;有序集合中的每一个元素都有一个唯一对应的浮点类型的分数与之关联着&#xff0c;是的有序集合中的元素可以维护有序性。 但是这个有序不适用下标作为排序的依据&#xff0c;而是使用这个分数。就好像排行榜一样&#xff…

Spark MLlib实践指南:从大数据推荐系统到客户流失预测的全流程建模

问题一 背景&#xff1a; 本题目基于用户数据&#xff0c;将据数据切分为训练集和验证集&#xff0c;供建模使用。训练集与测试集切分比例为8:2。 数据说明&#xff1a; capter5_2ml.csv中每列数据分别为userId , movieId , rating , timestamp。 数据&#xff1a; capte…

jboss

一。CVE-2015-7501 1.POC&#xff0c;访问地址 192.168.10.193:8080/invoker/JMXInvokerServlet 返回如下&#xff0c;说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 2.下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码…

828华为云征文 | 使用Flexus X实例搭建Dubbo-Admin服务

一、Flexus X实例简介 华为云推出的Flexus云服务&#xff0c;作为专为中小企业及开发者设计的新一代云服务产品&#xff0c;以其开箱即用、体验卓越及高性价比而著称。其中的Flexus云服务器X实例&#xff0c;更是针对柔性算力需求量身打造&#xff0c;能够智能适应业务负载变化…

msvcp100.dll丢失怎样修复,总共有6种修复方法

在现代的数字化生活中&#xff0c;电脑已经成为我们工作、学习和娱乐的重要工具。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现各种问题&#xff0c;其中最常见的就是一些系统文件丢失或损坏。最近&#xff0c;有用户反映他们的电脑出现了“msvcp100.dll丢失”的问…

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期] 第七期介绍&#xff1a;事件订阅之WebSocket方式 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期]第七期介绍&#xff1a;事件订阅之WebSocket方式 WebSocket方式通用数据结构 Payload长连接维护 O…

LLMs之LCM:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读

LLMs之LCM&#xff1a;《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读 导读&#xff1a;MemLong 是一种新颖高效的解决 LLM 长文本处理难题的方法&#xff0c;它通过外部检索器获取历史信息&#xff0c;并将其与模型的内部检索过程相结合&#xff…

Linux C高级day3

一、思维导图 二、练习 #!/bin/bash mkdir ~/dir mkdir ~/dir/dir1 mkdir ~/dir/dir2 cp -r * ~/dir/dir1/ cp -r *.sh ~/dir/dir2/ cd ~/dir/dir2/ tar -cvJf dir2.tar.xz dir2 mv dir2.tar.xz ~/dir/dir1/ cd ~/dir/dir1 tar -xvJf dir2.tar.xz #!/bin/bash head -5 /etc/gr…

高版本JMX Console未授权

1.环境搭建 cd vulhub-master/jboss/CVE-2017-12149 docker-compose up -d 2.访问漏洞地址 nullhttp://47.121.211.205:8080/jmx-console/ 3.远程下载war包 输入远程war包的地址 http://47.121.211.205/shell.war 4.访问上传文件并进行连接 访问上传文件 使用工具进行连…

Jboss 靶场攻略

CVE-2015-7501 步骤一&#xff1a;环境搭建 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 步骤二&#xff1a;POC&#xff0c;访问地址 http://192.168.10.190:8080/invoker/JMXInvokerServlet 返回如下&#xff0c;说明接⼝开放&…

【Linux进程】进程退出

目录 前言 1. 进程退出的几种情况 2. 进程常见的退出方式 3. 退出码与错误码 4. 进程异常 5. exit与_exit 6. 进程等待 wait与waitpid 获取子进程status 非阻塞等待 前言 进程执行结束退出&#xff0c;就必然需要进行资源回收&#xff0c;子进程由父进程回收&#xff0c…

LampSecurityCTF4 靶机渗透 ( sqlmap ,ssh 参数调整 )

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testLampSecurityCTF4] └─$ sudo nmap -sn 192.168.50.0/24 [sudo] password for kali: Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-22 10:30 CST Nmap scan report for 192…

自闭症孩子送寄宿学校,给他们成长的机会

在自闭症儿童的教育与康复之路上&#xff0c;选择一种合适的寄宿方式对于孩子的成长至关重要。这不仅关乎到孩子能否获得专业的训练与关怀&#xff0c;还直接影响到他们未来的社交能力、独立生活能力以及心理健康。今天&#xff0c;我们将以广州的星贝育园自闭症儿童寄宿制学校…

【VUE3.0】动手做一套像素风的前端UI组件库---Radio

目录 引言做之前先仔细看看UI设计稿解读一下都有哪些元素&#xff1a;参考下成熟的组件库&#xff0c;看看还需要做什么&#xff1f; 代码编写1. 设计group包裹选项的组件group.vueitem.vue 2. 让group的v-model和item的value联动起来3. 完善一下item的指示器样式4. 补充禁用模…

MAE 模型

masked autoencoders (MAE) 论文地址&#xff1a;https://arxiv.org/abs/2111.06377 代码地址&#xff1a;https://github.com/facebookresearch/mae 模型结构图: 思想&#xff1a;自监督学习&#xff08;Self-Supervised Learning&#xff09;&#xff0c;遮住大部分&…

机器学习(1)sklearn的介绍和六个主要模块、估计器、模型持久化

文章目录 1.sklearn介绍2.sklearn的模块3.监督学习和无监督学习1. 监督学习 (Supervised Learning)例子 2. 无监督学习 (Unsupervised Learning)例子 4.估计器估计器的主要特性和方法包括&#xff1a;估计器的类型&#xff1a;示例&#xff1a;使用 scikit-learn 中的估计器 5.…

恶意windows程序

Lab07-01.exe分析&#xff08;DOS攻击&#xff09; 1.当计算机重启后&#xff0c;这个程序如何确保它继续运行(达到持久化驻留)? 创建Malservice服务实现持久化 先分析sub_401040桉函数 尝试获取名为HGL345互斥量句柄&#xff0c;如果不存在则直接结束流程&#xff1b;如果存…

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1&#xff1a; zotero个人免费空间大小&#xff1a;300M&#xff0c;如果zotero云端也保存文献pdf资料则远远不够 原因2&#xff1a; 百度网盘同步文件空间大小&#xff1a;1G123云盘同步文件空间大小&#xff1a;10G 第一台电脑实施步骤…

23章 排序

1.编写程序&#xff0c;分别使用Comparable和Comparator接口对元素冒泡排序。 import java.util.Comparator;public class MySort {public static <E extends Comparable<E>> void bubbleSort(E[] list) {boolean needNextPass true;for (int i 1; needNextPass…