Java entspricht einer Klasse. Ist == gleich wie .equals

77

Können wir ==eine ClassVariable anstelle von equalsausführen und dasselbe Ergebnis erwarten?

Zum Beispiel:

Class clazz = xyz;

Fall A:

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

Fall B:

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

Sind Fall A und Fall B funktional gleich?

Ramesh
quelle
2
Mögliches Duplikat - stackoverflow.com/questions/971954/…
mre
13
@mre, meine Frage bezieht sich speziell auf Instanzen vom Typ Klasse. Wird garantiert, dass der Klassenlader dieselbe Instanz der Klasse für einen bestimmten Datentyp zurückgibt oder nicht?
Ramesh
Basierend auf einigen schnellen Experimenten sieht es so aus, als ob ja. Ich weiß allerdings nicht, ob es garantiert ist.
Uhrwerk-Muse

Antworten:

92

Die Klasse ist endgültig, daher kann equals () nicht überschrieben werden. Die Methode equals () wird von Object geerbt, das liest

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

Also ja, sie sind dasselbe für eine Klasse oder jeden Typ, der nicht überschreibt equals(Object)

Um Ihre zweite Frage zu beantworten, kann jeder ClassLoader eine Klasse nur einmal laden und gibt Ihnen immer dieselbe Klasse für einen bestimmten vollständig qualifizierten Namen.

Peter Lawrey
quelle
8
Ist es möglich, dass zwei verschiedene Klassenlader unterschiedliche Klassen produzierten und auf sie stießen?
Voipp
3
@voipp Es ist möglich, dass Sie zwei Instanzen der "gleichen" Klasse von zwei verschiedenen Klassenladern erhalten können, aber eine solche Situation würde unter normalen Umständen nicht auftreten
kbolino
1
Und selbst wenn diese Situation eintreten würde, würden die beiden Klassen nach der Gleichheitsmethode immer noch als verschieden angesehen. Sie müssten die Klassen nach Namen vergleichen, wenn Sie wissen möchten, ob sie "gleich" sind, aber es können immer noch zwei verschiedene Versionen derselben Klasse oder sogar eine versehentliche Kollision sein, die von zwei verschiedenen Entwicklern erstellt wurde. Aus der Sicht des JVM sind sie natürlich nicht austauschbar, auch wenn sie zufällig identisch sind.
Jeremy Huiskamp
3
Das habe ich doch gesagt, oder? Ich bezog mich auf @ kbolinos Kommentar zum Abrufen von zwei Instanzen derselben "gleichen" Klasse von zwei verschiedenen Klassenladern.
Jeremy Huiskamp
2
@kbolino In der Welt von OSGI und ESBs (wie ServiceMix) ist ein Beispiel dafür, wo mehrere Instanzen derselben "gleichen" Klasse, die von verschiedenen Klassenladern erhalten wurden, etwas häufiger vorkommen.
Peter Kirby
6

Ja.

Schauen Sie sich die Klassenklassenbeschreibung an und beachten Sie, dass sie equalsvon dieser erbt Object, für die die Methode lautet:

"Die Methode equals für die Klasse Object implementiert die bestmögliche Äquivalenzbeziehung für Objekte. Das heißt, für alle Nicht-Null-Referenzwerte x und y gibt diese Methode nur dann true zurück, wenn x und y sich auf dasselbe Objekt beziehen (x = = y hat den Wert true). "

frech
quelle
4

Ja, da der Code für equals(...)for class wie folgt lautet:

public boolean equals(Object obj) {
    return (this == obj);
}
Jérôme Verstrynge
quelle