hashset注意事项

    科技2022-07-20  98

    关于remove()方法:

    1、调用自己写的类,重写了equals和hashCode()方法,修改/之前添加到set中的对象的信息,然后进行删除,发现没有删除成功。

    person.java

    package com.cad.SetCase.case2; public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.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; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

    TestSet.java

    package com.cad.SetCase.case2; import org.junit.Test; import java.util.HashSet; public class TestSet { @Test public void test1(){ HashSet set = new HashSet(); Person p1 = new Person("Tom",23); Person p2 = new Person("John",21); set.add(p1); set.add(p2); System.out.println(set); p2.name = "CC"; set.remove(p2); // 如果重写了hashCode和equals。会进行判断hashCode和equals。从来发现修改后的hash值和删除的 // hash值不同,就不能删除。 System.out.println(set); } }

    2、当没有重写equals()和hashCode()是,通过原先的原先的hashCode的位置删除,可以进行删除修改信息后的对象。

    Person.java

    package com.cad.SetCase.case2; public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.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; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } }

    Processed: 0.010, SQL: 8