Java всегда перезаписывает хешкод, когда перезаписан равна
Недавно я узнал базовые знания о Java. Когда я сталкиваюсь с Java, охватывающей равные, у меня всегда есть много вопросов, когда мне приходится перезаписать хэшкод. После непосредственного обсуждения с моими коллегами и запроса информации в Интернете, я разберу ее здесь, чтобы помочь всем понять это, и в коде есть инструкции.
Конкретный код реализации:
пакет cn.xf.cp.ch02.item9; import java.util.hashmap; import java.util.map; Public Class Phonenumber {Private Final Short Code; частный финальный короткий префикс; Частный финальный короткий бегство; public Phonenumber (int reaic -код, префикс int, int lineNumber) {rangeCheck (область, 999, "Код области"); Rangecheck (префикс, 999, "Префикс"); Rangecheck (LeanNember, 9999, "номер строки"); this.areacode = (короткий) код области; this.prefix = (короткий) префикс; это. } private static void rangecheck (int arg, int max, string name) {if (arg <0 || arg> max) бросить новый allodalargumentException (name + ":" + arg); } @Override public boolean equals (Object o) {if (o == this) вернуть true; if (! (o экземпляр phonenumber)) вернуть false; Phonenumber pn = (phonenumber) o; return pn.lineNumber == LineNumber && pn.prefix == Prefix && pn.areAcode == reaircode; } /* @Override // Что используется 31, это рекомендуемое значение. Исследования показали, что это число работает лучше при использовании public int hashcode () {int result = 17; Результат = 31 * Результат + Код области; Результат = 31 * Результат + Префикс; Результат = 31 * Результат + льняное число; результат возврата; } */// Если объект не часто изменяется и имеет высокие накладные расходы, вы должны рассмотреть хеш -кодовый кэш внутри объекта // переменные, измененные с помощью летучих, поток будет считывать наиболее модифицированное значение переменной каждый раз, когда он использует переменную. частный летучий хэшкод int; @Override public int hashcode () {int result = hashcode; if (result == 0) {result = 17; Результат = 31 * Результат + Код области; Результат = 31 * Результат + Префикс; Результат = 31 * Результат + льняное число; hashcode = результат; } return Result; } public static void main (string [] args) {map <phonenumber, string> m = new hashmap <phonenumber, string> (); M.Put (New Phonenumber (707, 867, 5309), "Дженни"); // Дженни не будет возвращена здесь, она вернет нуль, потому что они помещают объекты в различные хеш -ведра System.out.println (M.Get (новый PhonEnumber (707, 867, 5309))); }}Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!