Java дорівнює для класу. Це == те саме, що .equals


79

Можемо чи ми зробити ==на Classзмінну замість equalsі очікувати того ж результату?

Наприклад:

Class clazz = xyz;

Випадок A:

if(clazz == Date.class) {
// do something
}

Випадок B:

if(Date.class.equals(clazz)) {
// do something
}

Чи випадки A та B є функціонально однаковими?


2
Можливий дублікат - stackoverflow.com/questions/971954/…
— mre

13
@mre, ну моє запитання стосується конкретно екземплярів типу Class. Гарантовано, що завантажувач класів повертає той самий екземпляр Class для даного типу даних чи ні.
— Рамеш,

На основі деяких швидких експериментів, схоже, так. Але я не знаю, чи це гарантовано.
— Clockwork-Muse

Відповіді:


93

Клас є остаточним, тому його дорівнює () неможливо замінити. Його метод equals () успадковується від Object, який читає

public boolean equals(Object obj) {
    return (this == obj);
}

Так що так, вони однакові для класу або будь-якого типу, який не замінює equals(Object)

Щоб відповісти на ваше друге запитання, кожен ClassLoader може завантажити клас лише один раз і завжди дасть вам один і той же клас для даного повного імені.


8
чи можливо, що два навантажувачі різних класів виробляли різні класи, і їм траплялося?
— voipp

3
@voipp не виключено, що ви можете мати два екземпляри "того самого" класу, отримані від двох завантажувачів різних класів, але така ситуація не виникала б за звичайних обставин
— kbolino

1
І навіть якщо така ситуація справді настала, два класи все одно вважатимуться відмінними за методом рівних. Вам потрібно було б порівняти класи за іменами, якщо ви хотіли б знати, чи є вони "однаковими", але вони все одно можуть бути двома різними версіями одного класу або навіть випадковим зіткненням, створеним двома різними розробниками. З точки зору jvm, звичайно, вони не взаємозамінні, навіть якщо вони справді однакові.
— Jeremy Huiskamp

3
Це я сказав, чи не так? Я посилався на коментар @ kbolino про отримання двох екземплярів "того самого" класу від двох завантажувачів різних класів.
— Jeremy Huiskamp

2
@kbolino Одного разу приклад того, коли кілька екземплярів "одного" класу, отриманих від завантажувачів різних класів, є дещо частішим у світі OSGI та ESB (наприклад, ServiceMix).
— Пітер Кірбі,

6

Так.

Погляньте на опис класу Class і зауважте, що він успадковується equalsвід Object, для якого метод читає:

"Метод equals для класу Object реалізує найбільш виразне можливе відношення еквівалентності на об'єктах; тобто для будь-яких ненульових посилальних значень x і y цей метод повертає true тоді і тільки тоді, коли x і y посилаються на один і той же об'єкт (x = = y має значення true). "


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.