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

论 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());  // 输出: 10
        System.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()); // 输出: A
        System.out.println("移除: " + arrayDeque.poll());     // 输出: A
        System.out.println("队首元素: " + arrayDeque.peek()); // 输出: B
    }
}

所以说

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

结尾

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


http://www.kler.cn/a/314988.html

相关文章:

  • 【大数据学习 | HBASE高级】storeFile文件的合并
  • git没有识别出大写字母改成小写重命名的文件目录
  • Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解
  • 设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
  • 成都睿明智科技有限公司解锁抖音电商新玩法
  • odoo 17 后端路由接口认证自定义
  • 注册信息安全专业人员(CISP)和网络安全的联系与区别
  • FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)
  • windows cuda12.1 pytorch gpu环境配置
  • js之遍历方法
  • windows@文件系统链接@快捷方式@快捷键方式和符号链接及其对比
  • 本地提权【笔记总结】
  • 《AI:开启未来的无限可能》
  • 【django】局域网访问django启动的项目
  • MongoDB解说
  • 机器人速度雅可比矩阵(机器人动力学)
  • 自动化立体仓库与堆垛机单元的技术参数
  • 设计模式之结构型模式例题
  • 简单题35-搜索插入位置(Java and Python)20240919
  • 如何使用 C# 解决 Cloudflare Turnstile CAPTCHA 挑战
  • Flyway 基本概念
  • 零停机部署的“秘密武器”:为什么 Kamal Proxy 能成为你架构中的不二之选?
  • 面试金典题2.2
  • HarmonyOS 速记
  • java 面试题总结(基础篇)
  • 中泰免签,准备去泰国旅游了吗?《泰语翻译通》app支持文本翻译和语音识别翻译,解放双手对着说话就能翻译。