2013-05-28 3 views
4

В чем разница между знаками @ и #, обозначающими вывод toString? У меня есть объект Java, который не переопределяет toString. Просматривая файл журнала я вижу на некоторых линияхРазница между @ и # в выводе Java toString?

[email protected] 

в то время как на другой линии (это один излучается из спящего режима) Я вижу

com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796 

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

+0

Как сказал Анджей, это внутренний материал. Но после того, как '@' является результатом 'Integer.toHexString (System.identityHashCode (object))'. Но я могу ошибаться, потому что у меня нет оснований доказывать это: P –

+1

Использует ли ваш класс Order UUIDGenerator для назначения первичных ключей? Любой шанс, что 51a4cfa1e4b047bf2ab9b796 является первичным ключом Ордера? – Jimothy

ответ

4

No.

Оба эти цифры являются лишь произвольными внутренними деталями из двух различных систем. Ни одна из них не гарантирует, что они есть, или как они разработаны.

Если вы действительно придумали какой-то перевод, он будет очень хрупким и подвержен ошибкам без предупреждения при любых изменениях обстоятельств (разные версии патчей библиотек/JVM, работающие с кучей разного размера и т. Д.). И я подозреваю, что, вероятно, между ними нет связи. Я знаю, что первое число генерируется JVM, как правило, на основе фактического местоположения памяти, которое занимает объект. Второй будет своего рода хэш, сгенерированный Hibernate - который не имеет доступа к той же информации, что и JVM, и поэтому вряд ли будет использовать один и тот же ввод.

0

Если вы пытаетесь определить, есть ли ссылки 2 объекта относятся к одному экземпляру, используйте Object.equals

Равных метод класса Object реализует самые взыскательные возможное отношение эквивалентности на объектах; то есть для любых ненулевых опорных значений x и y этот метод возвращает true тогда и только тогда, когда x и y относятся к одному и тому же объекту (x == y имеет значение true).

Если вы просто хотите файл журнала, чтобы показать достаточно информации, чтобы определить, являются ли они тот же экземпляр, переопределение toString, чтобы обеспечить достаточную информацию, или изменить ваш регистратор сообщение.

---- EDIT ----

Для уточнения на комментарий @Jimothy, используйте order1 == order2 вместо .equals

+0

Лучше просто использовать '=='. Это правда, что «Объект.equals() 'эквивалентен, но если подкласс переопределяет' equals() '(который при использовании Hibernate обычно должен), то это уже не так. – Jimothy

+0

@Jimothy, согласился. Я заявлял, что объект является предшественником цитаты о том, что такое Object.equals ... но я вижу, что я не совсем понял это. – Lucas

1

хэш-формате, как вы догадались, происходит из спящего режима. Чтобы ответить на свой вопрос из комментариев к вашему вопросу, Hibernate в нескольких местах регистрирует имя объекта/класса, знак хэша, а затем первичный ключ объекта. Таким образом, com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796 - это Заказ с первичным ключом 51a4cfa1e4b047bf2ab9b796.

Как уже отмечалось, если вы хотите проверить, являются ли два объекта одним и тем же экземпляром, то == сделает это более просто и надежно, чем сравнение их строковых представлений.

Смежные вопросы