Массив Java реализация HashCode

Я также работал с типом Solr BBoxField (и JTS). См. Определение типа поля:

<fieldType name="my_bbox"
  class="solr.BBoxField"
  spatialContextFactory="JTS"
  format="WKT"                                                                      
  geo="true"
  distanceUnits="kilometers"
  numberType="pdouble"
  />

Мне все еще неясно, почему использование SpatialRecursivePrefixTreeFieldType с Geo3D не дает правильных результатов.

Скорость импорта данных значительно выше, чем при использовании SpatialRecursivePrefixTreeFieldType с JTS.

49
задан souLTower 13 April 2009 в 06:41
поделиться

3 ответа

Метод java.lang.Array hashCode наследуется от объекта , что означает, что хеш-код зависит от ссылки. Чтобы получить хеш-код на основе содержимого массива, используйте Arrays.hashCode .

Остерегайтесь, хотя это поверхностная реализация хеш-кода. Также присутствует глубокая реализация Arrays.deepHashCode .

89
ответ дан Tom Cammann 7 November 2019 в 11:39
поделиться

Массивы используют хэш-код по умолчанию, основанный на расположении памяти (но это не обязательно ячейка памяти, так как это только int и все адреса памяти не подходят). Вы можете увидеть это, также распечатав результат System.identityHashCode (foo) .

Массивы только равны , если они одинаковы, идентичны массиву. Таким образом, хеш-коды массива будут равны, как правило, если они совпадают, идентичный массив.

4
ответ дан erickson 7 November 2019 в 11:39
поделиться

Реализация по умолчанию для Object.hashCode () действительно должна возвращать значение указателя объекта, хотя это реализация зависимый. Например, 64-битная JVM может взять указатель и XOR, а также старшие и младшие слова вместе. Подклассам рекомендуется переопределять это поведение, если оно имеет смысл.

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

Обратите внимание, что java.util.Arrays предоставляет реализацию deepHashCode () для хэширования на основе содержимого массива, а не идентичности самого массива,

1
ответ дан James 7 November 2019 в 11:39
поделиться
Другие вопросы по тегам:

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