讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中如何在集合中存储自定义对象_Java对象集合解析

轻婷同学_5837

轻婷同学_5837

发布时间:2026-02-18 10:50:03

|

324人浏览过

|

来源于php中文网

原创

可以,但需重写equals()和hashCode()以确保contains()等方法正常工作;TreeSet/TreeMap需实现Comparable或传入Comparator;序列化问题通常源于getter缺失、无参构造函数缺失或字段命名不规范。

在java中如何在集合中存储自定义对象_java对象集合解析

自定义对象能直接放进 ArrayList 吗?

可以,但必须确保对象具备基本的“可存性”:即类已正确定义,且没有违反集合底层要求。Java 集合(如 ArrayList、HashSet)本身不限制元素类型,但实际使用中会暴露两类关键问题:NullPointerException(因字段未初始化)、以及逻辑错误(如 contains 或 remove 失效)。根本原因往往不是“能不能放”,而是“放进去后能不能正确识别和比较”。

为什么 contains() 找不到已添加的对象?

因为默认的 equals() 和 hashCode() 继承自 Object,只比较引用地址。即使两个对象字段值完全一样,只要不是同一个实例,contains() 就返回 false。

解决方法是重写这两个方法:

  • equals() 要用 instanceof 判类型,逐个比较有意义的字段(注意 null 安全,推荐用 Objects.equals(a, b))
  • hashCode() 必须与 equals() 保持一致:相等的对象必须有相同哈希值;建议用 Objects.hash(field1, field2) 生成
  • 如果用 Lombok,加 @EqualsAndHashCode 注解即可,但需确认它包含的字段符合业务语义(例如不把临时计算字段或数据库 ID 加进去)

TreeSet 或 TreeMap 存自定义对象报 ClassCastException 怎么办?

这类集合依赖自然序(Comparable)或外部比较器(Comparator),不会调用 equals()。错误通常出现在:对象没实现 Comparable,或实现时用了错误类型(比如 compareTo(Object o) 里强制转成子类却传入了父类)。

立即学习“Java免费学习笔记(深入)”;

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载

两种修复路径:

  • 让类实现 Comparable<yourclass></yourclass>,并在 compareTo() 中用 Integer.compare(this.id, other.id) 等安全方式比较字段
  • 构造集合时显式传入 Comparator,例如:new TreeSet((a, b) -> Integer.compare(a.getAge(), b.getAge()))
  • 注意:若同时用了 Comparable 和自定义 Comparator,后者优先;但别在两者中混用不同排序逻辑,否则 contains() 行为不可预测

序列化或 JSON 转换时字段丢失或报错?

这和集合存储无关,但常被一起遇到——尤其用 ArrayList<person></person> 存对象后转 JSON,结果只有空 {} 或抛 JsonMappingException。

常见原因和对策:

  • 字段是 private 但没提供 public getter(Jackson 默认只序列化 getter 方法暴露的属性)
  • 类没无参构造函数(Jackson 反序列化需要)
  • 用了 Lombok 的 @Data 却忘了 @NoArgsConstructor(尤其当存在全参构造时,Lombok 不再自动生成无参构造)
  • 字段名含下划线或大小写不规范,而 JSON 库默认开启驼峰映射(如 user_name → userName),可配 @JsonProperty("user_name") 强制指定

真正麻烦的是“对象能存进集合、也能打印出来,但一转 JSON 就崩”,这时候得盯紧 getter 和构造函数,而不是怀疑集合本身。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3899

2025.09.10

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

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

549

2023.09.22

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

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

1698

2024.03.01

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

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

549

2023.09.22

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

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

1698

2024.03.01

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn