Maison  >  Article  >  Java  >  Questions d'entretien Java (à lire absolument lors de la recherche d'un emploi)

Questions d'entretien Java (à lire absolument lors de la recherche d'un emploi)

怪我咯
怪我咯original
2017-06-26 11:45:351798parcourir

Un résumé de référence personnel, toute similitude est purement fortuite !

1. Comment le principe de mise en œuvre de hashmap et la sécurité des threads de hashtable sont-ils implémentés ?
HashMap est en fait implémenté sous forme de tableau linéaire, on peut donc comprendre que le conteneur de stockage des données est un tableau linéaire.
Tout d'abord, HashMap implémente une classe interne statique Entry. Ses attributs importants sont key, value, puis à partir des attributs key et value, nous pouvons clairement voir que Entry est un bean de base pour l'implémentation de HashMap key-value. paires.Nous Comme mentionné ci-dessus, la base de HashMap est un tableau linéaire. Ce tableau est Entry[], et le contenu de la Map est stocké dans Entry[].
Le conteneur HashTable utilise la synchronisation pour garantir la sécurité des threads, mais l'efficacité de HashTable est très faible lorsque la concurrence des threads est féroce. Parce que lorsqu'un thread accède à la méthode de synchronisation de HashTable, d'autres threads peuvent entrer dans un état de blocage ou d'interrogation lors de l'accès à la méthode de synchronisation de HashTable.
La technologie de segmentation des verrous utilisée par ConcurrentHashMap divise d'abord les données en segments pour le stockage, puis attribue un verrou à chaque segment de données. Lorsqu'un thread occupe le verrou pour accéder à un segment de données, les données des autres segments peuvent également. être consulté par d'autres threads.

2. Le principe d'implémentation de put() et get() de hashmap ?
La première paire clé-valeur A arrive, et l'index=0 obtenu en calculant le hachage de sa clé est enregistré comme : Entry[0] = A. Au bout d'un moment, une autre paire clé-valeur B arrive, et son index est également égal à 0 par calcul. Que dois-je faire maintenant ? HashMap fera ceci : B.next = A, Entry[0] = B. Si C revient, l'index est également égal à 0, alors C.next = B, Entry[0] = C ; l'endroit où index = 0 En fait, trois paires clé-valeur A, B et C sont accessibles et elles sont liées entre elles via l'attribut suivant. Alors ne vous inquiétez pas si vous avez des questions. C'est-à-dire que le dernier élément inséré est stocké dans le tableau.
get() localise d'abord puis traverse.


3. Le cycle de vie du haricot de printemps ?
Au printemps, l'attribut singleton est par défaut true S'il est défini sur false, une nouvelle instance sera générée à chaque fois que le bean obtenu par l'alias est spécifié.
3.1 : Création du Bean : Le conteneur recherche les informations de définition du Bean et l'instancie.
3.2 : Injection d’attributs.
3.3 : BeanNameAware
3.4 : setBeanFactory() de BeanFactoryAware
3.5 : ProcessBeforeInitialization() de BeanPostProcessors
3.6 : initialisation de afterPropertiesSet() de Bean :
3.7 : Définir la méthode d'initialisation dans le fichier de définition de Bean :
3.8 : ProcessaAfterInitialization() de BeanPostProcessors
DesposableBean's destroy(), destroy-method est défini dans le fichier de définition du Bean


4. Comment Spring gère-t-il les transactions ?
La transaction de Spring peut être considérée comme une implémentation de Spring AOP. Réflexion et proxys dynamiques.

Programmation orientée aspect AOP, c'est-à-dire étendre les fonctions d'origine sans modifier le code source et exploiter des classes spécifiques via des classes proxy.

Spring est un conteneur. Les objets sont gérés via le conteneur Spring, et Spring gère les objets en fonction du fichier de configuration.

Il existe deux manières de déclarer des transactions au printemps, programmatique et déclarative. Spring gère principalement les transactions via des « transactions déclaratives », c'est-à-dire qu'elles sont déclarées dans le fichier de configuration et que l'aspect transactionnel est intégré au programme via AOP. Le plus grand avantage est que la quantité de code est considérablement réduite.


5. La couche de service est-elle une instance unique ou plusieurs instances ? Est-ce thread-safe ? Et si vous souhaitez créer plusieurs instances ?
Les objets générés par Spring sont des singletons par défaut. Il peut être modifié en plusieurs instances via l'attribut scope.



5.1 Servlet est un singleton, à proprement parler. un ServletMapping qui correspond à une instance singleton
5.2. Il existe de nombreuses façons de maintenir la sécurité des threads de servlet. Habituellement, des blocs (ou méthodes) de synchronisation sont utilisés pour protéger les données partagées. Deuxièmement, certains mécanismes de verrouillage peuvent être volatils et verrouillés. ThreadLocal peut également être utilisé. En ouvrant un canal sécurisé et en bloquant en même temps le thread de l'autre partie pour la sécurité des threads, ses performances sont très médiocres. Ne définissez pas de variables dans la couche C pour empêcher la concurrence multithread.

