Navy1228 2024-06-25 16:34 采纳率: 43.3%
浏览 6

请问以对象作为HashMap的key时,怎么重写hashCode()方法

如题

我的疑问是:
· 如果全让对象返回同一个哈希值的话,对象都会存储在一条链表上,只会占据数组中的一个位置
· 如果让对象的某些属性,比如Person的name和age作为哈希值的生成依据,那和后面的equals()判定条件不是重合了吗

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-25 16:34
    关注

    引自免费微信小程序:皆我百晓生

    要解决这个问题,我们首先需要了解HashMap的内部工作原理。HashMap是一种基于哈希表的数据结构,它将键(在这个例子中是对象)映射到值(在这个例子中是int)。当添加新元素时,HashMap会自动调整哈希函数,确保每个键对应唯一的位置。

    如果你想要改变HashMap的行为,并且让你的对象成为其键,你需要重新实现hashCode()equals()方法。但是,这些方法通常用于比较两个对象是否相等,而不是用来确定它们是否应该放入相同的哈希表位置。这可能是因为hashCode()仅仅是一个整数,而equals()则会检查多个字段是否相同。

    如果你想要根据对象的某个属性(例如名字和年龄)进行哈希,那么你需要创建一个新的哈希表来保存这些信息,而不是修改现有Map的哈希行为。然后,你可以按照特定的规则(如字典顺序、升序等)对这些信息进行排序,然后再将其与现有的对象列表关联起来。

    这里有一个简单的示例,展示了如何根据名字和年龄对对象列表进行排序:

    import java.util.*;
    
    class Person {
        String name;
        int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null || getClass() != obj.getClass()) return false;
            Person person = (Person) obj;
            return Objects.equals(name, person.name) && age == person.age;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            // 创建一些人
            List<Person> people = new ArrayList<>();
            people.add(new Person("Alice", 30));
            people.add(new Person("Bob", 25));
            people.add(new Person("Charlie", 40));
    
            // 对这些人按名字排序
            Collections.sort(people);
    
            // 打印排序后的结果
            for (Person person : people) {
                System.out.println(person.getName());
            }
        }
    }
    

    在这个示例中,我们创建了一个Person类,其中包含名字和年龄。我们在Person类的equals()hashCode()方法中实现了适当的比较逻辑。然后,在main方法中,我们创建了一个List对象并对其进行了排序,这样就可以得到按名字排序的结果。

    这种方法不会影响现有Map的行为,因为它只改变了对象的存储方式,而不是更改了HashMap的底层实现。然而,这种方式可能会导致性能问题,因为每次查找操作都需要遍历整个对象列表,而不是通过哈希表查找。为了提高效率,可以考虑使用更高效的集合数据结构,如TreeSet

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月25日