Maison  >  Article  >  Java  >  Questions d'entretien de base Java haute fréquence——(3)

Questions d'entretien de base Java haute fréquence——(3)

王林
王林avant
2020-08-31 16:49:482425parcourir

Questions d'entretien de base Java haute fréquence——(3)

Les questions de l'entretien sont les suivantes :

1. À quoi sert a.hashCode() ? Qu'est-ce que cela a à voir avec a.equals(b) ?

(Recommandé pour des questions d'entretien plus connexes : questions et réponses d'entretien Java)

La méthode hashCode() correspond à la valeur de hachage de l'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.

2. La différence entre le flux d'octets et le flux de caractères

Pour sortir un morceau de données binaires vers un appareil un par un, ou pour lire un morceau de données binaires un par un à partir d'un appareil , peu importe Que sont les périphériques d'entrée et de sortie ? Nous devons utiliser une méthode unifiée pour effectuer ces opérations et les 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. are Représente différents périphériques d'entrée et de sortie, qui fonctionnent tous sur des octets.

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 est l'octet, 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.

3. 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 transmettre au réseau pour d'autres ordinateurs. , 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 et que Tomcat doit sérialiser l'objet Session sur le disque dur lors du redémarrage, 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.

4. 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 composant important du système d'exécution Java. Il est responsable de la recherche et du chargement des classes à partir des fichiers de classe au moment de l'exécution.

(Recommandations de didacticiel associées : Tutoriel d'introduction à Java)

5. Quelle est la différence entre le tas et la 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 des fonctions différentes 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 dans le tas. ne finira pas avec la méthode. Et disparaîtra. 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.

6. Qu'est-ce que GC ? Pourquoi existe-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, tels qu'une mémoire oubliée ou erronée. peut provoquer une instabilité ou même un effondrement 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 recyclage 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. .

7. 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 fonctionne généralement comme un thread de bas niveau distinct, effaçant et recyclant les objets du tas de mémoire qui sont morts ou n'ont pas été utilisés depuis longtemps dans des circonstances imprévisibles. Les programmeurs ne peuvent pas appeler le garbage collector en temps réel pour gérer certaines choses. les objets ou tous les objets sont récupérés.

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.

8. Quel est le principe de base du garbage collector ? Le garbage collector 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 « atteignables » 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é.

9. En Java, quelle est la différence entre throw et throws ?

throw est utilisé pour lancer un objet instancié de la classe java.lang.Throwable, ce qui signifie que vous pouvez le lancer. le mot-clé throw Throw an Exception, tel que :
throw new IllegalArgumentException("XXXXXXXXX")

La fonction de throws fait partie de la déclaration et de la signature de la méthode, et la méthode lève l'exception correspondante afin que l'appelant peut le gérer. En Java, toute exception vérifiée non gérée doit être déclarée de force dans la clause throws.

(Tutoriel vidéo recommandé : cours Java )

10. Y aura-t-il une fuite de mémoire dans Java Veuillez 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 à durée de vie longue contiennent des références à des objets à durée de vie courte, bien que les objets à durée de vie courte ne soient plus nécessaires, en raison du long cycle de vie. L'objet conserve sa référence et ne peut pas être recyclé. C'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 l'utiliser, mais l'objet est toujours utilisé comme référence. L'objet est inutile mais ne peut pas être recyclé par le garbage collector. C'est la situation où des fuites de mémoire peuvent se produire en Java. Par exemple, dans le système de cache, nous chargeons un objet et le plaçons dans le cache (par exemple, dans une carte globale). object). ), puis ne l'utilisez 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer