Java questions d'entrevue back-end réponses

La différence entre la liste et définissez les

  1. Définir et Liste des interfaces sont héritées des fonctions de collecte: élément a placé l'ordre, l'élément peut être répété.
  2. Set Caractéristiques: élément non dans la séquence d'éléments ne se répète pas, l'élément remplacera la répétition (bien qu'aucun élément dans la séquence, mais la position de l'élément dans l'ensemble est déterminé par l'élément HashCode, dont la position est fixée, est ajouté définir l'objet doit définir la méthode equals (), en plus de soutien à la liste de diffusion, qui consiste à parcourir à travers l'index, vous pouvez également utiliser un itérateur à traverser, mais ne peut utiliser un ensemble itérative, car il est hors de l'ordre, veulent ne pas obtenir l'indice la valeur d'être) setlist et la comparaison Set :. récupérer des éléments d'efficacité inefficace, élevé supprimer et insérer, supprimer et insérer l'élément ne provoque pas un changement de position.
  3. Liste: et un tableau de même, la liste peut dynamiquement se développer, trouver des éléments de haut, des éléments de suppression à faible rendement d'insertion, car elle conduira à d'autres éléments de position de changement

Comment HashSet est d'assurer la non-répétition

HashSet quand ajouter des éléments pour déterminer s'il y a un élément de base, non seulement besoin de comparer la valeur de hachage, mais aussi de comparer égaux méthode combinée. Ajouter une méthode HashSet en () ajoutera l'utilisation de hashmap.

HashMap est thread-safe pour vous, pourquoi n'est pas thread-safe.

Dans le multi-thread, s'il y a deux fils d'écriture, juste les deux objets HASHED calculés le même code de hachage, et qu'aucun autre des données de localisation. Par conséquent, les deux fils entrent dans le même bloc de code. Considérons une telle situation, le fil par un juge si l'emplacement est pas en conflit de hachage, dans l'instruction if est pas encore l'insertion complète des données, cette fois mis les ressources du processeur pour donner le fil B, puis enfilez un parqué dans à l'intérieur de l'instruction if, le thread B ne détermine pas l'emplacement de collision de hachage, a également visité l'instruction if après le thread B exécuté, l'exécution d'un filetage tour enfilez maintenant une position d'insertion directe dans l'instruction if avant jugement a été adoptée, un fil de telle sorte que le fil B les données couvertes. Discussion situation dangereuse se produit. A l'origine HashMap, l'apparition d'un conflit de hachage est une méthode de liste chaînée ou l'arbre rouge-noir à résoudre, mais plusieurs threads, il est possible de couvrir directement.

mécanisme d'expansion hashmap

Lorsque l'élément additif dans le récipient, détermine le nombre actuel d'éléments dans le conteneur, voire inférieure à la valeur de seuil - à savoir, la longueur actuelle de la matrice est multipliée par la valeur de la charge du facteur lors de la dilatation automatique nécessaire.
Expansion: qui est, la capacité est recalculé, ajouter des éléments à hashmap cible non-stop, et un réseau d'objet hashmap interne ne peut pas charger plusieurs éléments, les besoins de l' objet à être développés longueur du tableau, d' un côté peut être chargé de plusieurs éléments. Bien sûr, Java dans le tableau n'est pas la méthode d'expansion automatique est souvent utilisé à la place d'un nouveau tableau à un tableau de petite capacité, comme nous utilisons une bouteille d' eau, si vous voulez retenir plus d' eau, ils ont dû changer grand seau .

hashMap1.7 la différence entre 1,8 et 1,8 illustrated ce qui avait été fait pour optimiser, comment optimiser?

Dans les versions précédentes de JDK1.7, une table de hachage HashMap appelée: une matrice et mis en œuvre sur la base d' une pluralité de listes liées, les valeurs de hachage seront en conflit lorsque le noeud correspondant stocké comme une liste liée.
JDK1.8, lorsque la même liste de valeurs de hachage de noeuds ne soit pas inférieur à 8, ne sera pas stockée sous la forme d'une liste liée unique, peut être ajusté à un arbre rouge-noir.
JDK1.7 à l'
aide d' une matrice d' entrée pour stocker des données, une clé de code de hachage modulo est la clé pour déterminer une position dans un tableau; hashcode même si le même, ou à matrice résultat de hashcode, la clé est positionnée à l'entrée la même rangée de la grille, qui forme un porte - clés.
Dans les cas hashcode particulièrement mauvais, disent tous les hashcode clés sont identiques, cette liste pourrait être plus longue, puis mettre / obtenir des opérations peuvent avoir besoin de parcourir la liste, qui est la pire complexité temporelle de cas de la situation dégénère O (n)
JDK1.8 en
utilisant un réseau de noeuds pour stocker des données, mais cela peut être lié structure de noeud de liste, une structure d'arbre rouge-noir peut également être
le même si la clé est insérée hashCode, celles - ci seront positionnés à la matrice de clé de noeud la même boîte de cour.
Si la même clé de la grille est pas plus de huit ans, en utilisant une structure de liste liée au magasin.
Si plus de 8, puis appelle la fonction treeIfBin pour convertir la liste est l' arbre rouge-noir.
Même si hashcode exactement le même, en raison des caractéristiques de l'arbre rouge-noir, trouver un besoin d'élément spécifique uniquement O (log n) de la surcharge
qui est le temps de fonctionnement du put / obtenir le pire de la complexité de seulement O (log n)
écouter il est très bon, mais vraiment envie de profiter de JDK1.8 il y a une limite: les
objets clés doivent être correctement rÉALISÉ Comparer Interface
Si vous ne réalisez pas des interfaces Comparez, ou mal à atteindre ( par exemple, toutes les déclarations de méthode Compare 0)
puis JDK1.8 un HashMap , mais il est encore plus lent que le JDK1.7

arbre de recherche binaire

  1. Les valeurs de tous les noeuds du sous-arbre gauche du noeud racine est inférieure à la valeur
  2. Les valeurs de tous les noeuds du sous-arbre droit du noeud de racine est supérieure à la valeur de
  3. Inorder valeur de traversée est incrémenté.

Il dispose d'arbre rouge-noir

arbre rouge-noir est un arbre de recherche binaire environ équilibré, il peut faire en sorte que la différence de hauteur entre les sous - arbres gauche et à droite d'un nœud qui ne dépasse pas le moins élevé des deux en double. Plus précisément, le besoin d'arbre rouge-noir pour remplir les conditions suivantes arbre de recherche binaire
chaque noeud est rouge ou noir est le
nœud racine doit être noir
noeud rouge ne peut pas continue (c. -à- enfant noeud rouge et le père ne peut pas être rouge a)
pour chaque noeud, un trajet de tout noeud à la valeur nulle (l'extrémité arrière de l'arbre), et contenir le même nombre de nœuds noirs

finale enfin Finaliser

les classes peuvent être modifiés finaux, des variables, des méthodes, la modification classe représente la classe ne peut pas être héritée, variable modifiée indique que la variable est une constante qui ne peut être réaffecté, les méthodes de modification pour identifier la méthode ne peut pas être surchargée

bloc finally finalement code méthode est généralement appliquée au bloc try / catch, la manipulation d'une exception, nous aurons généralement à l'exécution, indépendamment du fait que il est anormal d'exécuter le bloc de code, généralement utilisé pour stocker une partie des ressources de code fermé .

Finaliser est une méthode, une méthode de la classe d'objets appartient, et la classe d'objets est le parent de toutes les classes, qui sont généralement invoquées par le collecteur des ordures, quand nous appelons la méthode System.gc (), le garbage collector appelle Finaliser (), ordures, recyclable si un objet est déterminé dernier

Quatre types de références d'objet

référence forte tant qu'il est une référence forte, le garbage collector ne sera jamais récupéré l'
objet obj = new new Object ();
l'utilisateur utilisateur new new = le (utilisateur)
peuvent être obtenus directement par l'objet obj correspondant, comme obj.equals (new Object ()) et ce nouvel objet obj l'objet sur le dos d'une référence forte, cette référence lorsque obj est libéré, l'objet ne sera pas libéré, ce qui est la raison pour laquelle nous forme encodée souvent utilisé.
Références douces références non essentiels pour le recyclage avant de manquer de mémoire, peut être atteint par le code
objet obj = new new Object ();
SoftReference nouveau nouveau SoftReference SF = <> (obj);
obj = null;
sf.get (); // parfois null est renvoyé
à ce moment un procédé obj de référence sf douce, () peut être prise par sf.get à cet objet, bien sûr, lorsque l'objet est marqué comme étant un besoin d'objet à récupérer, ou nul; mou utilisateur principal pour atteindre en cache de référence similaire fonction, cité dans la mémoire suffisamment directement par les valeurs douces sans vraiment occupé à partir des données de la requête source, d'augmenter la vitesse, quand la mémoire est insuffisante, les données sont supprimées automatiquement cette partie du cache, la requête les données provenant d' une source réelle.
Références faibles deuxième collecte des ordures de temps, peut être mis en œuvre par le code suivant:
Object obj = new new Object ();
WeakReference nouvelle nouvelle WeakReference WF = (obj);
obj = null;
wf.get (); // return null parfois
wf.isEnQueued (); // retourner le ramasse-miettes est marqué pour la récupération des déchets à venir
référence faible est dans la seconde recyclage des déchets, en un temps court en prenant des références faibles correspondant à des données à prendre, lorsque l'exécution de la collecte des ordures secondaire renvoie null. références faibles sont principalement utilisés pour vérifier si l'objet a été marqué comme éboueur déchets récupérés rapidement peut renvoyer l'objet est marqué par le garbage collector méthode isEnQuequed références faibles.
Par exemple, utiliser une faible classe de référence a ThreadLocal.
Agiter référence lorsque le recyclage des déchets, doit être prise à la valeur de l'objet par référence, peuvent être mis en oeuvre par le code suivant
objet obj = new new Object ();
le PhantomReference le PhantomReference nouveau nouveau PF = <> (obj);
obj = null;
pf.get (); / / null jamais retour
pf.isEnQuequed (); // si au retour ont été supprimés de la mémoire.

Trois façons d'obtenir la réflexion Java

  1. La réflexion atteint par la nouvelle cible
  2. Obtenu par voie de réflexion
  3. Atteindre la réflexion par le nom de classe

mécanisme de réflexion Java

mécanisme Java de réflexion est en état de fonctionnement, pour toutes les classes, ont accès à toutes les propriétés et les méthodes de cette classe, pour tout objet peut appeler l' une de ses propriétés et méthodes. La méthode de cette fonction dynamique d'accès à l' information et de l' objet d'invocation dynamique lors de l' exécution appelé mécanisme de réflexion de Java.
bibliothèques de classe de classe ainsi que le concept de réflexion java.lang.reflect étaient le soutien, la bibliothèque contient un champ, méthode, classe de constructeur (chaque classe implémente un membre d'interface). Ces types d'objets créés par la machine virtuelle Java lors de l' exécution afin d' identifier les membres de la classe correspondant à l'inconnu.
Vous pouvez donc utiliser le constructeur pour créer un nouvel objet, lire avec get / méthodes et modifications qui associées aux champs d'objets sur le terrain, les méthodes associées à la méthode Invoke de méthode d'objet () appel. De plus, vous pouvez également appeler getFields () getMethods () et GetConstructors () comme une méthode très pratique pour renvoyer l'objet représenté par un tableau de champs, des méthodes et des constructeurs. Ces informations sont des objets anonymes peuvent être complètement réglées au moment de l' exécution, mais au moment de la compilation n'a pas besoin de savoir quoi que ce soit.

principe Arrays.sort et Collections.sort et la différence

collection ou collections différence
java.util.Collection est une collection d'interfaces. Il fournit un ensemble commun de méthodes d'interface objets pour les opérations de base.
Lorsque java.util.Collections aide pour un ensemble de classes de classes, qui fournit une série de méthodes statiques pour obtenir une variété de collection de recherche, de tri, opérations thread-safe. Puis traînant là, marche arrière, remplacer tous les éléments (Fill), copier (Copy), renvoie l'élément min Conllections plus petit, le plus grand max élément, retour à la position de départ de la liste cible spécifiée en spécifiant une liste de la dernière occurrence de la source, renvoie la liste de source spécifié position de départ de la première occurrence de la liste cible spécifiée, la liste des éléments spécifiés en fonction du mouvement de circulation distance spécifiée;
en fait , le procédé sous - jacent consiste à appeler Array.sort Collections.sort

Comment allouer un tableau en mémoire

Pour l'initialisation du tableau Java, il y a deux façons.
initialisation statique: Indique la valeur initiale de chaque élément de réseau par le programmeur lors de l' initialisation, le système déterminée par la longueur de la matrice.
Initialisation dynamique: spécifie la longueur du réseau est affiché par le programmeur lors de l' initialisation, une valeur initiale est attribuée par le système comme chaque élément de données, quand une matrice Java variable de type référence.

Publié 24 articles originaux · louange gagné 1 · vues 552

Je suppose que tu aimes

Origine blog.csdn.net/qq_45366515/article/details/104044332
conseillé
Classement