![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| zomber |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 7.5.2011 Репутация: нет Всего: нет |
подскажите, как напечатать адрес объекта
нужно для отладки если написать System.out.println(myObj); адрес напечатается.... но тока если нет метода toString а как быть если есть toString ? |
|||
|
||||
| Dummy |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
То, что вы называете адресом, - это на самом деле хэш-код. Чтобы его получить, можно сделать так:
Но в этом случае, если в классе вашего объекта метод hashCode() переопределен, вы будете получать уже числа, посчитанные по какому-то недефолтному алгоритму. Например, если переопределено так:
то всегда будет возвращаться одно и то же число. Чтобы для отладки получить значение хэш-кода по дефолтному алгоритму, можно сделать так:
Хэш-код объекта - это, вообще говоря, не адрес. Это просто некоторое целое число, которое ставится в соответствие объекту. Реализация hashCode() по умолчанию (т. е. то, что возвращается из System.identityHashCode()) - это почти наверняка функция адреса объекта, но нет гарантий, что это сам адрес. Более того, хэш даже не обязан быть разным для разных объектов. Это сообщение отредактировал(а) Dummy - 8.1.2012, 13:03 |
||||||
|
|||||||
| zomber |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 7.5.2011 Репутация: нет Всего: нет |
вот это-то и смущает ладно, всё равно спасибо |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
В Java просто-напросто нет такого понятия как "адрес объекта". Так что увы и ах...
-------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| Absinthe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 4.5.2011 Репутация: нет Всего: 11 |
zomber, а для какой такой отладки это нужно?
|
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
zomber,
В силу особенностей сборки мусора в Java реальный адрес объекта меняется несколько раз за время его жизни. При помощи sun.misc.Unfase (доступен только в JVM от Oracle) Вы сможете получить реальный адрес, но смысла в этом не будет - в следующий момент объект может быть перемещен. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| zomber |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 7.5.2011 Репутация: нет Всего: нет |
просто хотелось как-то уникально идентифицировать объект и если для своих объектов можно использовать свой идентификатор то как быть со стандартными типами, например, Integer\String\ArrayList\HashMap.... а хеш всегда оставляет вероятность неуникальности, имхо |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Integer\String должны идентифицироваться по значению, имхо. В частности, в java встроены механизмы, кот именно так и делают. Это исходит из логики самих объектов - "целое число", "строка".
Идентичность коллекций обпределяется идентичностью их составляющих. Сами по себе они не несут никакой смысловой нагрузки. |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
||||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
System.currentTimeMilis() не дает милисекундной точности на многих платформах. Просто потому, что та же WinXP точности больше ~10ms дать не может. Если делать последовательную аллокацию, то время в объектах будет записано одинаковое. На моей машине вот этот пример показывает одинаковое время для всех:
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
jk1, я предполагал такой ответ. но можно ведь сделать задержку...
|
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Аллокаций может происходить очень и очень много, часто без профайлера даже не подозреваешь сколько. А тут задержка при создании объекта в 0.1 секунду... Я подобную штуку как-то делал в unit-тестах, эмпирически подобрал 25ms как минимальный различимый интервал на всех машинах, где только выполнялись эти тесты. Но для продакшна такое решение не подходит совершенно. Правильно топикстартеру выше по теме советуют - равенство объектов определяют по данным. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| dorogoyIV |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
может и правильно, я же не спорю...
только вот сколько уйдет времени на генерацию идентификатора - ? конечно же Sleep(100) - это много. это же я так, для примера привел... если считать время, то:
я вообще то согласен с priam220
|
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |