Der Inhalt dieses Artikels ist eine ausführliche Analyse (Bilder und Text) der Objektklasse. Ich hoffe, dass er für Sie hilfreich ist.
Welche Methoden gibt es in der Object-Klasse?
registerNatives() [Zugrunde liegende Implementierung, nicht untersucht] hashCode()equals(Object obj)clone() toString() notify()notifyAll()wait(long timeout) [es gibt zwei Überladungen] finalize()Object verfügt über insgesamt 11 Methoden, eine davon ist die zugrunde liegende Implementierung registerNatives(), zwei davon sind wait() und wait(long timeout, int nanos) überladene Methode. Es gibt auch ein Attribut: Bytecode-Dateiobjekt zurückgeben
hashCode
public native int hashCode();
wird durch die zugrunde liegende Methode von native implementiert
gleich
public boolean equals(Object obj) { return (this == obj); }
Speicheradresse direkt bestimmen
Um klarer zu machen, was sie tun, lesen wir die Kommentare:
Den Kommentaren zufolge können wir die folgenden Punkte zusammenfassen:
- Um die
equals()
-Methode neu zu schreiben, müssen Sie diehashCode()
Die Methode- vergleicht standardmäßig die Adresse des Objekts mit dem Äquivalenzoperator
. Die Funktionequals()
==
- hat die Funktion, die Leistung für Objekte zu verbessern, deren zugrunde liegende Ebene ein Hash ist Tabelle.
hashCode()
- wiederholt aufrufen, ist der zurückgegebene int derselbe! Die
hashCode()
Das gleiche Objekt (wenn das Objekt nicht geändert wurde): Wenn Sie dann- -Methode wird standardmäßig aus der Adresse des Objekts konvertiert. Die
hashCode()
- -Methode verfügt außerdem über 5 Standardprinzipien:
equals()
- für diese beiden Objekte aufruft, es wird true zurückgegeben
equals()
Reflexivität ---> Der Aufruf vonequals()
gibt true zurück, egal wer- Konsistenz ---> Solange das Objekt nicht vorhanden ist geändert, sodass viele Aufrufe immer noch die entsprechenden Ergebnisse zurückgeben!
- gibt wahr zurück
x.equals(y)
Transitivität--->y.equals(z)
undx.equals(z)
geben beide wahr zurück, dann kann geschlossen werden:- Die Ergebnisse sollten gleich sein.
x.equals(y)
Symmetrie--->y.equals(x)
und- Der übergebene Parameter ist null und der zurückgegebene Wert ist falsch
Warum heißt es, dass hashCode() eine Hash-Tabelle als unterste Ebene verwendet? um die Leistung zu verbessern? Leicht zu verstehen. Sehen wir uns die Einfügung von HashMap an:
Wenn die Hash-Werte nicht gleich sind, können Sie direkt feststellen, dass die Schlüssel nicht gleich sind! Die
toStringtoString-Methode wird hauptsächlich verwendet, um den
zu identifizierenWait & Notify & NotifyAll>Die Klonmethode wird zum Klonen von Objekten verwendet. Im Allgemeinen ist das Objekt, das Sie klonen möchten, unabhängig (getrennt vom Originalobjekt)Deep Copy bezieht sich auf alle Mitgliedsvariablen des Objekts (wenn es sich um eine Variablenreferenz handelt) sollte geklont werden. Eine flache Kopie bedeutet, dass die Mitgliedsvariablen nicht geklont wurden. Wie klont man ein Objekt?
- Das geklonte Objekt muss die Cloneable-Schnittstelle implementieren
- die Klonmethode überschreiben
, vorzugsweise in öffentlich geändert
Wait- und Notify-Methoden sind eigentlich Java-APIs, die uns Kommunikation zwischen Threads
ermöglichen.
- Unabhängig davon, ob es sich um Wait, Notify oder NotifyAll() handelt, muss es vom Listener-Objekt (Sperrobjekt)
- Einfach ausgedrückt: Sie werden alle in synchronisierten Codeblöcken aufgerufen, andernfalls wird eine Ausnahme ausgelöst!
- können dazu führen, dass der Thread von
notify()
weckt einen Thread in der Warteschlange (nicht sicher, welcher geweckt wird), weckt die WarteschlangenotifyAll()
Alle Threads- in 4 Situationen aktiviert wird
wait()
- Der Thread, der
Der Thread wird unterbrochen
- Zeitpunkt
wird aktiviert durchwait()
- wird aktiviert durch
notify()
notifyAll()
- aufruft, wird
wait()
die Sperre aufheben
Warum Warten und Benachrichtigen auf der Objektmethode basieren
- Da unsere Sperre eine Objektsperre ist [Wenn Sie es vergessen, können Sie sich den Java-Sperrmechanismus ansehen, um mehr zu erfahren], kann jedes Objekt zu einer Sperre werden. Lassen Sie den aktuellen Thread auf die Sperre eines Objekts warten
- Das Sperrobjekt ist willkürlich, also diese Methoden muss in der Object-Klasse definiert werden
Thread.sleep()与
Object.wait()
Beide können pausieren den aktuellen Thread und geben Sie ihm die CPU-Steuerung frei.
- Der Hauptunterschied besteht darin, dass
undObject.wait()
die Kontrolle über die Objektsperre gleichzeitig mit der Freigabe der CPU freigibt.- hebt die Sperre nicht auf
Thread.sleep()
Aber es sollte beachtet werden, dass:
Nach der Benachrichtigungsmethode heißt: Der erwachte Threaderhält das Sperrobjekt nicht sofort. Warten Sie stattdessen, bis der synchronisierte Codeblock von notify ausgeführt wird, bevor die Methode finalize
Unsicherheit auf.Im Allgemeinen werden wir sie nicht neu schreiben~Die finalize() Methode eines Objekts
wird nur einmal aufgerufen, und der Aufruf von finalize() bedeutet nicht, dass gc das Objekt sofort wiederverwendet, daher ist es möglich, dass das Objekt nach dem Aufruf von finalize() nicht benötigt wird recycelt werden soll, und dann, wenn es tatsächlich recycelt werden soll. Beim Recycling wird finalize() nicht aufgerufen, was zu Problemen führt, da es bereits einmal aufgerufen wurde.
Das obige ist der detaillierte Inhalt vonEingehende Analyse der Object-Klasse (Bilder und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!