В чем смысл информации, которую я получаю, печатая объект в Java?

Допустим, у меня есть этот код:

Integer[] a= new Integer[5];
System.Out.println(((Object)a).toString());

вывод получить

[Integer@89fbe3

в чем смысл 89fbe3 ? это какой-то адрес? хэш-код? он уникален для каждого объекта? , и если да, то если это многопоточная программа, она все еще уникальна?

Спасибо !


person RanZilber    schedule 14.01.2011    source источник


Ответы (5)


Это адрес памяти объекта, что и делает функция toString() по умолчанию, реализованная в классе Object. Это также хэш-код() по умолчанию.

person Jesus Ramos    schedule 14.01.2011
comment
Я собирался проголосовать против, но это не технически неправильно. Но это заблуждение. Только потому, что массивы используют хэш-код по умолчанию, это адрес памяти. - person Mark Peters; 15.01.2011
comment
Это не (обязательно) адрес памяти. Это зависит от JVM. (Я подозреваю, что на самом деле это никогда не адрес памяти.) - person david van brink; 15.01.2011
comment
поэтому я сказал, что это значения по умолчанию toString() и hashCode(), определенные в базовом типе объекта. Потому что он, очевидно, может переопределить любой из этих методов, чтобы получить другие результаты. - person Jesus Ramos; 15.01.2011
comment
Значит, это верно только для массивов? - person RanZilber; 15.01.2011
comment
@RanZilber: Нет, это верно для любого объекта, чья иерархия классов не переопределяет метод по умолчанию hashCode() или toString(). - person Mark Peters; 15.01.2011
comment
@ Господи, нет, он не может переопределить методы. Во всяком случае, не для классов массивов. - person Sean Patrick Floyd; 15.01.2011
comment
Посмотрите на пример в вопросе. Это нечетное число. Ясно, что это не фактический адрес памяти. - person Tom Hawtin - tackline; 15.01.2011

Это результат System.identityHashCode(Object x);

который является реализацией по умолчанию для каждого объекта hashCode()...

из объекта javadoc:

getClass().getName() + '@' + Integer.toHexString(hashCode())
person david van brink    schedule 14.01.2011
comment
Это охватывает все базы. [I на самом деле то, что вы получаете, когда делаете new int[0].getClass().getName(). +1. - person Mark Peters; 15.01.2011
comment
оп! и спасибо за исправление формата. :) - person david van brink; 15.01.2011

89fbe3 — это шестнадцатеричная версия хеш-кода. [I означает массив целых чисел (я удивлен, что вы поняли это с Integer[], вы уверены, что это не int[]?)

Некоторые другие:

  • [L<typename>;: массив ссылочного типа "typename" (например, [Ljava.lang.Integer)
  • [J: массив длинных слов
  • [B: массив байтов

и т.п.

person Mark Peters    schedule 14.01.2011

Это идентификационный хэш-код объекта (вы можете думать о нем как об адресе объекта), а также некоторая информация о типе.

[ = массив I = целое число

person time4tea    schedule 14.01.2011

Я думаю, что хотя технически все ответы верны, реальный ответ — «НЕТ». Это число не имеет никакого значения, и вы не можете делать абсолютно никаких предположений о нем.

person MK.    schedule 14.01.2011
comment
Итак, есть ли способ определить между двумя массивами во время выполнения? - person RanZilber; 15.01.2011
comment
Число представляет собой хеш-код в шестнадцатеричном формате, который для метода, который не переопределяет хэш-код, является (в некоторой степени) уникальным идентификатором объекта. Это можно использовать, чтобы увидеть, являются ли два объекта одним и тем же экземпляром. - person Steve Kuo; 15.01.2011
comment
@RanZilber Я думаю, ты случайно задал вопрос. - person MK.; 15.01.2011
comment
Это хорошо для проверки того, действительно ли две переменные, которые, как вы предполагали, относятся к одному и тому же экземпляру. - person biziclop; 15.01.2011
comment
@Steve Kuo '==' можно использовать, чтобы увидеть, являются ли 2 объекта одним и тем же экземпляром. equals() можно использовать, чтобы увидеть, одинаковы ли два объекта в соответствии с их создателем. Я не знаю, для чего можно использовать метод toString() по умолчанию. - person MK.; 15.01.2011
comment
@biziclop что не так с '=='??? - person MK.; 15.01.2011
comment
Я тоже думаю, что это правильный ответ. Если вам нужно полностью идентифицировать объект, вам нужно сохранить ссылку на него и использовать ==, чтобы увидеть, совпадает ли он с другим объектом. Просто остерегайтесь утечек памяти по этому маршруту. - person Mark Peters; 15.01.2011
comment
@MK Я думал о том, чтобы напечатать строку объекта по умолчанию в файл журнала отладки для ручного наблюдения, а не использовать ее в реальном коде. - person biziclop; 15.01.2011