今天去面试,面试官问我 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));
}
}
运行结果如下
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;
}
}
}
再次运行结果就满足要求了