HashSet集合中,添加元素的方法在执行添加的时候会判断元素是否已经存在
HashSet判断元素唯一性的规则:
- 把对象加入到HashSet 的时候,会先使用对象的HashCode方法来生成一个哈希值,来判断对象加入的位置
- 如果比较的位置没有其他对象存在,则判断元素不同,可以加入新的对象
- 如果比较的位置有其他对象存在,接着比较HashCode值和equals比较结果
返回true则相同,不能存入新的对象,如果是false则不同,添加新的对象
/*** 需求:* 我们要求比较两个对象的属性和内容是否相同,而非比较对象的地址值* 此时我们可以重写Person*/package Test18_Demo.Demo09;/*@create 2020--12--08--15:07*/import java.util.HashSet;public class HashSetAddDemo {public static void main(String[] args) {HashSet<Person> hashSet = new HashSet<>();//创建对象Person person1 = new Person("张三丰", 120);Person person2 = new Person("郭襄", 100);Person person3 = new Person("杨过", 100);//添加到集合中hashSet.add(person1);hashSet.add(person2);hashSet.add(person3);//System.out.println(hashSet);//再次调用add方法添加新的元素 - 可以添加hashSet.add(new Person("郭襄", 100));System.out.println(hashSet);}}
package Test18_Demo.Demo09;/*@create 2020--12--08--14:23*/import java.util.Objects;public class Person {private String name;private int age;private Object o;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o1) {if (this == o1) return true;if (o1 == null || getClass() != o1.getClass()) return false;Person person = (Person) o1;return age == person.age &&Objects.equals(name, person.name) &&Objects.equals(o, person.o);}@Overridepublic int hashCode() {return Objects.hash(name, age, o);}}
