A quoi sert a.hashCode() ? Qu'est-ce que cela a à voir avec a.equals(b) ? La méthode
hashCode() correspond à la valeur de hachage du type entier de l'objet. Il est couramment utilisé dans les classes de collection basées sur le hachage, telles que Hashtable, HashMap, LinkedHashMap, etc. Elle est particulièrement étroitement liée à la méthode equals(). Selon la spécification Java, deux objets égaux utilisant la méthode égal() doivent avoir le même code de hachage.
La différence entre le flux d'octets et le flux de caractères (Apprentissage recommandé : questions d'entretien Java)
Pour sortir une donnée binaire une par une vers un certain appareil, ou lire un morceau de données binaires un par un à partir d'un appareil, quel que soit le périphérique d'entrée et de sortie, nous devons utiliser une manière unifiée pour effectuer ces opérations.
Décrire de manière abstraite. Cette méthode de description abstraite est nommée IO stream. Les classes abstraites correspondantes sont OutputStream et InputStream. Différentes classes d'implémentation représentent différents périphériques d'entrée et de sortie.
Tout dans un ordinateur existe finalement sous forme d'octets binaires. Pour les caractères chinois fréquemment utilisés, obtenez d'abord les octets correspondants, puis écrivez les octets dans le flux de sortie.
Lors de la lecture, la première chose lue, ce sont les octets, mais si nous voulons l'afficher sous forme de caractères, nous devons convertir les octets en caractères. Étant donné que ces besoins sont répandus, Java fournit spécifiquement une classe wrapper de flux de caractères.
Le périphérique sous-jacent n'accepte toujours que les données en octets. Parfois, pour écrire une chaîne sur le périphérique sous-jacent, vous devez convertir la chaîne en octets avant d'écrire. Le flux de caractères est un wrapper pour le flux d'octets. Le flux de caractères accepte directement les chaînes. Il convertit les chaînes en octets en interne, puis les écrit sur le périphérique sous-jacent. Cela nous permet d'écrire ou de lire des chaînes sur le périphérique. Périphérique IO pratique.
Lors de la conversion de caractères en octets, faites attention aux problèmes d'encodage, car convertir une chaîne en un tableau d'octets revient en fait à la convertir en une certaine forme d'octet codée du caractère, et l'inverse est vrai lors de la lecture.
Qu'est-ce que la sérialisation Java et comment implémenter la sérialisation Java ? Ou veuillez expliquer le rôle de l'interface sérialisable.
Nous transférons parfois un objet Java dans un flux d'octets ou restaurons un objet Java à partir d'un flux d'octets. Par exemple, nous devons stocker l'objet Java sur le disque dur ou le transférer vers d'autres ordinateurs. sur le réseau, dans ce processus, nous pouvons écrire notre propre code pour convertir un objet Java en un flux d'octets dans un certain format, puis le transmettre.
Cependant, jre lui-même fournit ce support. Nous pouvons appeler la méthode writeObject de OutputStream pour le faire. Si nous voulons que Java le fasse pour nous, l'objet à transférer doit implémenter l'interface sérialisable de cette manière. , lors de la compilation de javac, un traitement spécial sera effectué pour que la classe compilée puisse être exploitée par la méthode writeObject. C'est ce qu'on appelle la sérialisation.
La classe qui doit être sérialisée doit implémenter l'interface Serialisable. Cette interface est une mini interface dans laquelle il n'est pas nécessaire d'implémenter des méthodes.
Par exemple, dans le développement Web, si l'objet est enregistré dans la session, Tomcat doit sérialiser l'objet Session sur le disque dur lors du redémarrage, et cet objet doit implémenter l'interface Serialisable. Si un objet doit être transmis sur le réseau via un système distribué, l'objet transmis doit implémenter l'interface sérialisable.
Décrivez le mécanisme principal de chargement des fichiers de classe par JVM ?
Le chargement des classes dans JVM est implémenté par ClassLoader et ses sous-classes Java ClassLoader est un système d'exécution Java important. composants. Il est responsable de la recherche et du chargement des classes à partir des fichiers de classe au moment de l'exécution.
Quelle est la différence entre tas et pile.
La mémoire Java est divisée en deux catégories, l'une est la mémoire de pile et l'autre est la mémoire de tas. La mémoire de pile signifie que lorsque le programme entre dans une méthode, un espace de stockage privé sera alloué à cette méthode pour stocker les variables locales à l'intérieur de cette méthode. Lorsque cette méthode se terminera, la pile allouée à cette méthode sera également libérée. par conséquent.
Le tas est une mémoire qui a une fonction différente de la pile. Il est généralement utilisé pour stocker des données qui ne sont pas dans la pile de méthodes actuelle.
Par exemple, les objets créés à l'aide de new sont placés sur le tas, ils ne disparaîtront donc pas à la fin de la méthode. Une fois les variables locales de la méthode modifiées avec final, elles sont placées dans le tas au lieu de la pile.
Qu'est-ce que GC ? Pourquoi y a-t-il GC ?
GC signifie garbage collection (Gabage Collection). Le traitement de la mémoire est l'endroit où les programmeurs sont sujets à des problèmes d'oubli ou de mémoire incorrecte. le recyclage peut entraîner une instabilité, voire un crash du programme ou du système.
La fonction GC fournie par Java peut détecter automatiquement si l'objet dépasse la portée pour atteindre l'objectif de récupération automatique de la mémoire. Le langage Java ne fournit pas de méthode d'opération explicite pour libérer la mémoire allouée.
Avantages et principes de la collecte des déchets. Et considérons 2 mécanismes de recyclage.
Une caractéristique notable du langage Java est l'introduction d'un mécanisme de récupération de place, qui résout le problème de gestion de la mémoire le plus gênant pour les programmeurs C++. Cela évite aux programmeurs Java de prendre en compte la gestion de la mémoire lors de l'écriture de programmes. En raison du mécanisme de récupération de place, les objets en Java n'ont plus le concept de « portée ». Seules les références aux objets ont une « portée ».
Le garbage collection peut prévenir efficacement les fuites de mémoire et utiliser efficacement la mémoire disponible.
Le garbage collector s'exécute généralement comme un thread de bas niveau distinct. Il efface et recycle les objets de la mémoire qui sont morts ou n'ont pas été utilisés depuis longtemps dans des circonstances imprévisibles. Les programmeurs ne peuvent pas le faire en réalité. appelez le garbage collector pour récupérer un objet ou tous les objets.
Le mécanisme de recyclage comprend la collecte des déchets de copie générationnelle, la collecte des déchets marquée et la collecte des déchets incrémentielle.
Quel est le principe de base du ramasse-miettes ? Le ramasse-miettes peut-il récupérer la mémoire immédiatement ? Existe-t-il un moyen de demander activement à la machine virtuelle d'effectuer un garbage collection ?
Pour GC, lorsque le programmeur crée un objet, GC commence à surveiller l'adresse, la taille et l'utilisation de l'objet. Habituellement, GC utilise un graphe orienté pour enregistrer et gérer tous les objets du tas.
De cette manière, il est déterminé quels objets sont « accessibles » et quels objets sont « inaccessibles ». Lorsque le GC détermine que certains objets sont « inaccessibles », le GC est responsable de la récupération de ces espaces mémoire.
Les programmeurs peuvent exécuter manuellement System.gc() pour indiquer au GC de s'exécuter, mais la spécification du langage Java ne garantit pas que le GC sera exécuté.
En Java, quelle est la différence entre throw et throws ?
throw est utilisé pour lancer un objet d'instanciation de la classe java.lang.Throwable, ce qui signifie que vous can pass Le mot-clé throw lève une exception, telle que :
throw new IllegalArgumentException(“XXXXXXXXX″)
et le rôle de throws fait partie de la déclaration et de la signature de la méthode. La méthode renvoie l'exception correspondante afin que l'appelant puisse la gérer. En Java, toute exception vérifiée non gérée doit être déclarée de force dans la clause throws.
Y a-t-il une fuite de mémoire dans Java, veuillez la décrire brièvement ?
Expliquez d'abord ce qu'est une fuite de mémoire : ce qu'on appelle une fuite de mémoire signifie qu'un objet ou une variable qui n'est plus utilisé par le programme a été occupé dans la mémoire. Il existe un mécanisme de garbage collection en Java, qui peut garantir que lorsque l'objet n'est plus référencé, l'objet sera automatiquement effacé de la mémoire par le garbage collector.
Étant donné que Java utilise un graphe orienté pour la gestion du garbage collection, il peut éliminer le problème des cycles de référence, par exemple, s'il y a deux objets qui se référencent l'un l'autre, tant qu'ils ne sont pas accessibles depuis le processus racine. , le GC peut également les recycler.
Fuites de mémoire en Java : des fuites de mémoire sont susceptibles de se produire lorsque des objets à longue durée de vie contiennent des références à des objets à courte durée de vie, bien que les objets à courte durée de vie ne soient plus nécessaires, car les objets à longue durée de vie contiennent un. y faire référence et empêcher son recyclage est le scénario dans lequel des fuites de mémoire se produisent en Java.
En termes simples, le programmeur peut créer un objet et ne plus jamais utiliser l'objet, mais l'objet est toujours référencé, c'est-à-dire que l'objet est inutile mais ne peut pas être recyclé par le garbage collector. peut se produire en Java.
Par exemple, dans le système de cache, nous chargeons un objet et le mettons dans le cache (par exemple, dans un objet cartographique global), puis nous ne l'utilisons plus jamais. Cet objet est toujours référencé par le cache. , mais n'est plus utilisé.
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!