已知: Person类按照 id 和 name 重写了 hashCode 和 equals 方法,问下面代码输出什么?
HashSet set = new HashSet(0);
Person p1 = new Person(1001,"AA");Person p2 = new Person(1002,"BB");
set.add(p1);
set.add(p2);
p1.name = "CC";set.remove(p1);
System.out.println(set);
set.add(new Person(1001,"CC"));System.out.println(set);
set.add(new Person(1001,"AA"));System.out.println(set);public class Homework05 { public static void main(String[] args) { HashSet set = new HashSet(0); Person p1 = new Person(1001,"AA"); Person p2 = new Person(1002,"BB"); set.add(p1); //ok set.add(p2); //ok p1.name = "CC"; set.remove(p1); System.out.println(set); set.add(new Person(1001,"CC")); System.out.println(set); set.add(new Person(1001,"AA")); System.out.println(set); } } class Person{ public int id; public String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return id == person.id && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(id, name); } }
输出:
[Person{id=1001, name='CC'}, Person{id=1002, name='BB'}]
[Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1002, name='BB'}]
[Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}, Person{id=1002, name='BB'}]
Vector 和 ArrayList 的比较
代码示例展示了当Person类基于id和name重写equals和hashCode方法时,HashSet的行为。首先添加两个Person对象到集合中,然后修改一个对象的name属性,尝试移除该对象但失败,因为根据新的name属性已经找不到它。接着添加一个新的Person对象,虽然有相同的id和新的name,导致集合中有两个相同hashCode的对象。最后,尝试再次添加一个具有原始name的新对象,结果是集合中包含三个对象。

4520

被折叠的 条评论
为什么被折叠?



