关于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;
}
}