泛型中的通配符<?>、<? extends T>、<? super T>的使用场景。ArrayList与LinkedList的区别及适用场景。

news/2024/12/21 21:25:26/

泛型中的通配符<?>、<? extends T>、<? super T>的使用场景。

在Java中,泛型通配符(wildcards)提供了一种灵活的方式来处理泛型类型,使得代码更加通用和类型安全。泛型通配符主要有三种形式:<?><? extends T> 和 <? super T>,它们各自有不同的使用场景。

1. <?> 的使用场景

<?> 表示未知类型,它可以用在泛型声明中,允许声明一个参数化类型的引用,但不具体指定参数的类型。这种用法可以使得代码更加灵活,能够处理多种类型的参数。

使用场景

  • 当你不关心具体的泛型类型,只需要一个泛型类型的引用时,可以使用 <?>
  • 在设计API或框架时,如果希望方法或类能够处理多种类型的参数,但又不想限制具体的类型,可以使用 <?> 来增加灵活性。

2. <? extends T> 的使用场景

<? extends T> 表示泛型类型的上界,即该泛型类型是T的子类型或T本身。它用于声明某种类型的通用性,同时允许接受T的子类或实现类。

使用场景

  • 读取数据:当你只需要从集合中读取数据而不需要修改数据时,使用 <? extends T> 可以确保你能接收T的子类。这样,你可以编写一个通用的方法来处理T及其所有子类的集合,而不需要为每种类型编写重复的代码。
  • 方法返回类型限定<? extends T> 通常用于方法的返回类型限定,因为它允许方法返回一个T或T的子类型,这增加了方法的灵活性。

3. <? super T> 的使用场景

<? super T> 表示泛型类型的下界,即该泛型类型是T的父类型或T本身。它用于确保你可以将T类型及其子类型的对象放入集合中。

使用场景

  • 写入数据:当你需要向集合中添加T类型或其子类型的对象时,使用 <? super T> 可以确保类型安全。这样,你可以编写一个通用的方法来向集合中添加元素,而不需要担心具体的集合类型。
  • 方法参数类型限定<? super T> 通常用于方法的参数类型限定,因为它允许方法接收T的父类型或T本身作为参数,这增加了方法的灵活性。

总结

  • <?>:用于不关心具体泛型类型的情况,增加灵活性。
  • <? extends T>:用于读取数据,确保能接收T的子类,常用于方法返回类型限定。
  • <? super T>:用于写入数据,确保能添加T类型及其子类的对象,常用于方法参数类型限定。

这些通配符的使用场景和规则,使得Java的泛型编程更加灵活和强大,同时也保证了类型安全。

ArrayList与LinkedList的区别及适用场景。

ArrayList与LinkedList在Java集合框架中都是常用的List实现类,它们之间存在明显的区别,这些区别决定了它们各自适用的场景。以下是它们的主要区别及适用场景的详细分析:

主要区别

  1. 内部实现
    • ArrayList:基于数组实现的动态数组,元素在内存中是连续存储的。
    • LinkedList:基于双向链表实现的列表,元素通过节点和指针进行连接,不需要连续的内存空间。
  2. 随机访问效率
    • ArrayList:支持快速的随机访问,可以通过索引直接访问元素,时间复杂度为O(1)。
    • LinkedList:不支持快速的随机访问,需要从头或尾开始遍历链表,时间复杂度为O(n)。
  3. 插入和删除效率
    • ArrayList:在插入和删除元素时,可能需要移动操作点之后的所有元素,以保持数组的连续性,时间复杂度为O(n)。
    • LinkedList:在插入和删除元素时,只需要修改相关节点的指针,时间复杂度为O(1)(在链表两端操作)或O(n)(在链表中间操作,因为需要遍历到指定位置)。但总体来说,LinkedList在插入和删除操作上通常比ArrayList更高效。
  4. 空间占用
    • ArrayList:需要预留一定的空间,并且随着元素的增加可能会进行扩容操作,这可能会占用较多的连续内存空间。
    • LinkedList:节点是动态分配的,不需要预留连续空间,但在每个节点上都会额外存储一些信息(如前驱和后继节点的引用),这可能会增加一定的空间开销。
  5. 使用便利性
    • ArrayList:使用较为方便,只需创建并添加数据,通过调用下标即可使用。
    • LinkedList:虽然提供了额外的操作(如添加元素到列表头部或尾部),但相对于ArrayList来说,使用上可能稍显不便。

