今天去面试,面试官问我 Map 的 Key 可以存哪些值,我想都没想直接答字符串,面试官又接着问我,Key 可以是对象吗?我想了一个说不行,因为平时用到 Map 一直都是用字符串做键值,还真没遇到存对象的,让我长见识了。

回来后决定自己写个 Demo 试试看

先创建一个最简单的对象吧,比如 User

import java.util.HashMap;
import java.util.Map;

public class User {
    private String name;

    public User() {
        super();
    }

    public User(String name) {
        this.name = name;
    }
}

然后创建一个测试类用这个对象做键值测试一下

public class Test {
    public static void main(String[] args) {
        User user1 = new User("Jack");
        User user2 = new User("Rose");
        User user3 = new User("Jack")
        Map<User, String> map = new HashMap<>();
        map.put(user1, "Jack");
        map.put(user2, "Rose");
        map.put(user3, "Jack2")
        System.out.println(map.get(user1));
        System.out.println(map.get(user2));
        System.out.println(map.get(user3));
    }
}

运行结果如下

Result1

Map 确实是可以用对象做键值的,转念一想也对,比较 String 它也是对象啊

另外我创建了两个名为 Jack 的 User 对象,按照 Map 的唯一性来说,第二个 Jack 会覆盖第一个,所以输出里应该只有 Jack2,这是因为 Map 是按照键值是否为同一个对象来保证唯一性的,如果想要实现根据对象内容作为唯一性判断标准,需要重写 hashCode()equals()方法

public class User {
    private String name;

    public User() {
        super();
    }

    public User(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof User) {
            return name.equals(((User) obj).name);
        } else {
            return false;
        }
    }
}

再次运行结果就满足要求了

Result2

最后修改:2020 年 09 月 21 日 10 : 36 AM