Вопрос по java – Хэш-код возвращает адрес памяти? [Дубликат]

2

Possible Duplicate:
what is an objects hashcode
How do hashCode() and identityHashCode() work at the back end?

Я не говорю о классе String или любом другом классе, где хэш-код переопределен. Скажи, если я просто создаю новый объектObject класс, тогда будетhashcode() или быть правдой в любом случае,identityHashCode(Object x) вернуть адрес памяти этого объекта?

Иногда глупость является намеренной. Hot Licks
вот ссылка наhow: stackoverflow.com/questions/4930781/… bestsss
Я почти уверен, что в OpenJDK это не так, иначе мы бы увидели гораздо больше паттернов вidentityHashCode() последовательно созданных объектов. (Попробуйте, создайте 100 объектов, напечатайте их хеш-код и попытайтесь найти шаблон). Joachim Sauer
@ Хотлик, кто-то действительно должен исправить бессмысленный документ, он просто вводит в заблуждение. bestsss
Последнее, что я посмотрел, реализация по умолчанию, если конкретный класс не переопределил ее, заключалась в том, чтобы возвращать целое число, полученное из адреса объекта во время первого запроса хеш-кода. Конечно, для копирующего GC адрес может измениться, поэтому реализация (если она использует адрес) должна быть осторожна, чтобы кэшировать сначала созданный хеш-код и всегда возвращать его, а не выводить его заново. Здесь нетrequirement что хеш-код имеет какое-либо отношение к адресу, и для некоторых объектов (например, строк) он определенно НЕ будет основан на адресе, поскольку одинаковые объекты должны иметь одинаковые хеши. Hot Licks

Ваш Ответ

4   ответа
7

Не обязательно. Отдокументация (выделение мое):

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

Поэтому, как говорит документ, «не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен приводить к разным целочисленным результатам»; НЕ верно, если метод хэш-кода не был переопределен, верно? samsamara
Интересно отметить, чтоhashcode Будучи int, очень возможно, что адресное пространство на компьютере может быть больше, чем число доступных int, и что преобразование внутреннего адреса в int не обязательно является биекцией.
@ user601L, на самом деле это не было(jnit) (void*) address так долго долго, фактическое вкл. сохраняет одноразовый случайный случай в заголовке объекта.
& quot; Это обычно .. & quot; значит, есть ли другие способы его реализации? samsamara
@assylias, не обязательно биекция ... но в любом случае это не имеет значения.
1

Вы всегда можете проверить, посмотрев на источник, который поставляется с вашим JDK.

мойjava.lang.Object шоуhashCode как родной метод. Вот явадаки.

/**
 * Returns a hash code value for the object. This method is 
 * supported for the benefit of hashtables such as those provided by 
 * <code>java.util.Hashtable</code>. 
 * <p>
 * The general contract of <code>hashCode</code> is: 
 * <ul>
 * <li>Whenever it is invoked on the same object more than once during 
 *     an execution of a Java application, the <tt>hashCode</tt> method 
 *     must consistently return the same integer, provided no information 
 *     used in <tt>equals</tt> comparisons on the object is modified.
 *     This integer need not remain consistent from one execution of an
 *     application to another execution of the same application. 
 * <li>If two objects are equal according to the <tt>equals(Object)</tt>
 *     method, then calling the <code>hashCode</code> method on each of 
 *     the two objects must produce the same integer result. 
 * <li>It is <em>not</em> required that if two objects are unequal 
 *     according to the {@link java.lang.Object#equals(java.lang.Object)} 
 *     method, then calling the <tt>hashCode</tt> method on each of the 
 *     two objects must produce distinct integer results.  However, the 
 *     programmer should be aware that producing distinct integer results 
 *     for unequal objects may improve the performance of hashtables.
 * </ul>
 * <p>
 * As much as is reasonably practical, the hashCode method defined by 
 * class <tt>Object</tt> does return distinct integers for distinct 
 * objects. (This is typically implemented by converting the internal 
 * address of the object into an integer, but this implementation 
 * technique is not required by the 
 * Java<font size="-2"><sup>TM</sup></font> programming language.)
 *
 * @return  a hash code value for this object.
 * @see     java.lang.Object#equals(java.lang.Object)
 * @see     java.util.Hashtable
 */
public native int hashCode();
Не могу себе представить, почему это было отклонено три года спустя. Важно знать, как смотреть на исходный код Java. Как вы думаете, откуда пришли Javadocs?
импл. нативного находится в thread.cpp и synchronizer.cpp :: get_next_hash,hg.printk.org/openjdk6-mips/file/tip/hotspot/src/share/vm/…   линия: 270
1

Нет, функция HashCode () возвращает целое число. Если вы не определили функцию HashCode () для своего объекта, Java МОЖЕТ преобразовать адрес памяти объекта в целое число и вернуть его.

0

Какдокументация в состояниях Object.hashCode (),

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

Таким образом, язык Java не требует, чтобы хеш-код класса Object возвращал адрес памяти объекта, и поэтому вам не следует полагаться на это.

Похожие вопросы