set集合判断元素的唯一性要重写hashcode和equals方法,这样就能保证不会加入重复的元素,
但是在以下这种情况下任然可以加入重复元素,即使他们的hashcode和equals方法结果相同
public static void main(String[] args) { Set<Person> set = new HashSet<Person>(); Person p1 = new Person("p1",123); Person p2 = new Person("p2",123); Person p3 = new Person("p3",123); set.add(p1); set.add(p2); set.add(p3); Iterator<Person> it= set.iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getName()+":"+p.getAge()); } p3.setAge(20); set.remove(p3); set.add(p3); System.out.println("---------------------"); it= set.iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getName()+":"+p.getAge()+":"+p.hashCode()); } }
class Person{ private String name; private int age; public Person(){ } public Person(String name, int age) { this.name = name; this.age = age; } /** * 返回 * @return */ public String getName() { return name; } /** * 设置 * @param */ public void setName(String name) { this.name = name; } /** * 返回 * @return */ public int getAge() { return age; } /** * 设置 * @param */ public void setAge(int age) { this.age = age; } @Override public int hashCode() { return this.age; } @Override public boolean equals(Object obj) { if(obj instanceof Person){ Person p = (Person) obj; return p.getName().equals(this.getName()); } return false; } }
在修改set中元素属性值(hashcode值)在去删除这个元素时就删除不掉 因为它会根据修改之后的hashcode值去查找次对象,显然查找不到 删除失败,
在重新添加 此对象时 任然可以加入,虽然他们的hashcode和equals相同 但是他们存储在不同的位置
时间: 2024-10-20 22:07:42