2012-05-07 6 views
3

Я немного смущен, так как этот вопрос задан в интервью, и я сказал это: «hashCode генерируется для каждого объекта как и когда он создается в куче в текущем запуске Приложение «»hashcode генерируется при вызове метода hashcode()

но интервью сказал: «он генерируется, когда мы называем метод Hashcode на объекте»

более того, я ищу, чтобы понять хэш-код (и это тоже WRT на Java) в большей глубине , пожалуйста, поделитесь некоторыми ссылками/источниками, поскольку его часто задают в некоторых интервью для собеседования.

PS: когда я делаю sysout ... на объекте вывод com es as employee @ 942f533

ответ

0

hashcode() - это метод, как любой другой метод. Он не будет вызываться при создании объекта, его можно вызвать, когда вы кладете объект на карту.

Я думаю, что первая документация для чтения должно быть: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

+0

спасибо за ответ ... я понимаю, что хэш-код() не будет вызываться при создании объекта, но мой вопрос бит различен. Идентификатор hascode (значение) вычисляется при создании нового объекта в куче –

4

Это зависит от того, что вы имеете в виду здесь. Как упоминалось в других ответах, сама функция не вызывается при ее создании. Тем не менее,

90  * As much as is reasonably practical, the hashCode method defined by 
    91  * class {@code Object} does return distinct integers for distinct 
    92  * objects. (This is typically implemented by converting the internal 
    93  * address of the object into an integer, but this implementation 
    94  * technique is not required by the ... [JDK] 

из http://www.docjar.com/html/api/java/lang/Object.java.html

Поскольку адрес объекта назначается, когда он создан, вы правы в некотором смысле. Однако, поскольку это не требуется, и многие объекты определяют переопределение, это не обязательно верно для всех объектов.

Обычно в интервью вы должны оспорить интервьюера немного, чтобы описать, что вы имеете в виду. Если вы это сделаете, и вы правы, проблема решена, если вы это сделаете, и вы ошибаетесь, то вы, по крайней мере, показали, что имеете более глубокое понимание, чем то, что показало ваше первоначальное состояние.

+0

+1: В случае String хэш-код кэшируется, поэтому он генерируется только один раз для каждого объекта (и повторно используется), если hashCode 0;) –

0

На самом деле вам нужно понять использование хеш-кода для понимания.

Hashcode не создается при создании объекта, а когда вызывается hashCode().

Для каждого объекта вы можете не захотеть переопределить хэш-код java.lang.Object по умолчанию. Это действительно требуется для всех классов, которые используют алгоритм хеширования внутри. например HashMap, HashSet и т.д. Если вы идете и проверить внутреннюю реализацию этих метода вы нашли бы использование хэш-кода и т.д.

Фрагмент кода из java.util.HashMap:

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

Как вы можете видеть он используется для получения правильного объекта из структуры данных.

Если вы проверяете комментарий хэш-кода объекта также ясно говорит об этом

* 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>. 
Смежные вопросы