Java记录 -60- TreeSet抛出ClassCastException

Java List排序原理与实战:从Timsort到并发安全 List排序是Java集合操作中最常用也最易被误解的基础能力,其本质并非简单API调用,而是涉及算法选择(如Timsort)、比较契约(Comparator)、泛型擦除、内存模型与线程安全的综合体现。理解排序原理有助于规避空指针、并发修改、不可变视图等高频异常;掌握Timsort在部分有序数据中的O(n)优势,可显著提升日志、订单、配置等真实场景性能;而正确处理null安全、动态字段排序、Stream与原地排序选型,则直接决定系统稳定性与吞吐量。本文聚焦Java开发者在日常开发、面试和线上排障中反复遭遇的核 阅读详情

TreeSet实现了SortedSet也实现了Set,但它不是随便一个对象都能存储:

public class TreeSetTest {    public static void main(String[] args){        TreeSet tree = new TreeSet();        tree.add(new Pepole("zhangsan"));        tree.add(new Pepole("lisi"));                System.out.println(tree);    }}class Pepole{    int age;    String name;    public Pepole(String name){        this.name = name;    }}

执行上面的代码会得到下面的异常信息:

Exception in thread "main" java.lang.ClassCastException: my.set.Pepole cannot be cast to java.lang.Comparable    at java.util.TreeMap.put(TreeMap.java:542)    at java.util.TreeSet.add(TreeSet.java:238)    at my.set.TreeSetTest.main(TreeSetTest.java:10)

上面的异常出现在往TreeSet里放第二个对象时报的异常,放置第一个的时候没有问题。

放置第二个对象时会用第二对象和TreeSet里的对象进行比较,看是否重复;然而我们自己定义的Pepole没有指定排序规则,所以会抛出异常。

查看TreeSet的add方法可以发现其有这么一个提示:

ClassCastException - 如果指定对象无法与此 set 的当前元素进行比较


Java Collections.sort()底层原理与高并发排序实战 排序是编程中最基础的算法操作之一,其核心涉及比较、交换与稳定性保障。Java中Collections.sort()作为最常用的集合排序工具,实际封装了TimSort、双轴快排与插入排序等多策略协同机制,依据数据规模、有序性特征及Comparator契约动态选择最优路径。它不仅关乎时间复杂度,更直接影响内存分配、GC压力与线程安全行为。在电商订单、日志分析、实时榜单等典型业务场景中,错误使用Comparator、忽略List实现类差异(如ArrayList vs LinkedList)、盲目在高并发下直接调用 阅读详情

相关推荐

在TreeSet中实现存储自定义对象

在TreeSet中实现存储自定义对象 一、先来看一下TreeSet的继承结构和类声明形式继承结构:java.lang.Object    |_ java.util.AbstractCollection         |_ java.util.AbstractSet               |_ java.util.TreeSet 类声明:public class 

lubiaopan的专栏 5765

解决java.util.HashSet cannot be cast to java.util.List

这样强制转换编译会提示Unchecked cast: ‘java.lang.Object’ to ‘java.util.List’,编译器的意思该强制类型转换并未做类型校验,强制转换并不安全,可能会抛出异常导致程序崩溃。想把它转换为List,如果直接用了强转 List values = (List) map1.values(),就会报错。它接受两个参数,一个是obj,即是我们需要转换的List对象,然后传入List中元素的class即可。

恒二哥的博客 6324

Java集合框架、并发修改异常、Lamabda表达式

javaList/map面试题

の博客 565

java.util.list 报错_cannot be cast to java.util.List

