Java 如果所有键';s的哈希代码是相同的

Java 如果所有键';s的哈希代码是相同的,java,hashmap,Java,Hashmap,如果这个问题不清楚,很抱歉。我对hashmap的了解非常有限。这就是面试中问我的问题 如果所有对象返回相同的hascode,并且我们使用这些对象作为键存储在hashmap中。在这种情况下,排序是如何工作的 我的理解是,如果hashcode相同,那么新条目将替换hashmap中的旧条目 但是,当我试图进一步了解hashmap在两个对象hashcode相同时的工作原理时,我发现这两个对象都将以链表形式存储在bucket中 但目前尚不清楚在这种情况下,排序将如何工作。如果我们尝试使用TreeMap对h

如果这个问题不清楚,很抱歉。我对hashmap的了解非常有限。这就是面试中问我的问题

如果所有对象返回相同的hascode,并且我们使用这些对象作为键存储在hashmap中。在这种情况下,排序是如何工作的

我的理解是,如果hashcode相同,那么新条目将替换hashmap中的旧条目

但是,当我试图进一步了解hashmap在两个对象hashcode相同时的工作原理时,我发现这两个对象都将以链表形式存储在bucket中

但目前尚不清楚在这种情况下,排序将如何工作。如果我们尝试使用TreeMap对hashpMap进行排序

请帮助我理解这一点

下面的代码在hashmap中存储多个条目,其中所有对象hashcode都相同

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Employee implements Comparable
{
   private String name;
   private int age;

   public Employee(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   @Override
   public String toString()
   {
      return name + ": " + age;
   }

   @Override
   public int hashCode(){
       return 1;       
   }

   @Override
   public boolean equals(Object o){
       if (!(o instanceof Employee))
             return false;
          Employee e = (Employee) o;
          return e.getName().equals(name) && e.getAge() == age;

   }

   String getName()
   {
      return name;
   }

   int getAge()
   {
      return age;
   }

   public static void main(String a[]){
       Employee e = new Employee("Sub" , 25);
       Employee e1 = new Employee("Sub1" , 20);
       Employee e2 = new Employee("Sub2" , 22);
       System.out.println(e);

       Map m = new HashMap();
       m.put(e , "A");
       m.put(e1 , "B");
       m.put(e2 , "C");

       System.out.println(m);

       TreeMap t = new TreeMap(m);

       System.out.println(t);

   }

@Override
public int compareTo(Object arg0) {
    return ((Employee)arg0).getName().compareTo(this.name);
}
}

对象根据从其hashcode函数获得的散列值分布在存储空间上。如果所有对象都返回相同的hashcode,则添加到HashMap的每个对象都会发生冲突。此外,您还将对从Hashmap获得的每个对象进行顺序搜索(使用equals方法)


简而言之:更改hashcode算法以减少冲突。

如果您需要添加相同的键,但值不同,我建议您使用或的多重映射。我发现它更有用,因为您可以使用ListMultimap(),如果您添加相同的键,那么值将添加到列表中。我知道这不是问题所在,但我想你问这个问题是因为你有一些问题。

hashmap不是按排序顺序存储元素的。 为了存储它,首先在hashcode的帮助下寻找合适的bucket


如果hashcode相同,它将以链接列表格式存储元素,并且仅使用单个bucket。

排序
HashMap
不进行任何排序。是的,HashMap没有排序。从:
这个类不保证映射的顺序
您需要更清楚您的意思,否则您的问题可能会被关闭。我可以在hashmap中存储多个条目,其中所有对象都返回相同的hashcode。请参考我的最新问题。