HashSet经典面试题记录
首先有个person类实现了Comparable接口
class Person implements Comparable{ String name; int age; public Person(String name1, int age){ name = name1; this.age = age; } @Override public boolean equals(Object o) { System.out.println("equals-----------------------"); if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && name.equals(person.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Object o) { System.out.println("compare to -------------"); if (o instanceof Person){ Person o1 = (Person) o; return Integer.compare(this.age,o1.age); } throw new RuntimeException("输入类型不符合"); } }
以下是测试的代码
@Test
public void test3(){
HashSet<Object> set = new HashSet<>();
Person p1 = new Person("p1", 11);
Person p2 = new Person("p2", 12);
set.add(p1); //根据hash值寻找在Set中的位置P1
set.add(p2); //根据hash值寻找在Set中的位置P2
p1.age = 13; // P1位置的对象age改为13
set.remove(p1); // 按照 new Person("demo1",13)生成的hash值去set里找数据,位置为P3,注意不是P1,所以不会删除P1
System.out.println(set); // 此时set里依然是两个对象
set.add(new Person("p1",13)); //根据hash值去set里找位置,对应的是P3
set.add(new Person("p1",11)); //根据hash值去set里找位置,发现是P1的位置,此时P1上有一个对象为Person("p1",13),
// 会调用Person里面的equals方法比较这两个对象,发现年龄不一样所以可以加进去,已链表的形式存储
System.out.println(set); // 此时有4个对象
}
输出结果
[Person{name='p1', age=13}, Person{name='p2', age=12}]
equals-----------------------
[Person{name='p1', age=13}, Person{name='p2', age=12}, Person{name='p1', age=11}, Person{name='p1', age=13}]