List.contains 查重和 HashSet 查重区别
ArrayList.contains(tmp) 使用的是 equals()。
它会遍历 ans 中已有的三元组,逐个判断是否和 tmp 相等。可以近似理解成:
for (List<Integer> existing : ans) {
if (tmp.equals(existing)) {
return true;
}
}
return false;
而 List.equals() 比较的是:长度相同,并且对应位置的元素都通过 equals() 判断相等。
Arrays.asList(-1, 0, 1).equals(Arrays.asList(-1, 0, 1)); // true
Arrays.asList(-1, 0, 1).equals(Arrays.asList(0, -1, 1)); // false
里面的元素是 Integer,它的 equals() 比较整数值。因此,即使是两个新建的 List,只要内容和顺序一致,contains 就能识别出来。
对比:
==:对于 List,判断是不是同一个对象。List.equals():判断元素和顺序是否相同。HashSet:先通过hashCode()定位,再用equals()判断是否重复;哈希值相同不代表一定相等。
因此同样是判断是否存在,ArrayList 和 HashSet 时间复杂度一个是 o(m) 一个是 o(1)。

浙公网安备 33010602011771号