yan061

导航

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}]

 

posted on 2022-05-19 15:45  yan061  阅读(83)  评论(0编辑  收藏  举报