Подтвердить что ты не робот

Использование System.identityHashCode(obj) - когда? Зачем?

когда было бы разумным временем для выполнения строки # 4 вместо строки # 3? Или они отлично дублируются?

1  Object o1 = new Object();

2  

3  int hcObj = o1.hashCode();

4  int hcSys = System.identityHashCode(o1);
4b9b3361

Ответ 1

Иногда вам может понадобиться создать набор различимых объектов. Некоторые из этих объектов могут быть равны друг другу, но вы все еще хотите ссылки на все из них... только отбрасывая действительно повторяющиеся ссылки. Вы можете сделать это, потому что реализация equals не та, которая вам интересна (некоторые классы переопределяют equals, когда вы действительно этого не хотите), или потому, что вы на самом деле просто пытаетесь подсчитать отдельные экземпляры и т.д..

Чтобы сделать это эффективно (т.е. подкреплено хеш-таблицей какого-то типа), вам нужен хеш-код, основанный на идентичности, а не на равенстве, что и дает вам identityHashCode. Это редко полезно, но иногда это может быть полезно.

Ответ 2

Для простой Object, да, она избыточна. Но есть случаи, когда класс может захотеть использовать реализацию по умолчанию hashCode (на основе ссылочного равенства) в экземпляре типа, который мог бы переопределить hashCode.

Grepcode перечисляет эти сайты вызовов, а именно IdentityHashMap среди других.