Поведение map.containsKey () - что такое сравнение [duplicate]

Вы посмотрели пакет datetime? Я считаю, что у него есть метод fromUnixTimestamp.

2
задан Kekzpanda 31 July 2015 в 21:58
поделиться

1 ответ

Вы можете посмотреть на этот вопрос с совершенно другим подходом. Предполагается, что карта имеет неизменяемые ключи (по крайней мере, для hashcode и equals), потому что реализация карты зависит от этого. GString является изменчивым, поэтому он не подходит для карт в целом. Существует также проблема вызова String # equals (GString). GString - класс Groovy, поэтому мы можем влиять на метод equals равным String просто отлично. Но String очень отличается. Это означает, что вызов equals на String с GString всегда будет ложным в мире Java, даже если hashcode () будет вести себя одинаково для String и GString. А теперь представьте карту со строковыми ключами, и вы зададите карту для значения с помощью GString. Он всегда возвращает null. С другой стороны, карта с ключами GString, запрошенными с помощью String, может вернуть «правильное» значение. Это означает, что всегда будет отключение.

И из-за этой проблемы GString # hashCode () не имеет значения для String # hashCode ().

Это никоим образом не является не детерминированный, но хэш-код GString может измениться, если участвующие объекты меняют представление toString:

def map = [:]
def gstring = "$map"
def hashCodeOld = gstring.hashCode()
assert hashCodeOld == gstring.hashCode()
map.foo = "bar"
assert hashCodeOld != gstring.hashCode()

Здесь представление toString карты изменится для Groovy и GString, поэтому GString будет производить другое хэш-код

1
ответ дан blackdrag 25 August 2018 в 06:51
поделиться
Другие вопросы по тегам:

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