Я развиваюсь на Java с Netbeans уже некоторое время, и есть некоторые вещи, на которые я просто полагаюсь, работая, не подвергая сомнению, как это сделать. Среди них - автоматически генерируемые методы hashCode() и equals().
Метод equals просто следовать, но я нахожу метод hashCode несколько загадочным. Я не понимаю, почему он выбирает множители и применяет операции, которые он выполняет.
import java.util.Arrays;
import java.util.Objects;
public class Foo {
int id;
String bar;
byte[] things;
@Override
public int hashCode() {
int hash = 7;
hash = 89 * hash + this.id;
hash = 89 * hash + Objects.hashCode(this.bar);
hash = 89 * hash + Arrays.hashCode(this.things);
return hash;
}
}
Поиск документации, этого сайта и Google для таких вещей, как "netbeans generate hashcode", не отображал ничего, что казалось актуальным. Кто-нибудь знает, что такое стратегия поколения и почему Netbeans использует его?
Edit:
Спасибо за ответы до сих пор! Особенно из-за этого ответа на связанном вопросе SO, я понимаю логику использования простых чисел при разработке метода hashCode намного более полно. Тем не менее, другим аспектом моего вопроса, который до сих пор никто не обращал до конца, является то, как и почему Netbeans выбирает простые числа, которые он делает для своих сгенерированных методов. Поле hash
и другой множитель (89
в моем примере) кажутся разными в зависимости от различных факторов класса.
Например, если я добавлю второй класс String
в класс, hashCode() станет
public int hashCode() {
int hash = 7;
hash = 13 * hash + this.id;
hash = 13 * hash + Objects.hashCode(this.bar);
hash = 13 * hash + Objects.hashCode(this.baz);
hash = 13 * hash + Arrays.hashCode(this.things);
return hash;
}
Итак, почему Netbeans выбирает эти конкретные простые числа, в отличие от других?