Java - 集合类对象相等判定
约 472 字大约 2 分钟
集合类对象相等判定
Oject类中的 equals 方法比较的是地址,所以自己定义的类要自己重写 equals 等方法,否则给你当成 Object 类
equals 方法 和 == 的区别
集合类中并不是通过 == 进行判断的,都是根据 equals 方法进行判断的
remove 也是根据 equals 进行判断来删除元素

对于
List列表 判断两个元素是否相同,是根据 元素中的equals方法判断的public class Main { public static void main(String[] args) { List<Test> list = new ArrayList<>(); Test t1 = new Test("A"); Test t2 = new Test("A"); list.add(t1); System.out.println(list.remove(t2)); // 这样会把 t1 移除,因为 Test 的 equals 判断修改成根据 name 进行判断 } static class Test { String name; public Test(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Test test = (Test) o; return Objects.equals(name, test.name); } } }对于
Map以及Set而言 两个对象只有equals方法判断相同后,还需要判断hashCode方法也相同,才认为这两个元素是相同的对于
Object定义中提到,如果两个对象通过equals判断相同,那么它们的hashCode也需要相同。因此,在重写
equals方法时,也需要考虑重写hashCode方法,保证当两个对象通过equals方法判断相同时,它们通过hashCode得到的hash值也相同如下,因为重写了
equals和hashCode所以只要 name 一致,通过map操作就是相同的public class Main { public static void main(String[] args) { Test t1 = new Test("A"); Test t2 = new Test("A"); Map<Test, Integer> map = new HashMap<>(); map.put(t1, 2); System.out.println(map.get(t2)); } static class Test { String name; public Test(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Test test = (Test) o; return Objects.equals(name, test.name); } @Override public int hashCode() { return Objects.hashCode(name); } } }