适用场景

  1. ArrayList
    • 适用于需要频繁进行随机访问或修改操作,而对插入和删除操作要求不高的场景。
    • 当元素数量在初始化时就能确定或大致确定时,使用ArrayList也是合适的。
    • 例如,存储用户列表、缓存数据等。
  2. LinkedList
    • 适用于需要频繁进行插入和删除操作,特别是对链表两端操作较多的场景。
    • 由于LinkedList可以在任意位置进行高效的添加/删除操作,因此也适用于需要有序集合并对元素进行排序的场景。
    • 例如,实现栈、队列等数据结构,以及需要频繁在链表头部或尾部插入/删除元素的场景。

总结

ArrayList和LinkedList各有优劣,选择哪种数据结构取决于具体的使用场景。在需要频繁进行随机访问或预知元素数量的场景下,ArrayList是更好的选择;而在需要频繁进行插入和删除操作,特别是对链表两端操作较多的场景下,LinkedList则更为合适。


http://www.ppmy.cn/news/1534667.html

相关文章

水污染水质检测数据集 2400张 水污染 带标注 voc yolo 4类

水污染水质检测数据集 2400张 水污染 带标注 voc yolo 水污染水质检测数据集 名称 水污染水质检测数据集 (Water Pollution Detection Dataset) 规模 图像数量&#xff1a;2487张图像。类别&#xff1a;4种水质类别。标注个数&#xff1a;2489个标注。 数据划分 训练集 (…

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制&#xff1f; 答&#xff1a;其概念跟 Python教程 介绍的一样&#xff0c;只是语法上有所变化。 参考流程图如下&#xff1a; 其对应语法&#xff1a; var i 0; // 设置起始值 var minutes 15; // 设置结束值&#xff08;15分钟…

以旅游购物贸易方式报关出口的货物是什么意思

旅游购物贸易方式的定义 ‌旅游购物贸易‌是指国内外旅游者通过旅游渠道&#xff0c;携带外币现钞、外币票据入境&#xff0c;到外汇指定银行兑换成人民币&#xff0c;并在特定区域进行商品采购、报检、报关后&#xff0c;将所购货物运回国内进行销售的贸易行为。这种贸易方式通…

【揭秘测绘艺术】从基础到法律,绘制地球的智慧蓝图

在人类探索与塑造世界的征途中&#xff0c;有一门古老而又现代的科学默默发挥着基石作用——测绘。它不仅仅是地图的绘制&#xff0c;更是对地球空间信息的精准捕捉与智慧应用。今天&#xff0c;让我们一起走进测绘的世界&#xff0c;解码“测绘”与“基础测绘”的内涵&#xf…

10款物联网开源嵌入式操作系统对比分析

摘要 本文对目前市场上广受欢迎的10款物联网开源嵌入式操作系统进行了深度对比分析&#xff0c;包括Huawei LiteOS、RT-Thread、AliOS Things等。通过探讨这些操作系统的实时性、可扩展性、特点、运行要求、开发社区活跃度和应用领域等方面&#xff0c;帮助开发者更好地理解它…

记录一次病毒启动脚本

在第一次下载软件时&#xff0c;目录中配了一个使用说明&#xff0c;说是需要通过start.bat 这个文件来启动程序&#xff0c;而这个 start.bat 就是始作俑者&#xff1a; 病毒作者比较狡猾&#xff0c;其中start.bat 用记事本打开是乱码&#xff0c;但是可以通过将这个批处理…

MFC工控项目实例之十九手动测试界面输出信号切换

承接专栏《MFC工控项目实例之十八手动测试界面输入信号实时检测》 根据板卡设置界面组合框选项设定的输出信号&#xff0c;通过读取文件中保存的键值&#xff0c;用单选按钮切换输出信号接通、关闭。 1、在Data_1.h文件中添加代码 CString COMB_Data_O_1[]{"夹紧",&…

TypeScript高级内容

完整总结 本节课涵盖了本地开发环境的搭建、前后端的基本交互、以及如何封装 Axios 以增强代码的安全性和可维护性。此外&#xff0c;我们还解决了在代码实现过程中可能遇到的一些常见问题。 1. 本地环境搭建 安装环境依赖&#xff1a;首先需要在本地安装 Node.js&#xff0…