6. La propagation des choses ? Niveau d'isolement de la base de données ?
PROPAGATION_REQUIRED Si une transaction existe, la transaction en cours est prise en charge. S'il n'y a pas de transaction, activez
PROPAGATION_SUPPORTS. S'il y a une transaction, prenez en charge la transaction en cours. S'il n'y a pas de transaction, exécution non transactionnelle
PROPAGATION_MANDATORY Si une transaction existe déjà, prend en charge la transaction en cours. S'il n'y a aucune transaction active, une exception est levée.
PROPAGATION_REQUIRES_NEW démarre toujours une nouvelle transaction. Si une transaction existe déjà, la transaction existante est suspendue.
PROPAGATION_NOT_SUPPORTED Exécutez toujours de manière non transactionnelle, en suspendant toutes les transactions existantes.
PROPAGATION_NEVER s'exécute toujours de manière non transactionnelle et lève une exception s'il y a une transaction active
PROPAGATION_NESTED Si une transaction active existe, s'exécute dans une transaction imbriquée,
puis exécute par TransactionDefinition. Attribut PROPAGATION_REQUIRED
Par défaut, nous utilisons
PROPAGATION_REQUIRED

① Sérialisable : il peut éviter l'apparition de lectures sales, de lectures non répétables et de lectures fantômes.

 ② Lecture répétable : elle peut éviter l'apparition de lectures sales et de lectures non répétables.

 ③ Lecture validée : cela peut éviter l'apparition de lectures sales.

 ④ Lecture non engagée (Lecture non engagée) : Le niveau le plus bas, aucune garantie en aucune circonstance.
Le niveau par défaut pour les bases de données générales est Lecture validée.

Le niveau d'isolement par défaut de MySQL est Lecture répétable.

Afficher le niveau d'isolement de la transaction en cours dans la base de données MySQL :

sélectionnez @@tx_isolation ;
Définissez le niveau d'isolement de la transaction dans la base de données MySQL :

set [glogal | session] transaction isolation level isolation level name;

set tx_isolation='isolation level name;'
Rappelez-vous : la définition du niveau d'isolation de la base de données doit être effectuée avant de démarrer une transaction !

7. Comment Arraylist assure-t-il la sécurité des threads ?
Afin de résoudre ce problème de sécurité des threads, vous pouvez utiliser Collections.synchronizedList(), tel que :

List> ArrayList< Map>());
8. Comment configurer la taille de la mémoire de Tomcat ?
La mémoire par défaut que Tomcat peut utiliser est de 128 Mo. Dans les projets d'application plus importants, cette mémoire n'est pas suffisante et doit être augmentée. Vous avez le choix entre plusieurs méthodes :

La première méthode :

Sous Windows, dans le fichier /bin/catalina.bat, sous Unix, devant le fichier /bin/catalina. sh , ajoutez les paramètres suivants :

JAVA_OPTS='-Xms [Taille de la mémoire d'initialisation] -Xmx [Mémoire maximale pouvant être utilisée]'

Il est nécessaire d'augmenter les valeurs​ ​de ces deux paramètres. Par exemple :

JAVA_OPTS='-Xms256m -Xmx512m'

Indique que la mémoire initiale est de 256 Mo et que la mémoire maximale pouvant être utilisée est de 512 Mo.

Deuxième méthode : définir les variables d'environnement Nom de la variable : JAVA_OPTS Valeur de la variable : -Xms512m -Xmx512m
Troisième méthode : les deux premières méthodes sont destinées au cas où il y a catalina.bat dans le répertoire bin (par exemple , Tomcat directement décompressé, etc.), mais certaines versions installées de Tomcat n'ont pas catalina.bat. Pour le moment, vous pouvez utiliser la méthode suivante. Bien entendu, cette méthode est également la méthode la plus courante : ouvrir tomcatHome//bin. //tomcat5w.exe, cliquez sur l'onglet Java, puis vous constaterez qu'il y a deux éléments : Le pool de mémoire initial et le pool de mémoire maximum correspondent à la taille de la mémoire initialisée. Le pool de mémoire maximum est la taille de mémoire maximale. Après l'avoir défini, appuyez sur OK, puis redémarrez TOMCAT. Vous constaterez que la mémoire disponible pour jvm dans Tomcat a changé
Ajoutez-la sous @echo off dans catalina.bat (la deuxième ligne). )

set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=256m

9. Quelle est la classe d'implémentation par défaut du servlet ?
Interface lServlet SUN Company définit deux classes d'implémentation par défaut : GenericServlet et HttpServlet.
S'il s'agit d'une requête GET, appelez la méthode doGet de HttpServlet. S'il s'agit d'une requête Post, appelez la méthode doPost. Par conséquent, lorsque les développeurs écrivent des servlets, ils n'ont généralement besoin que de remplacer la méthode doGet ou doPost au lieu de remplacer la méthode de service

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:
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