Cet article vous apporte une analyse approfondie (images et texte) de la classe Object. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Quelles sont les méthodes de la classe Object
registerNatives() [Implémentation sous-jacente, non étudiée] hashCode()equals(Object obj)clone() toString() notify()notifyAll()wait(long timeout) [il y a deux surcharges] finalize()Object a un total de 11 méthodes, dont l'une est l'implémentation sous-jacente registerNatives(), dont deux sont wait() et méthode surchargée wait(long timeout, int nanos). Il existe également un attribut : return bytecode file object
hashCode
public native int hashCode();
est implémenté par la méthode sous-jacente de native
égal à
public boolean equals(Object obj) { return (this == obj); }
Déterminer directement l'adresse mémoire
Pour que ce soit plus clair ce qu'ils font, lisons ses commentaires :
Selon les commentaires nous pouvons résumer les points suivants :
- Pour réécrire la méthode
equals()
, il faut réécrire lehashCode()
Le La méthodeequals()
compare par défaut l'adresse de l'objet, en utilisant l'opérateur d'équivalence==
- . La méthode
hashCode()
- améliore les performances des objets dont la couche sous-jacente est une table de hachage. La fonction
est le même objet (si l'objet n'a pas été modifié) : alors si vous appelezhashCode()
- à plusieurs reprises, l'int renvoyé est le même ! La méthode
hashCode()
- est convertie à partir de l'adresse de l'objet par défaut. La méthode
equals()
- a également 5 principes par défaut :
- sur ces deux objets, il retournera vrai
equals()
Réflexivité ---> L'appelequals()
renvoie vrai Peu importe qui appelle- Cohérence ---> Tant que l'objet ne l'a pas été. modifié, tant d'appels renvoient toujours les résultats correspondants !
- renvoie vrai
x.equals(y)
Transitivité--->y.equals(z)
etx.equals(z)
renvoient tous deux vrai, alors on peut conclure :- les résultats doivent être égaux.
x.equals(y)
Symétrie--->y.equals(x)
et- Le paramètre transmis est nul et la valeur renvoyée est fausse
Pourquoi est-il dit que hashCode() utilise une table de hachage comme couche inférieure pour améliorer les performances ? Facile à comprendre. Revoyons l'insertion de HashMap :
Si les valeurs de hachage ne sont pas égales, alors vous pouvez directement déterminer que les clés ne sont pas égales ! La méthode
toStringtoString est principalement utilisée pour identifier
l'objet clonerwait & notify & notifyAll
- La méthode clone est utilisée pour cloner des objets. Généralement, l'objet que vous souhaitez cloner est indépendant
(séparé de l'objet d'origine)- La copie approfondie fait référence à toutes les variables membres. de l'objet (s'il s'agit d'une référence de variable) doit être cloné. Une copie superficielle signifie que les variables membres n'ont pas été clonées
- Comment cloner un objet ?
- L'objet cloné doit implémenter l'interface Cloneable
- remplacer la méthode de clonage
, de préférence modifiée en public
les méthodes d'attente et de notification sont en fait des API Java qui nous fournissent la communication entre les threads
.
- Qu'il s'agisse d'attendre, de notifier ou de notifierAll(), il doit être appelé par l'objet écouteur (objet verrou)
- En termes simples : Ils sont tous appelés dans des blocs de code synchronisés
, sinon une exception sera levée !notify()
réveille un fil dans la file d'attente (je ne sais pas lequel sera réveillé),notifyAll()
réveille la file d'attente Tous les fils- peuvent provoquer le réveil du fil de
wait()
dans 4 situations
- Le fil est interrompu
wait()
moment Quand- est réveillé par
notify()
- est réveillé par
notifyAll()
- le fil de discussion appelant
wait()
libérera le verrou
Pourquoi attendre et notifier sont sur la méthode Objet
- Parce que notre verrou est un verrou d'objet [Si vous oubliez, vous pouvez consulter : Mécanisme de verrouillage Java pour en savoir plus], chaque objet peut devenir un verrou. Laissez le thread actuel attendre le verrouillage d'un objet. Bien sûr, il doit être opéré via cet objet
- L'objet de verrouillage est arbitraire, donc ces méthodes. doit être défini dans la classe Object
Thread.sleep()与
Object.wait()
Les deux peuvent faire une pause le thread actuel et libérez-le du contrôle du processeur.
- La principale différence est que
etObject.wait()
libère le contrôle du verrouillage de l'objet en même temps que libère le CPU.- ne libèrent pas le verrou
Thread.sleep()
Mais il faut noter que :
Après la méthode de notification est appelé, le thread réveillén'obtiendra pas immédiatement l'objet verrou . Au lieu de cela, attendez que le bloc de code synchronisé de notify soit exécuté avant que obtienne l'objet de verrouillagefinalizefinalize()` effacera l'objet dans le garbage collector.
a été appelé auparavant, mais cette méthode ne sait pas quand appeler et a incertitudeGénéralement, nous ne la réécrirons pas~
Le finalize() La méthode d'un objetne sera appelée qu'une seule fois, et être appelé finalize() ne signifie pas que gc recyclera immédiatement l'objet, il est donc possible qu'après l'appel de finalize(), l'objet n'ait pas besoin être recyclé, puis quand il est réellement sur le point d'être recyclé. Lors du recyclage, parce qu'il a été appelé une fois auparavant, finalize() ne sera pas appelé, ce qui entraînera des problèmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!