Рассмотрим Ther следующий код:Маленький Путаница Над HASHING
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 использует ключ Object для вычисления hashcode?
2) put() и get() вызывает как метод hashcode, так и equals. Следовательно, метод метода put() переопределяет equals() правильно в зависимости от no. объектов в ковше, как видно на выходе для линии 1,4,5,6. Но для метода get() это не одно и то же. Для строки 1 get() не вызывает равно(), строка 2 делала, строка 3,4,5 не вызывала, строка 6 делала. Линия 7 не ПОЧЕМУ?
3) метод equals (Object o) сравнивает пройденный объект i.e Object o со всеми объектами находится в ведре с заданным хэш-кодом. Тогда почему это не прекратило компиляцию, когда она обнаружила одну раннюю. Ex - Скажем в ковше 1928 car1 car4 car5, поэтому, когда car6 вызывает get(), который вызывает equals(), то если car6 сравнивается с car1 и считается равным, то он должен прекратить сравнивать, но вместо этого он сравнивается 3 раза. ЗАЧЕМ?
Почему бы вам не взглянуть в исходный код? – stealthjong
equals вызывается только в том случае, если ссылки не совпадают. то есть он сначала '=='. –
@PeterLawrey, когда get() называется вызовом hashcode, после этого вызывается equals. Поэтому, когда происходит сравнение _ == _. – Nizam