📅  最后修改于: 2023-12-03 14:51:46.940000             🧑  作者: Mango
在Java中,LinkedHashMap是一种Map集合,它以键值对(key-value)的形式存储数据,同时也保留了它们的顺序。当我们需要使用自定义对象作为键的时候,可能会遇到键重复的问题。本篇文章将介绍如何从Java LinkedHashMap中消除重复的用户定义对象作为键。
LinkedHashMap类是实现了Map接口的哈希表和双向链表。它可以在查找某个元素的同时迭代整个Map。维护的顺序可以是插入顺序或者是访问顺序。当元素被访问时,访问顺序会被改变,被访问的元素会被移动到链表的末尾。
在Java中,只有同一个对象才被认为是相等的。因此,我们需要让我们的自定义对象实现equals()和hashCode()方法,以确保它们的唯一性。如下代码所示,我们定义了一个User类,并重写了equals()和hashCode()方法:
public class User {
private int id;
private String name;
// 构造函数
// getter,setter方法
// 重写equals()方法
@Override
public boolean equals(Object obj) {
if (obj instanceof User) {
User other = (User) obj;
return this.id == other.id && this.name.equals(other.name);
}
return false;
}
// 重写hashCode()方法
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
重写的equals()方法中,我们比较了两个User对象的id和name属性是否相等。如果相等,就认为这两个对象相等。重写的hashCode()方法中,我们使用Objects类中的hash()方法,计算了id和name属性的哈希值。
在使用LinkedHashMap时,我们只需要将User对象作为键存入map中即可。当我们需要将新的User对象作为键存入map中时,会先调用已经存入map中的User对象的equals()方法,判断两个User对象是否相等。如果相等,就会将新的User对象替换为原来的对象,这样就解决了键重复的问题。
LinkedHashMap<User, String> userMap = new LinkedHashMap<>();
User user1 = new User(1, "Tom");
User user2 = new User(2, "Jerry");
User user3 = new User(1, "Tom");
userMap.put(user1, "user1");
userMap.put(user2, "user2");
userMap.put(user3, "user3");
System.out.println(userMap.size()); // 输出2,因为user1和user3被认为是同一个对象
在使用Java LinkedHashMap时,如果需要使用自定义对象作为键,需要重写equals()和hashCode()方法,以确保它们的唯一性。只有在两个自定义对象的equals()方法返回true时,它们才被认为是同一个对象。如果两个自定义对象相等,当新的对象作为键存入LinkedHashMap中时,会将这个对象替换为原来的对象,从而消除键重复的问题。