| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > адрес объекта |
| Автор: zomber 8.1.2012, 11:56 |
| подскажите, как напечатать адрес объекта нужно для отладки если написать System.out.println(myObj); адрес напечатается.... но тока если нет метода toString а как быть если есть toString ? |
| Автор: Dummy 8.1.2012, 13:03 | ||||||
То, что вы называете адресом, - это на самом деле хэш-код. Чтобы его получить, можно сделать так:
Но в этом случае, если в классе вашего объекта метод hashCode() переопределен, вы будете получать уже числа, посчитанные по какому-то недефолтному алгоритму. Например, если переопределено так:
то всегда будет возвращаться одно и то же число. Чтобы для отладки получить значение хэш-кода по дефолтному алгоритму, можно сделать так:
Хэш-код объекта - это, вообще говоря, не адрес. Это просто некоторое целое число, которое ставится в соответствие объекту. Реализация hashCode() по умолчанию (т. е. то, что возвращается из System.identityHashCode()) - это почти наверняка функция адреса объекта, но нет гарантий, что это сам адрес. Более того, хэш даже не обязан быть разным для разных объектов. |
| Автор: zomber 8.1.2012, 13:08 | ||
вот это-то и смущает ладно, всё равно спасибо |
| Автор: AlexeyVorotnikov 11.1.2012, 10:32 |
| В Java просто-напросто нет такого понятия как "адрес объекта". Так что увы и ах... |
| Автор: Absinthe 11.1.2012, 13:44 |
| zomber, а для какой такой отладки это нужно? |
| Автор: jk1 11.1.2012, 15:07 |
| zomber, В силу особенностей сборки мусора в Java реальный адрес объекта меняется несколько раз за время его жизни. При помощи sun.misc.Unfase (доступен только в JVM от Oracle) Вы сможете получить реальный адрес, но смысла в этом не будет - в следующий момент объект может быть перемещен. |
| Автор: priam220 13.1.2012, 18:40 |
| Integer\String должны идентифицироваться по значению, имхо. В частности, в java встроены механизмы, кот именно так и делают. Это исходит из логики самих объектов - "целое число", "строка". Идентичность коллекций обпределяется идентичностью их составляющих. Сами по себе они не несут никакой смысловой нагрузки. |
| Автор: dorogoyIV 14.1.2012, 10:38 |
бери миллисекунды, да и все... |
| Автор: jk1 14.1.2012, 12:56 | ||||
System.currentTimeMilis() не дает милисекундной точности на многих платформах. Просто потому, что та же WinXP точности больше ~10ms дать не может. Если делать последовательную аллокацию, то время в объектах будет записано одинаковое. На моей машине вот этот пример показывает одинаковое время для всех:
|
| Автор: dorogoyIV 14.1.2012, 12:59 | ||
jk1, я предполагал такой ответ. но можно ведь сделать задержку...
|
| Автор: jk1 14.1.2012, 13:06 | ||
Аллокаций может происходить очень и очень много, часто без профайлера даже не подозреваешь сколько. А тут задержка при создании объекта в 0.1 секунду... Я подобную штуку как-то делал в unit-тестах, эмпирически подобрал 25ms как минимальный различимый интервал на всех машинах, где только выполнялись эти тесты. Но для продакшна такое решение не подходит совершенно. Правильно топикстартеру выше по теме советуют - равенство объектов определяют по данным. |
| Автор: dorogoyIV 14.1.2012, 13:35 | ||||
| может и правильно, я же не спорю... только вот сколько уйдет времени на генерацию идентификатора - ? конечно же Sleep(100) - это много. это же я так, для примера привел... если считать время, то:
я вообще то согласен с priam220
|