📜  如何从Java LinkedHashMap 中消除重复的用户定义对象作为键?(1)

📅  最后修改于: 2023-12-03 14:51:46.940000             🧑  作者: Mango

如何从Java LinkedHashMap 中消除重复的用户定义对象作为键?

在Java中,LinkedHashMap是一种Map集合,它以键值对(key-value)的形式存储数据,同时也保留了它们的顺序。当我们需要使用自定义对象作为键的时候,可能会遇到键重复的问题。本篇文章将介绍如何从Java LinkedHashMap中消除重复的用户定义对象作为键。

什么是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中时,会将这个对象替换为原来的对象,从而消除键重复的问题。