元素相同但顺序不同的两个ArrayList是否相等?能否判定等价执行操作?
关于ArrayList相等性的两个问题解答
嘿,我来帮你理清这两个关于ArrayList相等性的问题:
问题1:两个包含相同元素但顺序不同的ArrayList是否相等?
直接给结论:不相等。
Java里的ArrayList默认的equals()方法是严格按顺序做比较的——它会逐个检查两个列表对应索引位置上的元素是否相等,只有当两个列表的大小完全一致,且每一个位置的元素都匹配时,才会返回true。哪怕元素全一样,只要顺序不对,结果就是false。
举个直观的代码例子:
ArrayList<String> listA = new ArrayList<>(Arrays.asList("a", "b", "c")); ArrayList<String> listB = new ArrayList<>(Arrays.asList("b", "c", "a")); System.out.println(listA.equals(listB)); // 输出 false
问题2:PL1和INITIAL1元素相同顺序不同时,是否相等?能否判定等价并执行指定操作?
按默认的equals()方法来看,这两个列表肯定不相等,毕竟顺序不一样。但如果你想要的是判定它们“元素集合等价”(也就是包含的元素完全相同,不考虑顺序),那完全可以通过额外逻辑实现,之后就能执行你需要的指定操作了。
给你几种常用的实现方式:
- 排序后比较:把两个列表都排序,再用
equals()检查。这种方法适合元素本身是可排序的类型(比如String、Integer这些实现了Comparable接口的):ArrayList<String> pl1 = new ArrayList<>(Arrays.asList("00", "01", "02")); ArrayList<String> initial1 = new ArrayList<>(Arrays.asList("01", "02", "00")); // 注意:如果不想修改原列表,可以先复制一份再排序 ArrayList<String> pl1Copy = new ArrayList<>(pl1); ArrayList<String> initial1Copy = new ArrayList<>(initial1); Collections.sort(pl1Copy); Collections.sort(initial1Copy); boolean isEquivalent = pl1Copy.equals(initial1Copy); // 这里会返回 true - 用Multiset统计元素次数:如果你的元素可能有重复,或者不想修改原列表,可以用Guava库的
HashMultiset(它会统计每个元素的出现次数),直接比较两个Multiset是否相等:Multiset<String> pl1Set = HashMultiset.create(pl1); Multiset<String> initial1Set = HashMultiset.create(initial1); boolean isEquivalent = pl1Set.equals(initial1Set); // 元素相同且次数一致就返回true - 手动统计(无第三方库):先检查两个列表大小是否相同,然后遍历其中一个列表,用临时Map统计每个元素的出现次数,再遍历另一个列表核对次数,最后确认所有元素的次数都匹配。这种方法适合不想引入外部依赖的场景。
总结一下:默认规则下二者不相等,但通过自定义逻辑可以判定它们是否“元素等价”,之后就能执行你需要的操作啦。
内容的提问来源于stack exchange,提问作者Deep Chhowala
相关产品推荐
相关产品推荐

