Просто совпадение, я подозреваю ... есть связанный , чтобы быть коллизиями, и в этом случае похоже, что соответствующие различные биты в первом значении фактически теряются.
Однако это не должно иметь никакого значения - все, что использует хеш-коды , должно справляться с коллизиями.
РЕДАКТИРОВАТЬ: Это просто способ вычисления хэшей.Этот код показывает, что происходит:
import java.util.*;
public class Test
{
@SuppressWarnings("unchecked")
public static void main (String[] args)
{
AbstractMap.SimpleEntry[] entries = {
new AbstractMap.SimpleEntry("campaignId", 4770L),
new AbstractMap.SimpleEntry("campaignId", 4936L),
new AbstractMap.SimpleEntry("lazy", true),
new AbstractMap.SimpleEntry("lazy", false)
};
for (AbstractMap.SimpleEntry entry : entries) {
System.out.println(entry + ": " + entry.hashCode());
}
}
}
Результаты:
campaignId=4770: -1318251287
campaignId=4936: -1318251261
lazy=true: 3315643
lazy=false: 3315617
Таким образом, в одной паре первая карта имеет хэш 26 меньше , чем вторая карта,а в другой паре первая карта имеет хеш на 26 больше , чем вторая карта.
AbstractMap
просто суммирует значения хеша (один из способов убедиться, что порядок не имеет значения), поэтому двав конечном итоге с тем же хеш-кодом.
Это действительно до Boolean.hashCode()
, который выглядит так:
return value ? 1231 : 1237;
... и Long.hashCode()
, который выглядит так:
return (int)(value ^ (value >>> 32));
Учитывая значения, которые они случайно выбрали в Boolean.hashCode()
, если ваши long
значения расположены только на 26 (или на 26 * 2 ^ 32), то вы столкнетесь с тем же.