2015-08-27 21 views

ответ

3

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

В простых случаях я считаю, что это просто вопрос сравнения ссылок поразмерно - проверка того, состоят они из одного и того же байта или нет. Для более сложных сред (например, "compressed oops") может быть немного больше работы, чтобы сравнить разные представления. Но внутренняя ссылка эффективно указатель какой-то, и это просто вопрос сравнения двух указателей.

+0

true, но что делает JVM для проверки этого ссылочного равенства на Object? – Naresh

+0

@Naresh: Смотрите мое редактирование. –

+1

Джон Скит отвечает на эти вопросы тоже! О, МОЙ БОГ! – user1933888

0

== Используется для сравнения ссылок на объекты. Он просто проверяет, указывают ли два объекта на одну и ту же ссылку.

+0

как он сравнивается? – Naresh

+0

@Naresh: что мешает вам перейти в исходный код, чтобы проверить детали? – Stultuske

+0

Я пробовал своего друга и, конечно же, возвращать тот же hashCode для двух объектов, не возвращает true, что побудило меня задать этот основной вопрос. – Naresh

0

Оператор равенства (==) Тест на равенство ссылок не hashCode

public static void main(String[] args) { 

    MyClass obj1=new MyClass(); 

    MyClass obj2=new MyClass(); //obj1 and obj2 refers two different location 

    System.out.println("obj1= "+obj1+"\tobj2="+obj2); 
    if(obj1==obj2){ // so return false. 
     System.out.println("obj1==obj2"); 
    }else{ 
     System.out.println("obj1!=obj2"); 
    } 

    System.out.println(obj1.hashCode()+"\t"+obj2.hashCode()); 

    } 

class MyClass{} 

выход:

obj1= [email protected] [email protected] 
obj1!=obj2 
hashCode 
obj1=32099189 obj2=2917593 

РЕДАКТИРОВАТЬ

class EqualityTest { 

    @Override 
    public int hashCode(){ 
     return 1; 
    } 
    public static void main(String... arg){ 
     EqualityTest t1 = new EqualityTest(); 
     EqualityTest t2 =t1; // t2 referring to t1. 
     System.out.println(t1); 
     System.out.println(t2); 
     System.out.println(t1.hashCode()); 
     System.out.println(t2.hashCode()); 
     System.out.println(t1==t2); // so it return true. 
     } 
} 

выход:

[email protected] 
[email protected] 
1 
1 
true 
+0

Просто переопределите функцию hasCode() и верните константу integer. Даже obj1 и obj2 будут печатать одинаковое строковое представление с одинаковым значением hashCode, но объекты неравны. См. Ответ @Jon Skeet, который имеет смысл, что он может сравниться поразмерно. – Naresh

+0

@Naresh избегать помещать код в комментарий – Rustam

+0

Извините, что я удалил. – Naresh

0

Легко видеть, как JVM обрабатывает == на уровне байт-кода.

Например

public boolean compare(Object o1, Object o2) 
{ 
    return o1 == o2; 
} 

компилирует на следующие инструкции байт-код (используйте javap -c для создания этого):

public boolean compare(java.lang.Object, java.lang.Object); 
    Code: 
    0: aload_1 
    1: aload_2 
    2: if_acmpne  7 
    5: iconst_1 
    6: ireturn 
    7: iconst_0 
    8: ireturn 

aload1 и aload2 нагрузки ссылки из o1 и o2 в стеке. Операция == выполняется if_acmpne.

if_acmpne выскочит верхний объект два ссылается из стека и сравнивает их. Если две ссылки на объекты не равны (то есть, если ссылаются на разные объекты), ветви выполнения до .... Если объект ссылается на один и тот же объект, выполнение продолжается в следующей команде .

Конечно, это не говорит вам, как интерпретатор JVM реализует ссылки на объект, или как байт-код родной компилятор, как Hotspot реализует его, но хорошее начало для изучения темы.

+0

Хорошо изучить байтовый код. – Naresh

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