代码示例:
Person类:
public class Person { private String name; private Integer age; public Person() { } public Person(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(name, person.name) && Objects.equals(age, person.age); } // private static int init = 1000; //不能这样用 @Override public int hashCode() { //return age.hashCode() + name.hashCode;没下述的健壮性好。 return Objects.hash(name, age); //能保证两个的哈希值的不同 // return 1; //不能这样用 // return init++; //不能这样用 } }
Test类:
/** * Collection接口 * |-------List接口 * |--------ArrayList(主要的实现类) * |--------LinkedList(对于频繁的插入、删除操作) * |--------Vector(古老的实现类、线程安全的,但效率低于ArrayList) * |-------Set接口:存储无序、不可重复的元素.Set中常用的方法都是Collection下定义的。 * |--------HashSet(主要的实现类) * |--------LinkedHashSet * |--------TreeSet * */ public class TestSet { /* * Set:存储的元素是无序的,不可重复的! * 1.无序性:无序性 != 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。 * 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去. * * 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。进而保证Set元素的不可重复性! * * Set中的元素是如何存储的呢?使用哈希算法。 * 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值 * 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置 * 已经有对象存储,再通过equals()方法比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 * 万一返回false呢,都存储。(不建议如此) * >要求:hashCode()方法要与equals()方法一致。 * * */ @Test public void test1(){ Set set = new HashSet(); set.add(123); set.add(456); set.add("AA"); set.add("AA"); set.add("BB"); set.add(null); Person p1 = new Person("GG",23); // Person p2 = new Person("GG",23); Person p2 = new Person(null,23); System.out.println(p1.equals(p2)); System.out.println(p1.hashCode()); System.out.println(p2.hashCode()); set.add(p1); set.add(p2); System.out.println(set.size()); System.out.println(set); //无序 != 随机 } }
结果:
false
71416
77366
7
[AA, BB, null, Person{name='MM', age=21}, 456, Person{name='GG', age=23}, 123]