gpt4 book ai didi

java - 关于哈希的困惑很少

转载 作者:行者123 更新时间:2023-12-01 12:33:23 25 4
gpt4 key购买 nike

考虑以下代码:

public class CarEqualsTestAgain {

String model;

public CarEqualsTestAgain(String x) {
this.model=x;
}

@Override
public int hashCode(){ //bad hashcode
System.out.println("__hash__");
return 1;
}

@Override
public boolean equals(Object o){
System.out.println("In equals");
if((o instanceof CarEqualsTestAgain) && ((CarEqualsTestAgain)o).model==this.model){
return true;
}
else
return false;
}

public static void main(String[] args) {

Map map=new HashMap();

CarEqualsTestAgain car1=new CarEqualsTestAgain("8");
map.put(car1, "Red");
System.out.println("Key1 : "+map.get(car1)); //Line 1

CarEqualsTestAgain car2=new CarEqualsTestAgain("8");
System.out.println("Key2 : "+map.get(car2)); //Line 2

CarEqualsTestAgain car3=car1;
System.out.println("Key3 : "+map.get(car3)); //Line 3

CarEqualsTestAgain car4=new CarEqualsTestAgain("9");
map.put(car4, "Red");
System.out.println("Key4 : "+map.get(car4)); //Line 4

CarEqualsTestAgain car5=new CarEqualsTestAgain("10");
map.put(car5, "Red");
System.out.println("Key5 : "+map.get(car5)); //Line 5

CarEqualsTestAgain car6=new CarEqualsTestAgain("8");
map.put(car6, "Green");
System.out.println("Key6 : "+map.get(car6)); //Line 6

key=(String)map.get(car1);
System.out.println("Key1 : "+key); //Line 7

}

}

将输出打印为:

__hash__
__hash__
Key1 : Red

__hash__
In equals
Key2 : Red

__hash__
Key3 : Red

__hash__
In equals
__hash__
Key4 : Red

__hash__
In equals
In equals
__hash__
Key5 : Red

__hash__
In equals
In equals
In equals
__hash__
In equals
In equals
In equals
Key6 : Red

__hash__
In equals
In equals
Key1 : Green

我的问题是:

1) 当创建每个对象时,JVM 计算其哈希码并将其放入存储桶中,或者当调用 Hashmap put() 方法时,只有 JVM 使用键对象来计算哈希码?

2) put() 和 get() 都会调用 hashcode 和 equals 方法。因此 put() 方法根据编号正确调用重写的 equals() 。存储桶中对象的数量,如第 1、4、5、6 行的输出所示。但对于 get() 方法来说就不一样了。第 1 行 get() 没有调用 equal(),第 2 行调用了 equal(),第 3,4,5 行没有调用,第 6 行调用了 equal()。 7号线没有为什么?

3) equals(Object o) 方法将传递的对象(即 Object o)与具有给定哈希码的存储桶中的所有对象进行比较。那为什么一早就发现了,还不停止commarring呢。例如 - 假设存储桶 1928 car1 car4 car5 驻留,因此当 car6 调用 get() 并调用 equals() 时,如果 car6 与 car1 比较并发现相等,则它应该停止比较,但它会比较 3 次。为什么?

最佳答案

When each Object is created JVM calculate its hashcode and put it in bucket or When Hashmap put() method is called then only JVM uses key Object to calculate hashcode ?

它仅在需要时调用 hashCode() - 在本例中,当您调用 put()get() 时。

For Line 1 get() doesn't call equal(), Line 2 did, Line 3,4,5 didn't call, Line 6 did. Line 7 didn't WHY?

您对自己的诊断感到困惑。此调用:

System.out.println("Key1 : "+map.get(car1)); 

相当于:

Object tmp = map.get(car1);
System.out.println("Key1 : " + tmp);

因此,对 equals 的调用发生在打印 Key1 之前。为了更容易理解,您应该将诊断更改为:

System.out.println("Test 1");
CarEqualsTestAgain car1 = new CarEqualsTestAgain("8");
System.out.println("Created car");
map.put(car1, "Red");
System.out.println("Added car to map");
Object tmp = map.get(car1);
System.out.println("Result of get: " + tmp);

这样,什么时候发生的事情就更清楚了。一般来说,put()get() 都需要:

  • 在您要添加/提取的 key 上调用 hashCode()
  • 如果该哈希码与映射中的现有哈希码匹配,则为每个匹配调用 equals(),直到耗尽匹配项或找到相等的对象

3) equals(Object o) method compares the passed object i.e Object o with all Objects resides in bucket with given hashcode. Then why did it doesn't stop comapring when it found one early. Ex - Say in bucket 1928 car1 car4 car5 resides, so when car6 calls get() which calls equals() then if car6 compares with car1 and found to be equal then it should stop comparing, but instead it compares 3 times. WHY?

您假设它首先与 car1 进行比较。 HashMap 实际上是无序的 - 无法保证将比较具有相同哈希代码的候选顺序。不过,当它找到匹配项时,它会停止。如果您将哈希码更改为更合理,则很可能只需要检查一项。

关于java - 关于哈希的困惑很少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com