Какая логика работает, когда мы сравниваем два объекта с помощью '=='? Эта логика написана в каком файле? FYI Я знаю, что JVM проверяет, указывают ли обе ссылочные переменные на один и тот же объект; Я хочу знать, какой код должен быть там, чтобы определить, соответствуют ли обе точки отсчета одному и тому же объекту?Какова рабочая логика '==' при сравнении двух объектов?
ответ
В конечном счете это сводится к Java набор виртуальных инструкций инструкции if_acmpeq
and if_acmpne
, описанные совместно, как if_acmp<cond>
:
Операция
Branch, если ссылка сравнение успешно
Формат
if_acmp branchbyte1 branchbyte2Формы
if_acmpeq
= 165 (0xA5)
if_acmpne
= 166 (0xa6)Операнд Стек
..., value1, value2 → ...Описание
Оба
value1
иvalue2
должны быть ссылки типа. Они выталкиваются из стека операндов и сравниваются. Результаты сравнения заключаются в следующем:
if_acmpeq
успешно, если и только еслиvalue1
=value2
if_acmpne
успешно, если и только еслиvalue1
≠value2
Если сравнение успешно , неподписанные
branchbyte1
иbranchbyte2
используются для построения подписанного 16-битного set, где смещение рассчитывается как(branchbyte1 << 8) | branchbyte2
. Затем выполнение выполняется с таким смещением от адреса кода операции этой командыif_acmp<cond>
. Целевой адрес должен быть адресом операции инструкции в методе, который содержит эту командуif_acmp<cond>
.В противном случае, если сравнение не выполняется, выполнение выполняется по адресу инструкции, следующей за инструкцией
if_acmp<cond>
.
Что вызывает вопрос о том, что означает, что при равных значениях. Я думаю, что это осталось до реализации JVM. Вот what the spec has to say о значениях типа reference
:
Виртуальная машина Java содержит явную поддержку объектов. Объектом является либо динамически выделенный экземпляр класса, либо массив. Считается, что ссылка на объект имеет тип виртуальной машины Java
reference
. Значения типаreference
можно рассматривать как указатели на объекты. Может существовать более одной ссылки на объект. Объекты всегда управляются, передаются и тестируются с помощью значений типа.
И further down:
Есть три вида
reference
типов: типы классов, типов массивов и типов интерфейсов. Их значения - это ссылки на динамически созданные экземпляры классов, массивы или экземпляры классов или массивы, реализующие интерфейсы, соответственно.Тип массива состоит из ... (в основном здесь неуместна)
reference
значение также может быть специальнаяnull
ссылка, ссылка не объект, который будет обозначаться здесьnull
. Ссылкаnull
изначально не имеет типа времени выполнения, но может быть применена к любому типу. Значение по умолчаниюreference
-null
.Спецификация виртуальной машины Java не требует конкретной кодировки значений
null
.
Если JVM спецификация не определяет биты, которые определяют null
, я думаю, она не определяет биты ссылки на всех. Это имеет смысл. В этот момент вы находитесь рядом с металлом, который выполняет конкретную реализацию JVM. Если вы хотите знать специфику на этом уровне, по крайней мере одна JVM равна open source.
Логика написана в исходном коде JVM, по существу сравнивая указатели.
Например, байт-код if_acmpeq
выполняет ветку (прыжок), если ссылки равны.
Разве это не то, что написано на языке C, которое бы превратило '==' в соответствие с инструкциями процессора, что в свою очередь означает, что «логика» находится где-то в схемах процессоров Intel/AMD/ARM/... CPU? – Siguza
Ну, в конечном итоге все переводится в инструкции процессора. От источника Java до байт-кода, тогда байт-код интерпретируется или компилируется в собственный код. – Kayaman
Правда, но на самом деле это не делает Java, если базовая архитектура поддерживает его, а Java может просто передать ее. Например, Java полагается на оператор '==' для определения оператора '==' ... – Siguza
- 1. Какова основная логика при сравнении строк?
- 2. Использование == при сравнении объектов
- 3. Какова цель оператора '==' при сравнении значений vs '='?
- 4. Какова фактическая рабочая конец()
- 5. Какую роль играет hashCode при сравнении двух объектов?
- 6. Если «a == b» является ложным при сравнении двух объектов NSString
- 7. Максимальная глубина рекурсии превышены при сравнении двух объектов
- 8. Неисповедимы ошибка Swift компилятор при сравнении двух массивов объектов
- 9. Как вернуть сравнительные различия при сравнении двух сложных объектов?
- 10. Ошибка при сравнении двух объектов DateTime в Ruby on Rails
- 11. NullPointerException при сравнении двух строк
- 12. ClassCastException при сравнении двух строк
- 13. Ошибка при сравнении двух дат
- 14. Ошибка при сравнении двух дат
- 15. List.Contains сбой при сравнении объектов
- 16. Какова логика алгоритма
- 17. Какова логика jquery window.width?
- 18. Ошибка модуля при сравнении двух ILists
- 19. Какова минимальная рабочая реализация IVsTextViewCreationListener?
- 20. Какова логика этого процесса
- 21. Какова логика этого фрактала?
- 22. Какова логика этой программы?
- 23. Какова логика удаления строк?
- 24. Какова логика отказоустойчивого итератора?
- 25. Какова логика этого результата?
- 26. Какова логика этой программы?
- 27. Странного поведения при сравнении Юникода объектов шпагата объектов
- 28. Какова самая краткая логика ElseIf для анализа двух булевых критериев?
- 29. Какова логика Python и оператора?
- 30. Ошибка SQL Server при сравнении двух переменных
'MyObj obj1 = new MyObj(); MyObj obj2 = obj1; 'now' obj1 == obj2' is true – Yazan
[Пояснение JavaWorld] (http://www.javaworld.com/article/2072762/java-app-dev/object-equality.html) – Zulfe
[Oracle Документация] (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals (java.lang.Object)) – Zulfe