直接用equals()方法即可,它严格比较顺序和内容是否一致;若需忽略顺序,推荐排序后比较或用频率统计法。

直接用 equals() 方法就行,这是最标准、最推荐的方式。
默认 equals() 比较:顺序和内容都必须一致
ArrayList 的 equals(Object o) 继承自 AbstractList,它严格遵循 List 接口规范:
- 先判断是否为同一对象(
this == o),是则返回true - 再检查参数是否为
List类型,不是则返回false - 比较两个列表长度,不等直接返回
false - 按索引从 0 到
size()-1逐个调用Objects.equals(get(i), other.get(i))比较元素
注意:Objects.equals 能安全处理 null(null == null 为 true,null 与非 null 为 false);最终结果取决于每个元素自身的 equals() 实现。比如 String、Integer 等包装类已重写,自定义对象必须自己重写 equals()(通常也要配套重写 hashCode())。
如果想忽略顺序,需要额外处理
原生 equals() 不支持乱序相等。常见做法有三种:
立即学习“Java免费学习笔记(深入)”;
-
排序后比较:对两个 ArrayList 分别调用
Collections.sort()(要求元素可比较),再用equals() -
用 containsAll 双向校验:
list1.containsAll(list2) && list2.containsAll(list1),但要注意它不检查重复次数(比如[a,a,b]和[a,b,b]会误判为相等) -
转成频率统计(推荐用于含重复元素的场景):用
Map<E, Integer>或 Guava 的Multiset统计各元素出现次数,再比对两个统计结构是否相等
其他方式慎用
有些写法看似简洁,但存在明显缺陷:
-
list1.retainAll(list2):会修改原列表,且不能直接得出“是否相等”的布尔结果 -
list1.stream().sorted().collect(...).equals(...):创建新集合开销大,不如先排序再 equals - 手动遍历 +
contains()嵌套循环:时间复杂度 O(n²),大数据量时性能差,且同样无法准确处理重复
空列表和 null 的处理
ArrayList 的 equals() 对空列表友好:两个空 ArrayList 调用 equals() 返回 true。但传入 null 参数会直接返回 false(不会 NPE)。若需支持 null 安全比较,建议先判空:
if (list1 == null || list2 == null) return list1 == list2; 再调用 equals()。


















