2016-04-07 2 views
-4

Какая логика работает, когда мы сравниваем два объекта с помощью '=='? Эта логика написана в каком файле? FYI Я знаю, что JVM проверяет, указывают ли обе ссылочные переменные на один и тот же объект; Я хочу знать, какой код должен быть там, чтобы определить, соответствуют ли обе точки отсчета одному и тому же объекту?Какова рабочая логика '==' при сравнении двух объектов?

+0

'MyObj obj1 = new MyObj(); MyObj obj2 = obj1; 'now' obj1 == obj2' is true – Yazan

+0

[Пояснение JavaWorld] (http://www.javaworld.com/article/2072762/java-app-dev/object-equality.html) – Zulfe

+0

[Oracle Документация] (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals (java.lang.Object)) – Zulfe

ответ

6

В конечном счете это сводится к 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 успешно, если и только если value1value2

Если сравнение успешно , неподписанные 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.

1

Логика написана в исходном коде JVM, по существу сравнивая указатели.

Например, байт-код if_acmpeq выполняет ветку (прыжок), если ссылки равны.

+0

Разве это не то, что написано на языке C, которое бы превратило '==' в соответствие с инструкциями процессора, что в свою очередь означает, что «логика» находится где-то в схемах процессоров Intel/AMD/ARM/... CPU? – Siguza

+1

Ну, в конечном итоге все переводится в инструкции процессора. От источника Java до байт-кода, тогда байт-код интерпретируется или компилируется в собственный код. – Kayaman

+0

Правда, но на самом деле это не делает Java, если базовая архитектура поддерживает его, а Java может просто передать ее. Например, Java полагается на оператор '==' для определения оператора '==' ... – Siguza

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