Maison > Java > javaDidacticiel > Analyse approfondie de la classe Object (images et texte)

Analyse approfondie de la classe Object (images et texte)

不言
Libérer: 2019-03-02 14:37:21
avant
2762 Les gens l'ont consulté

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);
}
Copier après la connexion

Déterminer directement l'adresse mémoire

Pour que ce soit plus clair ce qu'ils font, lisons ses commentaires :

Analyse approfondie de la classe Object (images et texte)

Analyse approfondie de la classe Object (images et texte)

Selon les commentaires nous pouvons résumer les points suivants :

  • Pour réécrire la méthode equals(), il faut réécrire le hashCode()Le La méthode
  • equals() 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 hashCode()
  • est le même objet (si l'objet n'a pas été modifié) : alors si vous appelez
  • à 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 :
    • equals() Réflexivité ---> L'appel equals() renvoie vrai Peu importe qui appelle
    • sur ces deux objets, il retournera vrai
    • Cohérence ---> Tant que l'objet ne l'a pas été. modifié, tant d'appels renvoient toujours les résultats correspondants !
    • x.equals(y)Transitivité--->y.equals(z) et x.equals(z) renvoient tous deux vrai, alors on peut conclure :
    • renvoie vrai
    • x.equals(y)Symétrie--->y.equals(x) et
    • les résultats doivent être égaux.
    • 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 : Analyse approfondie de la classe Object (images et texte)

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

toString

toString est principalement utilisée pour identifier

l'objet

Analyse approfondie de la classe Object (images et texte)

cloner
  • 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

wait & notify & notifyAll

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 Object.wait() libère le contrôle du verrouillage de l'objet en même temps que libère le CPU.
  • et
  • 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 verrouillage
finalize

finalize()` 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 objet
ne 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.

Analyse approfondie de la classe Object (images et texte)

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal