0

0

集合框架综合实战练习_从零实现一个支持泛型和排序的动态容器

P粉602998670

P粉602998670

发布时间:2026-02-19 09:10:58

|

131人浏览过

|

来源于php中文网

原创

自定义容器应构造时接收comparator参数,为null时安全检查元素是否实现comparable并调用compareto;排序统一走私有compare(t a,t b)方法;类型推断优先显式传入class;动态插入用二分查找+arraycopy优于全量排序;toarray需按规范处理数组长度与类型。

集合框架综合实战练习_从零实现一个支持泛型和排序的动态容器

Java 里怎么让自定义容器支持 ComparableComparator 两种排序?

必须在容器内部预留排序策略的接入点,不能硬编码比较逻辑。否则泛型类型一换,compareTo() 就可能抛 ClassCastException

实操建议:

  • 容器构造时接受 Comparator<t></t> 参数,为 null 时才尝试调用元素自身的 compareTo()
  • 判断是否可比较,别用 instanceof Comparable —— 因为泛型擦除后是 Comparable>,实际检查应为 t instanceof Comparable && t.getClass() != Object.class
  • 排序入口统一走一个私有方法 compare(T a, T b),内部按上述规则分发,避免多处重复逻辑

泛型擦除后,怎么在运行时获取真实元素类型并做安全转换?

不能靠 getClass().getGenericSuperclass() 硬猜,尤其当你的容器被继承或嵌套使用时,返回的可能是 Object 或父类声明类型。

实操建议:

  • 如果容器用于构建过程(如 builder 模式),把类型信息通过 Class<t></t> 显式传入,比如 new SortedList<string>(String.class)</string>
  • 若必须推断,只在直接 new 的场景下用反射取构造器泛型参数,且加 try-catchNullPointerException
  • 所有涉及强转的地方(如从 Object[] 数组取元素)必须用 (T) obj + @SuppressWarnings("unchecked"),但要确保上层逻辑已验证类型一致性,否则运行时崩得无声无息

插入排序 vs. 每次 Collections.sort():哪个更适合动态容器?

频繁增删时,每次都全量重排会把时间复杂度拉到 O(n²),而插入排序维持有序性只需 O(n) 单次操作,更可控。

紫东太初
紫东太初

中科院和武汉AI研究院推出的新一代大模型

下载

实操建议:

  • 用二分查找定位插入位置(Arrays.binarySearch()),再用 System.arraycopy() 移动后续元素,比先 add 再 sort 快且内存友好
  • 注意 binarySearch() 返回负值时的计算公式:插入点 = -(index) - 1,写错会导致越界或漏位
  • 如果允许重复元素,binarySearch() 不保证返回首个/末尾匹配项,要用 Arrays.asList(arr).indexOf() 辅助校验,或者改用 TreeSet 底层思路(但那就不是“从零实现”了)

为什么 toArray(T[]) 方法一定要检查数组长度并新建实例?

因为 JDK 规范强制要求:如果传入数组够大,就复用;不够大,必须返回新数组。不照做,和 ArrayList 交互时会触发 ArrayStoreException

实操建议:

  • 别直接 return (T[]) elements —— 这是裸数组,类型不匹配;也别 new T[size] —— 泛型无法实例化
  • 正确写法:if (a.length size) a[size] = null; return a; }
  • 特别注意:当 anew String[0] 这种零长数组时,a.getClass()String[].class,能正确推导泛型,这是唯一安全的类型来源

泛型容器最麻烦的从来不是排序逻辑本身,而是类型擦除后那些看似“应该能推出来”的地方——比如数组创建、异常捕获范围、甚至 toString() 里遍历元素时的隐式转型。这些地方不出错则已,一出就是运行时静默失败。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

770

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

786

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

820

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

401

2023.09.04

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

401

2023.09.04

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

665

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

21

2025.12.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号