今天去面试,面试官问我 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 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][1] 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][2] [1]: https://www.simaek.com/usr/uploads/2020/06/1669146055.png [2]: https://www.simaek.com/usr/uploads/2020/06/1478774906.png Loading... 今天去面试,面试官问我 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][1] 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][2] [1]: https://www.simaek.com/usr/uploads/2020/06/1669146055.png [2]: https://www.simaek.com/usr/uploads/2020/06/1478774906.png 最后修改:2023 年 08 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