bases de Java
1. Quelle est la différence entre JDK et JRE?
1) JDK: l'abréviation de Java Development Kit, kit de développement java, fournit un environnement de développement et d'exploitation Java.
2) JRE: l'abréviation de Java Runtime Environment, Java Runtime Environment, fournit l'environnement requis pour le fonctionnement de java.
3) Plus précisément, JDK comprend en fait JRE, ainsi que javac, un compilateur pour compiler le code source java, ainsi que de nombreux outils de débogage et d'analyse des programmes java. En termes simples: si vous avez besoin d'exécuter des programmes java, il vous suffit d'installer JRE, si vous avez besoin d'écrire des programmes java, vous devez installer JDK.
2. Quelle est la différence entre == et equals?
L'effet du type de base et du type de référence == est différent, comme indiqué ci-dessous:
• Type de base: comparez si la valeur est la même;
• Type de référence: comparez si la référence est la même;
exemple de code:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true`
Interprétation du code : parce que x et y pointent vers la même référence, == est également vrai, et la nouvelle méthode String () réécrit pour ouvrir de l'espace mémoire, donc le résultat de == est faux, et la comparaison d'égaux est toujours une valeur, donc Les résultats sont tous vrais.
Interprétation de equals :
Equals est essentiellement ==, mais String et Integer réécrivent la méthode equals, la transformant en une comparaison de valeurs. Regardez le code suivant pour comprendre.
Tout d'abord, examinons égaux en comparant un objet avec la même valeur par défaut. Le code est le suivant:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("jack");
Cat c2 = new Cat("jsck");
System.out.println(c1.equals(c2)); // false
Le résultat est au-delà de nos attentes, il s'est avéré être faux? Que se passe-t-il, vous pouvez voir le code source d'égal, le code source est le suivant:
public boolean equals(Object obj) {
return (this == obj);
}
Il s'avère qu'égal est essentiellement ==.
La question est la suivante: pourquoi deux objets String avec la même valeur retournent-ils true? code montrer comme ci-dessous:
String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true
De même, lorsque nous avons entré la méthode equals de String et que nous avons trouvé la réponse, le code est le suivant:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Il s'avère que String réécrit la méthode equals d'Object, en changeant la comparaison de référence en comparaison de valeur.
Résumé : == Pour les types de base, la comparaison de valeurs, pour les types de référence, c'est la comparaison de références; et égal est la comparaison de références par défaut, mais de nombreuses classes ont renouvelé la méthode equals, comme String, Integer, etc. pour la transformer en La comparaison de valeurs, donc en général, égale compare si les valeurs sont égales.
3. Si le hashCode () de deux objets est le même, equals () doit également être vrai, non?
Non, le hashCode () des deux objets est le même et equals () n'est pas nécessairement vrai.
Exemple de code:
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
Résultat de l'exécution:
str1: 1179395 | str2: 1179395 interprétation du code
faux : évidemment, le hashCode () de "call" et "heavy ground" est le même, mais equals () est faux, car dans la table de hachage, hashCode () est égal à deux Les valeurs de hachage des paires clé-valeur sont égales, mais les valeurs de hachage sont égales et les paires clé-valeur ne sont pas nécessairement égales.
4. Quel est le rôle de final en java?
• La classe finale modifiée est appelée la classe finale, qui ne peut pas être héritée.
• La méthode modifiée finale ne peut pas être remplacée.
• La dernière variable modifiée est appelée une constante, la constante doit être initialisée et la valeur ne peut pas être modifiée après l'initialisation.
5. Combien coûte Math.round (-1,5) en java?
Égal à -1, car lors de la prise d'une valeur sur la droite numérique, la valeur intermédiaire (0,5) est arrondie vers la droite, donc positif 0,5 est arrondi vers le haut et moins 0,5 est directement ignoré.
6. String est-il un type de données de base?
String n'est pas un type de base. Il existe 8 types de base: byte, boolean, char, short, int, float, long, double et String est un objet.
7. Quelles sont les classes de chaînes de manipulation en java? Quelle est la différence entre eux?
Les classes pour manipuler les chaînes sont : String, StringBuffer, StringBuilder.
La différence entre String, StringBuffer et StringBuilder est que String déclare des objets immuables. Chaque opération génère un nouvel objet String, puis pointe le pointeur vers le nouvel objet String. StringBuffer et StringBuilder peuvent fonctionner sur la base de l'objet d'origine. Par conséquent, il est préférable de ne pas utiliser String lorsque le contenu d'une chaîne est fréquemment modifié.
La plus grande différence entre StringBuffer et StringBuilder est que StringBuffer est thread-safe, tandis que StringBuilder n'est pas thread-safe, mais StringBuilder a des performances supérieures à StringBuffer, donc StringBuilder est recommandé dans un environnement à thread unique, et StringBuffer est recommandé dans un environnement multi-thread.
8. Est-ce que String str = "i" est identique à String str = new String ("i")?
Pas la même chose , car la méthode d'allocation de mémoire est différente. String str = "i" way, la machine virtuelle java à affecter au pool de constantes dans; et String str = new String ("i ") sera affecté à la mémoire du tas dans.
9. Est-ce que String str = "i" est identique à String str = new String ("i")?
Utilisez la méthode reverse () de StringBuilder ou stringBuffer.
Exemple de code:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
10. Quelles sont les méthodes couramment utilisées de la classe String?
• indexOf (): renvoie l'index du caractère spécifié
• charAt (): renvoie le caractère à l'index spécifié.
• replace (): remplacement de chaîne.
• trim (): supprime les espaces aux deux extrémités de la chaîne.
• split (): divise une chaîne et renvoie un tableau de chaînes fractionnées.
• getBytes (): renvoie un tableau de chaînes de type octet.
• length (): renvoie la longueur de la chaîne.
• toLowerCase (): convertit une chaîne en lettres minuscules.
• toUpperCase (): convertit une chaîne en caractères majuscules.
• substring (): intercepte une chaîne.
• equals (): comparaison de chaînes.
11. Une classe abstraite doit-elle avoir des méthodes abstraites?
Non, les classes abstraites n'ont pas besoin d'avoir des méthodes abstraites.
Exemple de code:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
Dans le code ci-dessus, la classe abstraite n'a pas de méthodes abstraites mais peut s'exécuter normalement.
12. Quelles sont les différences entre les classes ordinaires et abstraites?
• Les classes ordinaires ne peuvent pas contenir de méthodes abstraites et les classes abstraites peuvent contenir des méthodes abstraites.
• Les classes abstraites ne peuvent pas être instanciées directement, les classes ordinaires peuvent être instanciées directement.
13. Les classes abstraites peuvent-elles utiliser la modification finale?
Non , la définition d'une classe abstraite doit être héritée par d'autres classes. Si elle est définie comme final, la classe ne peut pas être héritée. Cela entraînera des conflits entre eux. Par conséquent, final ne peut pas modifier la classe abstraite. Comme le montre la figure ci-dessous, l'éditeur affichera également un message d'erreur:
14. Quelle est la différence entre une interface et une classe abstraite?
• Implémentation : les sous-classes de classes abstraites utilisent des extensions pour hériter, les interfaces doivent utiliser des implémentations pour implémenter des interfaces.
• Constructeur : les classes abstraites peuvent avoir des constructeurs, les interfaces ne le peuvent pas.
• Méthode principale : les classes abstraites peuvent avoir une méthode principale et nous pouvons l'exécuter, les interfaces ne peuvent pas avoir de méthode principale.
• Nombre d'implémentations : une classe peut implémenter plusieurs interfaces, mais ne peut hériter que d'une classe abstraite.
• Modificateur d'accès : les méthodes de l'interface utilisent la modification publique par défaut, les méthodes de la classe abstraite peuvent être n'importe quel modificateur d'accès.
15. Quels sont les types de flux d'E / S en Java?
• Divisé par fonction : flux d'entrée (entrée), flux de sortie (sortie).
• Divisé par type : flux d'octets et flux de caractères.
La différence entre le flux d'octets et le flux de caractères est la suivante : le flux d'octets transfère les données d'entrée et de sortie en octets selon 8 bits, et le flux de caractères transfère les données d'entrée et de sortie en caractères selon 16 bits.
16. Quelle est la différence entre BIO, NIO et AIO?
• BIO : Block IO Le blocage synchrone IO, qui est l'IO traditionnel que nous utilisons habituellement, se caractérise par son mode simple, son utilisation pratique et sa faible capacité de traitement simultané.
• NIO : Le nouveau IO synchrone non bloquant IO est une mise à niveau de l'IO traditionnel Le client et le serveur communiquent via Channel pour réaliser le multiplexage.
• AIO : Asynchronous IO est une mise à niveau de NIO, également appelée NIO2, qui implémente des E / S asynchrones non bloquantes Le fonctionnement des E / S asynchrones est basé sur des événements et des mécanismes de rappel.
17. Quelles sont les méthodes courantes de fichiers?
• Files.exists (): vérifie si le chemin du fichier existe.
• Files.createFile (): crée un fichier.
• Files.createDirectory (): crée un dossier.
• Files.delete (): supprime un fichier ou un répertoire.
• Files.copy (): copie des fichiers.
• Files.move (): déplacer des fichiers.
• Files.size (): affiche le nombre de fichiers.
• Files.read (): lit les fichiers.
• Files.write (): écrit des fichiers.
18. Quels sont les conteneurs Java?
Catalogue des conteneurs couramment utilisés:
19. Quelle est la différence entre Collection et Collections?
• java.util.Collection est une interface de collection (une interface de niveau supérieur de la classe de collection). Il fournit des méthodes d'interface communes pour les opérations de base sur les objets de collection. L'interface Collection a de nombreuses implémentations concrètes dans la bibliothèque de classes Java. La signification de l'interface Collection est de fournir un mode de fonctionnement unifié maximisé pour diverses collections spécifiques, et ses interfaces d'héritage direct sont List et Set.
• Collections est une classe d'outils / classe d'assistance de la classe de collection, qui fournit une série de méthodes statiques pour le tri, la recherche et les opérations thread-safe des éléments de la collection.
20. Quelle est la différence entre List, Set et Map?
21. Quelle est la différence entre HashMap et HashTable?
• HashMap supprime la méthode contains de HashTable, mais ajoute les méthodes containsValue () et containsKey ().
• HashTable est synchronisé, tandis que HashMap est asynchrone, ce qui est plus efficace que HashTable.
• HashMap autorise les valeurs de clé vides, contrairement à HashTable.
22. Comment décider d'utiliser HashMap ou TreeMap?
Pour les opérations telles que l'insertion, la suppression et le positionnement d'éléments dans la carte, HashMap est le meilleur choix. Cependant, si vous devez parcourir un ensemble ordonné de clés, TreeMap est un meilleur choix. En fonction de la taille de votre collection, il peut être plus rapide d'ajouter des éléments au HashMap. Changez la carte en TreeMap pour parcourir les clés ordonnées.
23. Parlez-moi du principe de mise en œuvre de HashMap?
Présentation de HashMap : HashMap est une implémentation asynchrone de l'interface Map basée sur la table de hachage. Cette implémentation fournit toutes les opérations de mappage facultatives et permet l'utilisation de valeurs nulles et de clés nulles. Cette classe ne garantit pas l'ordre du mappage, en particulier elle ne garantit pas que la commande durera éternellement.
Structure de données HashMap : Dans le langage de programmation java, la structure la plus basique est de deux types, l'un est un tableau , l'autre est un pointeur analogique (référence), toutes les structures de données peuvent être construites en utilisant ces deux structures de base, et HashMap est également Pas exception. HashMap est en fait une structure de données de «hachage de liste liée», c'est-à-dire une combinaison de tableau et de liste liée. Lorsque nous mettons un élément dans le HashMap, recalculons d'abord la valeur de hachage en fonction du hashcode de la clé, et obtenons la position (indice) de cet élément dans le tableau en éliminant la valeur de hachage. Si le tableau a déjà stocké d'autres éléments à cette position, alors L'élément à cette position sera stocké sous la forme d'une liste chaînée, le nouvellement ajouté sera placé en tête de la chaîne et le premier ajouté sera placé à la fin de la chaîne. S'il n'y a pas d'élément à cette position dans le tableau, l'élément sera placé directement à cette position du tableau.
L'implémentation de HashMap est optimisée dans JDK 1.8. Lorsque les données de nœud dans la liste liée dépassent huit, la liste liée sera convertie en un arbre rouge-noir pour améliorer l'efficacité des requêtes, de l'O (n) d'origine à O (logn)
24. Parlez-moi du principe de mise en œuvre de HashSet?
• La couche inférieure de HashSet est implémentée par HashMap
• La valeur de HashSet est stockée sur la clé de
HashMap • La valeur de HashMap est unifiée comme PRESENT
25. Quelle est la différence entre ArrayList et LinkedList?
La structure de données sous-jacente d'ArrrayList est un tableau , qui prend en charge l'accès aléatoire.
La structure de données sous-jacente de LinkedList est une liste liée circulaire bidirectionnelle , qui ne prend pas en charge l'accès aléatoire.
En utilisant des indices pour accéder à un élément, la complexité temporelle de ArrayList est O (1), tandis que LinkedList est O (n).
26. Comment réaliser la conversion entre tableau et liste?
• Convert List to Array: appelez la méthode toArray () de ArrayList.
• Convertir un tableau en liste: appelez la méthode asList () de Arrays.
27. Quelle est la différence entre ArrayList et Vector?
Synchronisation: Vector est thread-safe, ce qui signifie que ses méthodes sont synchronisées avec les threads, tandis qu'ArrayList n'est pas thread-safe. Ses méthodes ne sont pas synchronisées avec les threads. S'il n'y a qu'un seul thread pour accéder à la collection, utilisez ArrayList , Il ne considère pas la question de la sécurité des threads, donc l'efficacité sera plus élevée. Si plusieurs threads accèdent à la collection, utilisez Vector
Croissance des données : les collections ArrayList et Vector ont une taille de capacité initiale. Lorsque le nombre d'éléments dépasse la capacité de stockage, l'espace de stockage de ArrayList et Vector doit être augmenté. Chaque augmentation n'est pas une mais plusieurs. Le vecteur est Augmentez deux fois l'original. ArrayList n'est pas spécifié explicitement, mais il ressort du code source qu'ArrayList et Vector peuvent définir la taille de l'espace de stockage initial en augmentant la taille d'origine de 1,5 fois. Vector peut également définir la taille de l'espace de croissance, contrairement à ArrayList.
28. Quelle est la différence entre Array et ArrayList?
• Array peut contenir des types et des objets de base, tandis que ArrayList ne peut contenir que des objets.
• La capacité d'Array est fixe et la capacité d'ArrayList est automatiquement étendue en fonction de la demande.
• ArrayList fournit des méthodes pour ajouter, insérer ou supprimer une plage d'éléments, tandis que dans Array, une seule valeur d'élément peut être obtenue ou définie à la fois
29. Quelle est la différence entre poll () et remove () dans Queue?
Poll () et remove () suppriment un élément de la file d'attente, mais poll () renverra null quand il ne parvient pas à obtenir l'élément, mais il lèvera une exception lorsque remove () échouera.
30. Quelles classes de collection sont thread-safe?
• Vector: il possède un mécanisme de synchronisation de plus (sécurité des threads) que Arraylist En raison de sa faible efficacité, il n'est pas recommandé de l'utiliser maintenant. Dans les applications Web, en particulier la page d'accueil, l'efficacité (vitesse de réponse de la page) est souvent prioritaire.
• Statck: type de pile, premier entré, dernier sorti.
• HashTable: il est plus thread-safe que Hashmap.
• Enumeration: Enumeration, equivalente a iterator.
• Toutes les classes de collection sous le package java.util.concurrent sont ArrayBlockingQueue, ConcurrentHashMap, ConcurrentLinkedQueue, ConcurrentLinkedDeque ...