1. La méthode égaux est utilisée pour comparer si le contenu de l'objet est égal (remplacé plus tard)
2. La méthode de code de hash est utilisée uniquement dans les collections
3. Lorsque la méthode équivalente est écrasée, si l'objet de comparaison est égal sera comparé par la méthode égale écrasée (à juger si le contenu de l'objet est égal).
4. Lorsque vous placez un objet dans une collection, déterminez d'abord si la valeur de code de hash de l'objet à placer est égal à la valeur de code de hash de n'importe quel élément de la collection. S'il n'est pas égal, placez directement l'objet dans la collection. Si les valeurs de code de hash sont égales, utilisez la méthode égale pour déterminer si l'objet à placer est égal à tout objet de la collection. Si le jugement égal n'est pas égal, mettez l'élément directement dans la collection, sinon il ne sera pas placé.
5. La méthode égale utilise si les adresses de mémoire des objets sont égales pour déterminer si les objets sont égaux.
Parce qu'ils sont deux nouveaux objets, les adresses de mémoire des objets ne sont pas égales, donc Stu1.Equals (STU2) est faux.
6. Les threads A et B doivent tous deux obtenir le verrouillage de l'objet O. En supposant que A acquiert le verrou de l'objet O, B attendra que A divulgue le verrou d'O. Si Synchronisé est utilisé, si A ne se libére pas, B attendra qu'il continue et ne peut pas être interrompu. Si Reentrantlock est utilisé, si A ne se libére pas, B peut interrompre l'attente après l'attente assez longtemps et faire d'autres choses.
Reentrantlock acquiert les verrous de trois manières:
a) Lock (), si le verrou est acquis, revenez immédiatement. Si un autre fil maintient le verrou, le fil actuel restera dans un état dormant jusqu'à ce que le verrou est acquis.
b) trylock (), si le verrou est acquis, il reviendra immédiatement, et si un autre thread maintient le verrou, il reviendra faux immédiatement;
c) Trylock (temps d'attente longue, unité de tempsUnit), si le verrou est acquis, il reviendra immédiatement. Si un autre thread maintient le verrou, il attendra le temps donné du paramètre.
Pendant le processus d'attente, si le verrou est acquis, il renvoie vrai, et si le délai d'attente, il revient faux;
d) Lockinterrupablement: si le verrou est acquis, revenez immédiatement. Si le verrouillage n'est pas acquis, le fil actuel est dans un état dormant jusqu'à ce qu'il soit verrouillé.
Ou le thread actuel est interrompu par un autre fil
Synchronisé est implémenté au niveau JVM. Non seulement le verrouillage synchronisé peut être surveillé via certains outils de surveillance, mais des exceptions peuvent également se produire lors de l'exécution du code.
Le JVM libérera automatiquement le verrou, mais il n'est pas possible d'utiliser le verrouillage. Lock est implémenté via le code. Pour s'assurer que la serrure sera libérée, unlock () doit être placée enfin {}
Lorsque la concurrence des ressources n'est pas très féroce, les performances de synchronisées sont meilleures que celles de Reetrantlock. Cependant, lorsque la concurrence des ressources est très féroce, les performances de synchronisées diminueront de dizaines de fois, mais les performances de Reetrantlock peuvent rester normales;
Dans le JDK, les classes suivantes sont principalement utilisées pour implémenter le mécanisme de réflexion Java, qui sont toutes situées dans le package java.lang.reflect:
Classe: représente une classe.
Classe de terrain: une variable de membre représentant une classe (les variables membres sont également appelées attributs d'une classe).
Classe de méthode: une méthode représentant la classe.
Classe de constructeur: représente la méthode du constructeur de la classe.
Classe du tableau: fournit des méthodes statiques pour créer dynamiquement des tableaux et accéder aux éléments du tableau.
Voici quelques exemples pour voir l'application réelle de l'API de réflexion:
1. Obtenez des variables membres, des méthodes membres, des interfaces, des superclasses, des méthodes de constructeur, etc. par le biais de la classe de classe
La méthode getClass () est définie dans la classe java.lang.object, donc pour tout objet Java, le type d'objet peut être obtenu via cette méthode. La classe de classe est une classe de base dans l'API de réflexion, et il a les méthodes suivantes
getName (): Obtenez le nom complet de la classe.
getFields (): Obtenez la propriété du type public de la classe.
getDeclaredFields (): Obtenez toutes les propriétés de la classe.
getMethods (): une méthode pour obtenir le type public de la classe.
getDeclaredMethods (): Obtenez toutes les méthodes de la classe.
GetMethod (nom de chaîne, classe [] ParamètreTypes): obtient une méthode spécifique de la classe, le paramètre de nom spécifie le nom de la méthode, ParamètreTypes Paramètre Spécifie le type de paramètre de la méthode.
getConstructors (): Obtenez le constructeur du type public de la classe.
getConstructor (classe [] ParamètreTypes): obtient le constructeur spécifique de la classe. Le paramètre de paramètre Spécifie le type de paramètre du constructeur.
NewInstance (): Créez un objet de cette classe via le constructeur de la classe sans paramètres.
Étapes pour écrire un réflecteur Java:
1) Vous devez d'abord obtenir l'objet de classe d'une classe
Par exemple:
Classe C1 = test.class; Classe C2 = class.forname ("com.reflection.test"); Classe C3 = nouveau test (). GetClass (); 2) Ensuite, appelez séparément les méthodes de l'objet de classe pour obtenir les propriétés / méthodes / constructeurs d'une classe
Remarque: Si vous souhaitez obtenir normalement des méthodes / propriétés / constructeurs dans la classe, vous devez vous concentrer sur les classes de réflexion suivantes
Champ
Constructeur
Méthode
<servlet-mapping> <servlet-name> </ servlet-name> <url-potern> </ url-potern> </ servlet-mapping> pour (string elementa: str) {System.out.print (élémenta + ""); } List <string> list = new ArrayList <string> (); for (int i = 0; i <str.length; i ++) {if (! list.contains (str [i])) {list.add (str [i]); }} Set <string> set = new HashSet <string> (); for (int i = 0; i <str.length; i ++) {set.add (str [i]); }Spring a six transactions et cinq niveaux d'isolement
Catégorie 1: INTE Short int long
Catégorie 2: Float Double
La troisième catégorie: Boolean logique (il n'a que deux valeurs qui peuvent être jugées vraies fausses)
Catégorie 4: Charac à caractère
Méthodes en classe de modification finale
Fonction: Il peut être hérité, mais il ne peut pas être réécrit après l'héritage.
Classe de modification finale
Fonction: Les classes ne peuvent pas être héritées.
Lors de la modification finale du type de base, la valeur reste inchangée. Le type de référence indique que l'adresse reste inchangée. Autrement dit, lorsque la nouvelle adresse ne peut pas être réaffectée.
Vous connaissez l'attribut de modification final
La préparation est précompilée. Soumettez d'abord le SQL à la base de données pour le prétraitement, puis mettez-le dans le cache. La prochaine fois que vous constaterez qu'il y a la même chose, vous n'avez pas besoin de le compiler. L'efficacité d'exécution est élevée, il existe des invites de syntaxe pour faciliter la vérification et les paramètres sont dynamiques, ce qui empêche l'injection de SQL en raison de la vérification de la syntaxe.
select * from tbname = 'zck' et passwd = 'ou' 1 '=' 1 ';
La déclaration n'est pas précompilée et nécessite une vérification manuelle pour les erreurs de syntaxe, qui est codé en dur
HashMap permet Null comme clé ou valeur d'une entrée, tandis que le hashtable ne fait pas
mettre la méthode
Hashmap effectuera un traitement spécial sur la touche de valeur nul, le mettra toujours dans la position du tableau [0]. Mettez le processus est pour calculer d'abord le hachage, puis calculer la valeur d'index via le hachage et la table.Length, puis mettez la clé à la position du tableau [index]. Lorsque d'autres éléments existent déjà dans le tableau [index], une liste liée sera formée en position de tableau [index], et les éléments nouvellement ajoutés seront placés dans le tableau [index], et les éléments d'origine seront liés au prochain entrée. De cette façon, le problème des conflits de hachage est résolu sous la forme d'une liste liée. Lorsque le nombre d'éléments atteint la valeur critique (facteur de capactiy *), la capacité sera élargie et la longueur du tableau de table devient table.lengle * 2
Obtenir la méthode
De même, lorsque la clé est nul, un traitement spécial sera effectué et l'élément avec la clé est NULL se trouve sur la liste liée du tableau [0].
Le processus de GET consiste à calculer d'abord le hachage, puis à calculer la valeur d'index via le hachage et la table.Length, puis parcourez la liste liée sur la table [index] jusqu'à ce que la clé soit trouvée, puis renvoie l'implémentation sous-jacente de la hashmap et du hashtable est à la fois les implémentations de la structure de la liste liée Array + Linked pour calculer le hachage en premier. L'index, qui est l'indice du tableau de table, est calculé sur la base du hachage et du tableau. Length, est calculé et l'opération correspondante est effectuée.
La plupart des index sont basés sur B-Tree
Les problèmes de sécurité des filetages du servlet sont principalement causés par les variables d'instance, de sorte que les variables d'instance doivent être évitées dans les servlets.
Si la conception de l'application ne peut pas éviter d'utiliser des variables d'instance, la synchronisation est utilisée pour protéger les variables d'instance à utiliser, mais pour les performances optimales du système, le chemin de code avec une disponibilité minimale doit être synchronisé.
Écrivez un modèle singleton
public static long récursif (int n) {if (n <= 0) return 0; if (n == 1) return 1; return récursif (n - 1) + récursif (n - 2);} boucle longue statique publique (int n) {if (n <= 0) return 0; if (n == 1) renvoyer 1; long fib1 = 0; long fib2 = 1; i ++) {sum = fib1 + fib2; fib1 = fib2; fib2 = sum;} return sum;} Hashtable est une classe de file d'attente. Il utilise synchronisé pour verrouiller l'intégralité de la table de hachage pour atteindre la sécurité thread, c'est-à-dire verrouiller toute la table à chaque fois et laisser le fil l'occuper. ConcurrenthashMap permet de réaliser plusieurs opérations de modification simultanément, et la clé est l'utilisation de la technologie de séparation de verrouillage. Il utilise plusieurs verrous pour contrôler les modifications de différentes parties de la table de hachage.
ConcurrentHashMap utilise des segments (segment) pour représenter ces différentes parties. Chaque segment est en fait un petit hachage, et ils ont leurs propres serrures. Tant que plusieurs opérations de modification se produisent sur différents segments, ils peuvent être effectués simultanément.
Certaines méthodes doivent croiser des segments, tels que size () et contientValue (), qui peut avoir besoin de verrouiller l'ensemble du tableau au lieu d'un certain segment. Cela nécessite de verrouiller tous les segments en séquence. Une fois l'opération terminée, les verrous de tous les segments sont libérés en séquence. "Dans l'ordre" est très important ici, sinon il y a une forte possibilité de blocage. Dans ConcurrenthashMap, le tableau de segment est définitif et ses variables membres sont en fait définitivement. Cependant, simplement déclarer le tableau en tant que final ne garantit pas que les membres de la baie sont finaux, ce qui nécessite des garanties de mise en œuvre.
Cela garantit qu'il n'y a pas de blocage, car l'ordre dans lequel les verrous sont obtenus est fixé
① ThreadLocal ② Synchronisé () ③ Wait () et notify () ④ Volatile
Threadlocal
ThreadLocal garantit que différents threads ont des instances différentes et que le même thread doit avoir la même instance, c'est-à-dire que chaque thread utilisant la variable fournit une copie de la valeur de la variable. Chaque fil peut modifier indépendamment sa propre copie, plutôt que de confronter la copie d'autres threads.
Avantages: fournit des objets partagés en filetage
La différence par rapport aux autres mécanismes de synchronisation: le mécanisme de synchronisation consiste à synchroniser un accès simultané à la même ressource par plusieurs threads et à communiquer entre plusieurs threads;
ThreadLocal est un partage de données isolé à partir de plusieurs threads et ne partage fondamentalement pas de ressources entre plusieurs threads. Cela ne nécessite certainement pas que plusieurs threads soient synchronisés.
volatil
La variable de membre modifiée volatile est obligée de relire la valeur de la variable membre à partir de la mémoire partagée chaque fois qu'il est accessible par un thread. et,
Lorsque la variable membre change, le thread est obligé de réécrire la valeur de modification en mémoire partagée.
Avantages: De cette façon, à tout moment, deux threads différents voient toujours la même valeur d'une certaine variable membre.
Raison: La spécification du langage Java indique que pour obtenir la meilleure vitesse, les threads sont autorisés à enregistrer des copies privées des variables de membres partagées.
Et il n'est comparé à la valeur d'origine de la variable membre partagée lorsque le thread entre ou quitte le bloc de code synchrone.
De cette façon, lorsque plusieurs threads interagissent avec un objet en même temps, il est nécessaire de faire attention à permettre au thread d'obtenir des modifications dans les variables de membres partagées en temps opportun.
Le mot-clé volatil invite la machine virtuelle: pour cette variable de membre, il ne peut pas enregistrer sa copie privée, mais doit interagir directement avec la variable de membre partagé.
Conseils d'utilisation: Utilisez des variables de membre volatiles accessibles par deux threads ou plus.
Il n'est pas nécessaire d'utiliser lorsque la variable accessible est déjà dans le bloc de code synchronisé ou est constante.
Afin d'améliorer l'efficacité, un thread copie une variable de membre (comme a) (comme B), et l'accès à A dans le thread accède réellement B. La synchronisation de A et B est effectuée uniquement dans certaines actions, il y a donc une situation où A et B sont incohérents. Volatile est utilisé pour éviter cette situation.
Volatile dit à JVM que les variables qu'il modifie ne conservent pas de copies et accédez directement à celles de la mémoire principale (il est préférable d'utiliser lorsqu'il existe de nombreuses opérations de lecture; la communication est requise entre les threads, mais cet article ne peut pas le faire)
Les variables volatiles ont des propriétés de visibilité synchronisées, mais n'ont pas de propriétés atomiques.
Cela signifie que le thread peut découvrir automatiquement la dernière valeur de la variable volatile. Les variables volatiles peuvent être utilisées pour assurer la sécurité du thread, mais ne peuvent être appliquées qu'à un ensemble très limité de cas d'utilisation: il n'y a pas de contrainte entre plusieurs variables ou entre la valeur actuelle d'une variable et la valeur modifiée.
Vous ne pouvez utiliser que la variable volatile au lieu des verrous dans des cas limités. Pour rendre la variable volatile de sécurité idéale de filetage, les deux conditions suivantes doivent être remplies en même temps:
Les opérations d'écriture en variables ne dépendent pas de la valeur actuelle; La variable n'est pas incluse dans l'invariant avec d'autres variables.
sommeil () vs wait ()
Le sommeil est une classe de thread (thread), qui fait que ce thread interrompt l'exécution pendant une période spécifiée et envoie l'opportunité d'exécution à d'autres threads, mais l'état de surveillance reste et reprendra automatiquement après cela. L'appel de sommeil ne libérera pas le verrouillage de l'objet.
attendre est une méthode de la classe d'objets. L'appel de la méthode d'attente sur cet objet amène le fil à renoncer au verrouillage de l'objet et à entrer le pool de verrouillage d'attente en attendant cet objet. Ce n'est qu'après avoir émis une méthode de notification (ou Notifyall) pour cet objet, ce thread entre dans le pool de verrouillage d'objet et se prépare à obtenir le verrouillage de l'objet et entre dans l'état en cours d'exécution. (Si la variable est déclarée volatile, elle sera cohérente avec la mémoire principale à chaque fois qu'elle est accessible; si la variable est accessible dans une méthode synchrone ou un bloc synchrone, la variable est synchronisée lorsque le verrou est obtenu à l'entrée de la méthode ou du bloc et que le verrouillage est libéré lorsque la méthode ou le bloc sort.)
http://www.yjbys.com/news/202750.html
Le programme client doit d'abord obtenir un rôle de conteneur spécifique, puis obtenir un rôle d'itérateur spécifique via le rôle de conteneur spécifique.
Iterator it = new ArrayList.Iterator ();
1) Accédez au contenu d'un objet de conteneur sans exposer sa représentation interne.
2) Soutenez plusieurs traversées d'objets conteneurs.
3) Fournir une interface unifiée (itération polymorphe) pour traverser différentes structures de conteneurs.
Utilisez le nouveau mot-clé} → le constructeur a été appelé
Utilisez la méthode NewInstance de la classe de classe} → Le constructeur a été appelé
Utilisez la méthode NewInstance de la classe de constructeur} → La fonction du constructeur a été appelée
Utilisation de la méthode de clone} → Aucun constructeur n'est appelé
Utilisation de désérialisation} → Aucun constructeur n'est appelé
Employee Emp2 = (Employee) class.forname ("com.employee"). NewInstance (); ou
Employee EMP2 = Employee.Class.NewInstance (); constructeur constructeur = employee.class.getConstructor (); Employee EMP3 = Constructor.NewInstance ();
En utilisant la méthode de clone, nous devons d'abord implémenter l'interface clonable et implémenter la méthode de clone définie par elle
Employé EMP4 = (employé) EMP3.Clone ();
Lorsque le programme démarre, il ne charge pas tous les fichiers de classe à utiliser par le programme à la fois. Au lieu de cela, il charge dynamiquement un certain fichier de classe en mémoire via le mécanisme de chargement de classe Java (Classloader) en fonction des besoins du programme. Par conséquent, ce n'est qu'après le chargement du fichier de classe dans la mémoire qu'il peut être référencé par d'autres classes. Par conséquent, Classloader est utilisé pour charger dynamiquement les fichiers de classe en mémoire.
Bootstrap classloader: s'appelle le chargeur de classe de démarrage, c'est le chargeur de classe de niveau supérieur dans la hiérarchie de chargement de classe Java, responsable du chargement des bibliothèques de classe de base dans le JDK, telles que: Rt.jar, Resources.jar, Charsets.jar, etc. Java_home / jre / lib / ext / par défaut.
App Classloader: s'appelle un chargeur de classe système, qui est responsable du chargement de tous les pots et fichiers de classe dans le répertoire de ClassPath Application.
Parce que cela peut éviter le chargement répété, lorsque le père a chargé la classe, il n'est pas nécessaire que le chargeur d'enfants le charge à nouveau.
Compte tenu des facteurs de sécurité, imaginons que si nous n'utilisons pas ce mode délégué, nous pouvons remplacer dynamiquement les types définis dans l'API Java Core à tout moment, ce qui représentera un très gros risque de sécurité. La méthode du délégué parent peut éviter cette situation, car la chaîne est déjà chargée par le chargeur de classe de démarrage (bootstrcp classloader) au démarrage, de sorte que le chargeur de classe défini par l'utilisateur ne pourra jamais charger une chaîne écrite par elle-même, sauf si vous modifiez l'algorithme par défaut de la classe de recherche Classloader dans JDK.
1. Demande de demande du client de l'objet, cette demande contiendra des paramètres de la demande GET / POST, et ne peut comprendre que les besoins du client, puis répondre.
2. Les informations pertinentes sur l'objet de réponse répondent aux demandes des clients
3. L'objet Session fait référence à une session entre le client et le serveur, à partir d'une application Web du client vers le serveur jusqu'à ce que le client soit déconnecté du serveur.
4. L'objet Out est une instance de la classe JSPWriter et est un objet couramment utilisé pour sortir du contenu du client.
5. L'objet Page pointe vers la page JSP actuelle elle-même, ce qui ressemble un peu à ce pointeur dans la classe. C'est une instance de la classe java.lang.object
6. L'objet d'application réalise le partage des données entre les utilisateurs et peut stocker les variables globales. Il commence par le démarrage du serveur jusqu'à ce que le serveur s'arrête
7. L'objet Exception est un objet d'exception. Lorsqu'une exception se produit pendant le processus en cours, cet objet est généré.
8. L'objet PageContext donne accès à tous les objets et espaces de noms de la page JSP
9. L'objet config est utilisé par le moteur JSP pour lui transmettre des informations lorsqu'un servlet est initialisé.
JS a une fonction isnan (val) // s'il s'agit d'un nombre, il renvoie faux
Il y a des analyses xmldom, l'analyse de sax
XMLDOM: (XMLDocumentObjectModel) Les performances se détériorent considérablement lors du traitement des fichiers volumineux. Ce problème est causé par la structure de l'arborescence DOM, qui occupe beaucoup de mémoire, et le DOM doit charger l'ensemble du document en mémoire avant d'analyser le fichier, qui convient à un accès aléatoire à XML;
SAX: (SimpleapiForXml) Contrairement à DOM, SAX est une méthode d'analyse XML dirigée par des événements. Il lit les fichiers XML en séquence et ne nécessite pas que l'ensemble du fichier soit chargé immédiatement. Lorsque vous rencontrez un événement comme le début d'un fichier, la fin d'un document ou le début d'une balise et la fin d'une balise, il déclenche un événement où l'utilisateur traite le fichier XML en écrivant du code de traitement dans son événement de rappel, adapté à l'accès séquentiel à XML;
STAX: la différence entre (StreamingapiforXML) et d'autres méthodes est que les applications peuvent gérer XML en tant que flux d'événements, ce qui est meilleur que les autres méthodes en termes de performances et de disponibilité;
thread.getState ()
Ce qui précède sont les questions d'entrevue Java compilées par l'éditeur pour vous. J'espère qu'ils vous seront utiles. Si vous avez des questions, laissez-moi un message. L'éditeur vous répondra à temps!