2016-08-07 1 views
0

В приведенном ниже коде у меня есть два строковых объекта, которые являются разными объектами, но я получаю аналогичный хэш-код. как это возможно.Как два объекта java HashCode могут быть похожими

общественного класс ObjectHashCode {

public static void main(String...mj){ 

      String str1 = new String("Aa"); 
      String str2 = new String("BB"); 

      System.out.println(str1.hashCode());//2112 
      System.out.println(str2.hashCode());//2112 
     } 

}

+0

Существует 2^32 возможных уникальных хеш-кода. Есть еще много возможных строк. Следовательно, разные строки могут иметь один и тот же хэш-код. – Eran

+0

Это то, что они называют «хэш-столкновениями», и это одна из причин, почему у Hash *** есть ведра или какая-то суперсложная логика переключения. Либо для хеш-значений-коллизий, либо хеш-значение-модуло-столкновений. – JayC667

ответ

2

Вы должны всегда читать документацию по основному контракту между входом метода и методой выводом. В этом случае документация состояния (опуская ненужные пункты):

Он не требуется, если два объекта равны в соответствии с {@link java.lang.Object # равна (java.lang.Object)} , а затем вызов метода {@code hashCode} на каждом из двух объектов должен производить различные целые результаты. Тем не менее, программист должен знать, что получение отдельных целых результатов для неравных объектов может улучшить производительность хеш-таблиц.

Что касается того, почему значения одинаковы, хорошая вещь о Java - вы всегда можете взглянуть на источник. Так вычисляется hashCode для примера String.

public int hashCode() { 
    int h = hash; 
    if (h == 0 && value.length > 0) { 
     char val[] = value; 

     for (int i = 0; i < value.length; i++) { 
      h = 31 * h + val[i]; 
     } 
     hash = h; 
    } 
    return h; 
} 

Теперь ваши значения строковых пример:

"Aa" = 31 * (31 * 0 + 65) + 97 = 2112 
"BB" = 31 * (31 * 0 + 66) + 66 = 2112 

Примечание: числовое значение для 'A' = 65, 'B' = 66, 'a' = 97.

+0

Спасибо, AlmasB за ваш ответ. –

Смежные вопросы