public static void main(String args[]) throws Exception {
ConcurrentHashMap<byte[], Integer> dps =
new ConcurrentHashMap<byte[], Integer>();
System.out.println(dps.putIfAbsent("hi".getBytes(), 1));
System.out.println(dps.putIfAbsent("hi".getBytes(), 1));
}
печатаетputIfAbsent() не работает с ConcurrentHashMap
null
null
Почему не напечатать 1
на второй линии? Я прочитал семантику для putIfAbsent
, и она должна быть гарантирована для работы. (Примечание: это была дистиллированная вниз с большой параллельной программы ... как вы можете видеть, что теперь однопоточных.)
Просто заметил, если я изменю 'байт []' в 'String' (и удалить' GetBytes () 'конечно), то я получаю ожидаемое поведение. Но мои 'String' - разные объекты, поэтому по вашей логике это не должно работать. Или я не понимаю? – Fixee
Хорошо, основываясь на ваших новых изменениях, я понимаю: 'String' сравнивает содержимое, но' byte [] 'сравнивает ссылки. Очень неинтуитивный. Похоже, что использование 'byte []' в качестве ключа карты, как правило, является плохой идеей. – Fixee
@Fixee 'String' имеет переопределенные' equals() 'и' hashCode() 'методы, поэтому он корректно работает с' String'. – Jesper