Что на самом деле происходит при передаче объектов в Java?

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

(Предполагается, что hashcode() не может быть переопределено, т. е. возвращает то же значение, что и System.identityHashCode())

Трое из них очень похожи на эти вопросы, но я не могу найти соответствующий ресурс, который бы обсуждал, что это за передаваемое значение и как его получить?

РЕДАКТИРОВАТЬ: Вот мой тест. По умолчанию toSting() использует hashCode() внутри и преобразует его в шестнадцатеричное значение. Итак, когда мы передаем объекты, передается ли это значение? Или что делает java для отслеживания всех объектов (передаваемых), чтобы не было столкновений ссылок?

Object o = new Object();
System.out.println(o);
System.out.println(o.toString()); //both prints same thing - java.lang.Object@10385c1

5 ответов

Решение

hashcode() никак не связан с внутренней памятью Java. Это просто метод, который должен возвращать уникальное значение, которое может представлять объект.

Теперь так получилось, что хороший способ получить уникальное значение для представления объекта - использовать адрес его внутренней памяти. И это то, что реализация по умолчанию hashcode() делает. Но то, что hashcode() Использование адреса памяти не означает, что hashcode() определяет адрес памяти.

Но это значение, которое вы получаете, правильно использует метод hashcode() (согласно моим тестам это то же самое)?

Нет.

От JSL:

Ссылочные значения (часто просто ссылки) являются указателями на эти объекты и специальной нулевой ссылкой, которая не ссылается ни на один объект.

Прочитайте эту страницу из использования Java

Реализация хэш-кода по умолчанию для Object в Java основан на адрес памяти объекта, который также является ссылкой.

Это не значит hashCode() вызывается, чтобы получить ссылку. Это не то, что происходит. Ссылочная переменная просто хранит адрес памяти после того, как получает его из экземпляра (new Whatever()). Фактически, реализации классов обычно переопределяют hashcode(), чтобы сделать что-то другое.

Там нет требования или ожидания, что это hashCode() быть уникальный. Это не метод идентификации.

Тем не менее, большая часть JDK ожидает, что если a.equals(b), затем a.hashCode() == b.hashCode(),

Обратного никогда не ожидается; т.е. если !a.equals(b) тогда не требуется, чтобы a.hashCode() != b.hashCode(), Тем не менее, производительность будет страдать, если это не так. Другими словами, hashCode() ожидается несколько столкновений.

Реализация по умолчанию hashCode() в Object класс обычно использует адрес памяти для генерации hashCode(), но он не возвращает адрес, и в спецификации языка нет требования сделать это.

В JavaObjects передаются по ссылке, когда вы передаете Object фактически вы передаете ссылку на оригинальный объект. Хеш-код зависит от значений полей, связанных с этим объектом. хэш-код не имеет ничего общего с реальным memory address. очень редко два объекта с одинаковыми значениями имеют разные hashcode, Даже если вы создаете два разных объекта, но имеете одинаковые значения, их хеш-код будет одинаковым, всегда зависит от того, насколько эффективна ваша хеш-функция

Другие вопросы по тегам