集合框架比较两个对象是否相同(equals和hashCode方法)
package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思义,底层采用了哈希表算法。 * * 在HashSet中如何判断两个对象是否是否相等问题分析: * 1. 要用两个对象的equals方法比较,返回true说明对象相同。 * 2. 两个对象的hashCode方法返回值相同。 * * 对象hashCode决定了在哈希表中的存储位置。 * * 向HashSet集合中添加新对象时候,先会判断该对象和集合对象中的hashCode值: * 1. 不等:直接把该对象存储到hashCode的指定位置。 * 2. 相等:再继续判断新对象和集合对象中的equals做比较。 * 2.1. equals方法true,则视为是同一个对象,则不保存在哈希表中。 * 2.2. equals方法false,存储在之前对象同槽位的链表上(拒绝)。 * * 对象的HashCode和equals方法的重要性。 * * 存储在哈希表中的对象,都应该覆盖equals方法和hashCode方法,并且保证equals相等的时候hashCode值也相等。 * * ***************************************************************** * 结论:如果需要把我们自定义的对象存储到哈希表中,该类型的对象必须覆盖equals和hashCode方法, * 并在该方法中提供自己的判断规则,可以使用eclipse工具自动生成hashCode和equals方法。 * ***************************************************************** */ class A{ @Override public boolean equals(Object obj) { return true; } } class B{ @Override public int hashCode() { return 1; } } class C{ @Override public int hashCode() { return 2; } @Override public boolean equals(Object obj) { return true; } } class Student{ private int sn; private String name; private int age; public Student(int sn, String name, int age) { super(); this.sn = sn; this.name = name; this.age = age; } @Override public String toString() { return "Student [sn=" + sn + ", name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + sn; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (sn != other.sn) return false; return true; } } public class Hash { public static void main(String[] args) { // Set setInt = new HashSet(); // setInt.add(new A()); // setInt.add(new A()); // setInt.add(new B()); // setInt.add(new B()); // setInt.add(new C()); // setInt.add(new C()); // System.out.println(setInt); Set<Student> set = new HashSet<Student>(); set.add(new Student(1, "赵一", 17)); set.add(new Student(2, "赵一", 17)); set.add(new Student(1, "张三", 18)); set.add(new Student(1, "张三", 18)); System.out.println(set.size()); System.out.println(set); } }