0

0

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

P粉602998670

P粉602998670

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

|

304人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

TreeSetTreeMap 存自定义对象报 ClassCastException 怎么办?

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

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

editGPT
editGPT

一款浏览器插件,让ChatGPT修改、校对英语文章

下载

两种修复路径:

  • 让类实现 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_nameuserName),可配 @JsonProperty("user_name") 强制指定

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

442

2023.08.07

json是什么
json是什么

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

544

2023.08.23

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

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

322

2023.10.13

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

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

81

2025.09.10

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的相关内容,可以阅读本专题下面的文章。

766

2024.03.01

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的相关内容,可以阅读本专题下面的文章。

766

2024.03.01

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

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

561

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.7万人学习

Java 教程
Java 教程

共578课时 | 67.7万人学习

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

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