Возможно, это не сценарий реального мира, а просто любопытно узнать, что происходит, ниже - код.Что произойдет, если мы переопределим только hashCode() в классе и используем его в Set?
Я создаю набор объектов класса UsingSet
. Согласно идее хэширования в Java, когда я впервые добавляю объект, который содержит «a», он создаст ведро с hashcode 97 и поместит в него объект. Опять же, когда он встречает объект с «a», он вызовет переопределенный метод hashcode в классе UsingSet, и он получит hashcode 97, и что дальше?
Как я не переопределил метод equals, реализация по умолчанию вернет false. Итак, где будет храниться объект со значением «a», в том же ведре, где хранился предыдущий объект с hashcode 97? или он создаст новое ведро? Кто-нибудь знает, как он будет храниться внутри?
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class UsingSet {
String value;
public UsingSet(String value){
this.value = value;
}
public String toString() {
return value;
}
public int hashCode() {
int hash = value.hashCode();
System.out.println("hashcode called" + hash);
return hash;
}
public static void main(String args[]) {
java.util.Set s = new java.util.HashSet();
s.add(new UsingSet("A"));
s.add(new UsingSet("b"));
s.add(new UsingSet("a"));
s.add(new UsingSet("b"));
s.add(new UsingSet("a"));
s.add(new Integer(1));
s.add(new Integer(1));
System.out.println("s = " + s);
}
}
выход:
hashcode called65
hashcode called98
hashcode called97
hashcode called98
hashcode called97
s = [1, b, b, A, a, a]
Внутренне «HashMap» используется для хранения значений «HashSet». Кроме того, существует метод 'hash()' под 'HashMap', который применяет дополнительную хеш-функцию для защиты от слабых хэш-кодов. – TheLostMind
Должно быть такое же ведро, вы можете проверить отладчик. –