推荐使用list1.equals(list2)判断arraylist内容是否完全相同,它先比大小再逐元素equals比较,顺序不同即为不等;自定义对象需重写equals和hashcode;null安全写法为lista != null ? lista.equals(listb) : listb == null。

直接用 list1.equals(list2) 就行,这是最标准、最推荐的方式。
为什么 equals() 能准确判断内容完全一样
ArrayList 的 equals() 方法已重写,它会逐个比对两个列表:
- 先检查大小是否相等;
- 再按索引顺序依次调用每个元素的
equals()方法(要求元素类型正确实现该方法); - 空列表之间也返回
true; - 顺序不同即视为不等(比如
[1,2]和[2,1]返回false)。
自定义对象要注意重写 equals() 和 hashCode()
如果 ArrayList 存的是你自己写的类(如 User),必须重写 equals()(以及配套的 hashCode()):
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 否则默认比较的是内存地址,两个内容相同但不同实例的对象会判为不等;
- IDE 通常支持一键生成(如 IntelliJ 的
Alt+Insert → equals and hashCode)。
其他方式适用场景有限,慎用
以下方法不是“内容完全一样”的等价替代:
-
containsAll()只能判断元素是否存在,不保证顺序和重复次数([1,1,2]和[1,2]也可能返回true); - 手动遍历或转数组比较,代码冗长且易出错,没必要;
- 排序后比较(
Collections.sort()+equals())可忽略顺序,但改变了原列表或需额外复制,仅在明确需要“忽略顺序”时才用。
一行代码示例
✅ 推荐写法:
boolean same = listA != null ? listA.equals(listB) : listB == null;
这行已兼顾了 null 安全——如果两个都为 null 返回 true,一空一非空返回 false,都不为空则走标准 equals 流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










