Что проверяет JVM в равенстве объектов (==
)? Это hashCode
двух объектов или еще чего-нибудь?Что проверяет JVM в отношении Java-объекта (==)?
ответ
Оператор ==
только проверяет ссылочное равенство. Он не вызывает никаких методов для объекта ... он просто проверяет, равны ли две ссылки, т.е. они относятся к одному и тому же объекту.
В простых случаях я считаю, что это просто вопрос сравнения ссылок поразмерно - проверка того, состоят они из одного и того же байта или нет. Для более сложных сред (например, "compressed oops") может быть немного больше работы, чтобы сравнить разные представления. Но внутренняя ссылка эффективно указатель какой-то, и это просто вопрос сравнения двух указателей.
== Используется для сравнения ссылок на объекты. Он просто проверяет, указывают ли два объекта на одну и ту же ссылку.
Оператор равенства (==
) Тест на равенство ссылок не 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
Просто переопределите функцию hasCode() и верните константу integer. Даже obj1 и obj2 будут печатать одинаковое строковое представление с одинаковым значением hashCode, но объекты неравны. См. Ответ @Jon Skeet, который имеет смысл, что он может сравниться поразмерно. – Naresh
@Naresh избегать помещать код в комментарий – Rustam
Извините, что я удалил. – Naresh
Легко видеть, как 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 реализует его, но хорошее начало для изучения темы.
Хорошо изучить байтовый код. – Naresh
- 1. Что общего в JVM
- 2. Указывает, когда JVM Verifier Проверяет классы
- 3. Проверяет достоверность $ _SERVER ["HTTP_REFERER"] в отношении известного URL-адреса?
- 4. Как проверяет Java, правильно ли присвоено значение (в отношении типа)?
- 5. Как JVM проверяет, какой тип исключения произошел в программе?
- 6. Что запускает поток JVM?
- 7. Что такое JVM?
- 8. JVM Crash, что случилось?
- 9. Что такое JVM Bind?
- 10. Разница в работе с сертификатом ssl в отношении браузера и jvm?
- 11. Что такое запрос в отношении файлов cookie?
- 12. Что лучше в отношении производительности базы данных?
- 13. Что означает «самоописывание» в отношении веб-служб?
- 14. Что такое перехват метода в отношении насмешек?
- 15. Что такое набор в отношении баз данных?
- 16. Что такое «sth» в отношении веб-трафика
- 17. Что означает -pe в отношении скриптов?
- 18. в отношении веб-разработки, что такое таксономия?
- 19. Что касается небольшой путаницы в отношении DataReader
- 20. Что такое хэш в отношении JSON?
- 21. Что означает ранг в отношении преобразования типов?
- 22. Что означает «дорогостоящий» в отношении программных операций?
- 23. в отношении рекурсии, что такое начальное значение?
- 24. Что так важно в отношении полимофизма?
- 25. Что такое исправление обезьян в отношении TypeScript?
- 26. Что представляет собой ноль в отношении HyperLogLog?
- 27. Что такое «соль» в отношении MYSQL sha1?
- 28. Что означает «состояние» в отношении приложений Django?
- 29. Что означает синтаксис JavaScript в отношении .unshift()?
- 30. Что такое «частичная колонка» в отношении DataGridView?
true, но что делает JVM для проверки этого ссылочного равенства на Object? – Naresh
@Naresh: Смотрите мое редактирование. –
Джон Скит отвечает на эти вопросы тоже! О, МОЙ БОГ! – user1933888