java.lang.ClassCastException: [Ljava.lang.Long; cannot be cast to java.util.List1. 使用人人安全框架,发现java.util.List报错信息### The error may involve io.renren.modules.job.dao.ScheduleJobDao.updateBatch### The er...

weixin_39678451的博客 9471

拼多多Android面试题及参考答案

Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。

大模型大数据攻城狮的专栏 1279

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 939

java.lang.ClassCastException: java.util.TreeMap$Values cannot be cast to java.util.ArrayList

今天,在做项目的时候用到TreeMap.values();这个方法,本来是要获取ArrayList<>类型的集合。因为TreeMap.values();方法返回的是Collection<V>接口,ArrayList是实现了Collection<V>接口的,但是强转类型发生了上述错误,哈哈哈,解决方案如下: 错误代码如下: TreeMap<Integer...

天生卷发 2009

智能制造 | 如何快速自动生成站位表及自动与BOM校验?

一、站位表(SMT行业中)是SMT上料防错的基础信息,用于对需上料物料与产线、贴片机位置、飞达规格型号、用量,建立基础资料。 SMT站位表是否正确? 首先需要人工确认站位表与SMT程序的是否符合,上料员依照站位表安装好后,确认人员需有第三方确认者 (品管确定)核对。 站位表内容包括什么? 站位表内容为:SMT站位号相对应的物料编码,元件位号,飞达大小/间距,数量等等,根据不同公司的要求而定义。 就目前来说,基本每一款贴片机都可以输出站位清单 但对于企业来说,直接输出的站位清单一般不直接使用,需要进行手动处理

vayoinfo111的博客 4941

TreeSet在add对象时报ClassCastException错误

TreeSet实现了SortedSet接口,可以对集合中的对象进行排序,但是在使用TreeSet时要注意一点,那就是要给TreeSet传递一个比较器,也就是指定比较规则,否则的话,它就不知道谁大谁小,也就不能排序了。此时它会报一个ClassCastException的异常。jdk1.6文档里add方法关于这个异常是这样描述的: Throws: ClassCastException - if t

秦彬桂的专栏 2287

mtk-drm初始化

mtk-drm初始化走读

zhexingsunba的博客 4928

瑞芯微Android固件修改实战:从解包到root提权完整流程(附工具包)

本文详细解析了瑞芯微Android固件深度定制全流程,涵盖从固件包解包、系统镜像修改到植入root提权与分区调整的实战步骤。通过工具链操作与原理剖析,指导开发者安全实现系统精简、权限获取及存储扩容,最终完成固件重新打包与刷机验证,适用于追求设备完全控制权的技术爱好者。

ujm56789012的博客 697

java.util.HashMap$Values cannot be cast to java.util.List 解决方法

记一次报错:java.util.HashMap$Values cannot be cast to java.util.List一、想获取map的值集合,将之转换为List。 一、想获取map的值集合,将之转换为List。 HashMap<String, Map> map1 = new HashMap<>(); 获取值集合:map1.values() 默认返回值是 Collection 想把它转换为List,直接用了强转 List values = (List) map1.val

weitemao的博客 7544

Zabbix安装与部署 系统环境:centos7.0

Zabbix安装与部署 系统环境:centos7.0

weixin_42485027的博客 2600

2017新奥特Java校招笔试题全解析:从基础到并发,吃透这套就够了

Java基础语法、集合框架、JVM内存模型和多线程并发,是每一位Java工程师绕不开的核心功底,也是企业校招笔试中最常考察的能力维度。理解这些底层原理,不仅能在面试中从容应对连环追问,更能帮助开发者在实际项目中做出合理的性能优化和并发设计。本文从Java基础语法与面向对象思想入手,逐步深入到集合框架的底层实现、JVM内存分区与垃圾回收机制、线程池与锁的运用,并结合笔试中典型的算法题型,讲解各知识点的考察意图与工程实践。通过拆解一套2017年的Java校招真题,为准备校招或系统梳理基础的同学,划出一条清晰的能

weixin_34392435的博客 380

知识存储之Apache Jena

知识图谱的存储可以分为基于表结构的存储和基于图结构的存储。1️⃣基于表结构的存储基于表结构的存储利用二维的数据表对知识图谱中的数据进行存储。根据不同的设计原则,知识图谱可以具有不同的表结构:💨知识图谱实质上是一个个的三元组,一种简单直接的存储方式是设计一张三元组表用于存储所有三元组,有不少比较成熟的产品利用该形式存储知识图谱,包括Jena、Oracle、Virtuoso等。💨为每种类型构建一张表,同一类型的实例存放在相同的表中。

Puzzle的博客 6064

使用YubiKey进行全盘加密、加密启动分区以及利用UEFI安全启动的详细指南

在本教程中,我们将使用YubiKey来增强电脑的安全性,通过加密整个硬盘,确保只有持有正确YubiKey的人才能访问。UEFI安全启动是一种在UEFI固件级别实施的安全标准,确保计算机仅启动签名的启动加载程序。为了符合您的要求,我将以此方式分配内容,确保每部分都有详尽的说明和代码。现在,您已经成功地使用YubiKey设置了全盘加密,并使用UEFI安全启动为系统增加了额外的安全层。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。

qq_38334677的博客 1004

Java核心概念与编程实践指南

Java作为面向对象编程语言的代表,其核心概念包括数据类型系统、运算符原理和控制结构设计。数据类型分为基本类型和引用类型,直接影响内存使用和程序性能。运算符包含算术、关系和位运算等,理解其底层机制能避免常见陷阱。控制结构如if-else和循环的优化写法能提升代码可读性。面向对象三大特性(封装、继承、多态)是构建健壮系统的基石,而集合框架与泛型则提供了高效的数据处理能力。在并发编程领域,线程池和并发工具类的合理使用能显著提升系统吞吐量。掌握这些Java基础核心概念,是进行Spring框架开发和微服务架构设计的

weixin_33728708的博客 309

Wsl/InstallDistro/Service/RegisterDistro/CreateVm/HCS/E_INVALIDARG

摘要:安装WSL2时遇到E_INVALIDARG错误(多核CPU问题),可通过创建.wslconfig配置文件解决。配置内容包括:渐进式内存回收、自动代理、模拟虚拟系统调用、限制内存为4GB和处理器核心数为4。需确保已启用虚拟机平台和Linux子系统功能。 (98字)

猿小白的博客 1042

JB1-4-高级进阶(一)

异常(处理,分类,家族),处理方案(try,catch,finally,try-with-resources,return,throws,throw),异常方法重写原则,泛型(类泛型,形参泛型,泛型限定),List容器(ArrayList,LinkedList),Set容器(HashSet,TreeSet,Comparable,Comparator),Map容器(HashMap,TreeMap,EnumMap),反射(类对象,构造器,属性,方法,注解,泛型),动态编译,动态运行等。

周航宇的博客 1397

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JAVA面试题(1~95)《上》

1、面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性...

ywl470812087的博客 4963

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java开发从入门到精通

super(msg);一句话总结:UpdateWrapper 的.eq()是 UPDATE 的 WHERE,不是 SELECT 的 WHERE;选 Query 还是 Update Wrapper,看你要执行的是"查/删"还是"改",改就必须用 UpdateWrapper(因为只有它能.set()查就用。BaseMapper 是"底层砖块":提供单条记录的 CRUD 操作,所有查询最终都通过它执行。ServiceImpl / IService 是"上层封装"

weixin_44361375的博客 169

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

记TreeSet在添加pojo对象遇到ClassCastException及解决方案

场景 在实际业务中有保证集合元素唯一且有序的需要,稍加思索后决定使用TreeSet,TreeSet底层实现为TreeMap而TreeMap底层实现为二叉树,从而可以确保TreeSet元素有序且唯一。 模拟异常(java.lang.ClassCastException) // 女朋友实体 public class Girlfriend { private String name; private int age; public String getName() {

LastTemplar的博客 440

Java报错:Exception in thread “main“ java.lang.ClassCastException

具体错误: Exception in thread “main” java.lang.ClassCastException: a.b.c.A cannot be cast to java.lang.Comparable at java.util.TreeMap.compare(TreeMap.java:1294) at java.util.TreeMap.put(TreeMap.java:538) at java.util.TreeSet.add(TreeSet.java:255) at a.b.c.ce

tjk12345的博客 7490

Exception in thread “main“ java.lang.ClassCastException 类型转换异常

Exception in thread "main" java.lang.ClassCastException 类型转换异常

weixin_51720569的博客 6355

向TreeSet集合中添加元素出现ClassCastException问题

TreeSet是二叉树集合,默认情况下,其中的元素不允许重复,向集合中添加基本数据类型时,它会根据元素的unicode自然排序。 举例: 在添加对象元素时: 解决办法有两种: 第一种:在创建Treeset对象时,直接创建匿名内部类,对age属性进行升序排序: 第二种方法是让Person类实现Comparable接口,并且重写compareTo()方法:

Zhao_yanpeng的博客 1085
上一篇: Java记录 -59- SortedSet
下一篇: Java记录 -61- 比较器Comparator
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值