Mémo de spécification Java
Un mémo personnel que je n'ai pas rédigé avec l'intention de laisser les autres le lire.
Primitive Type
- Il n'y a pas de type numérique non signé
- Utilisez Double.compare au lieu de == pour la virgule flottante pour comparer NaN ou +0.0 à -0.0
Héritage
Exemple d'héritage:
interface Foo {
void bar();
}
class Foo extends Bar implements Foo {
...
}
Héritage multiple
- Contrairement au C ++, plusieurs classes ne peuvent pas être héritées
opérateur
- Contrairement au C ++, la surcharge d'opérateurs n'est pas possible
Remplacer égal
- Mettre en œuvre pour respecter les règles suivantes:
- Réflexif: x.equals (x) est vrai
- Symétrique: x.equals (y) est également vrai uniquement si y.equals (x) est vrai
- Transitive: Si x.equals (y) et y.equals (z) sont vrais, alors x.equals (z) est également vrai
- Cohérent: le résultat de x.equals (y) est inchangé si les informations ne sont pas modifiées.
- Remplacer hashCode
final, finally, finalize
final
- Classe: héritable
- Méthode: ne peut pas être remplacée
- Variable: ne peut pas être modifiée
finally
- Normalement, finally est exécuté quoi que vous fassiez, comme return, continue, break et exception.
- Non exécuté si le thread ou la VM meurt soudainement
- Non exécuté par la sortie System # ou la sortie Runtime #
finalize
- Une méthode que la JVM exécute avant la GCing de l'objet
- Java 9 est obsolète, vous n'avez donc pas à vous en souvenir
Qualificatif
abstract
- Classe: a une méthode abstraite. Je ne peux pas instancier.
- Interface: toutes les interfaces sont implicitement abstraites, vous n'avez donc pas à écrire de résumé.
- Méthode: une méthode qui n'a pas de définition. La classe doit également être abstraite.
protected
- Peut être attribué uniquement aux méthodes et aux variables
- Peut être référencé à partir de la même classe ou sous-classe
private
- Si vous rendez le constructeur privé, vous ne pouvez pas instancier la classe en dehors de cette classe.
- Utilisé pour créer uniquement à partir de méthodes publiques statiques dans le modèle de méthode d'usine.
- L'héritage devient impossible
static
- Méthode: Devenir une méthode de classe
- Variable: devient une variable de classe. Devenez un en classe et accessible par nom de classe
volatile
- En raison de l'environnement multi-thread, il empêche le cache des valeurs de champ entre les threads et empêche les leaders comme le traitement des affectations.
- S'il y a une dépendance à la mise à jour, volatile est insuffisant et vous devez utiliser un bloc synchronisé.
classe
Classe externe
- Une classe qui a une classe interne
- ** Il n'y a pas de statique dans la classe externe **
- ** Private ne peut pas être écrit en classe externe **
- Par défaut, il n'est accessible qu'à partir du même package, et s'il est rendu public, il peut être utilisé à partir d'un autre package.
- Les classes publiques doivent avoir le même nom de fichier
Classe intérieure
- Une classe définie par imbrication dans une classe externe. Peut être utilisé à partir de classes qui ne sont pas des classes externes
- Vous pouvez accéder aux membres de la classe externe en instanciant la classe interne à partir de l'objet de la classe externe.
- ** Les classes internes non statiques ne peuvent pas être instanciées à partir d'un contexte statique **
Classe locale
- Classe définie dans la méthode de la classe externe
- Puisqu'il s'agit d'une sorte de classe interne, les champs et méthodes statiques ne peuvent pas être créés.
classe interne statique
- Le comportement est complètement différent de la classe interne
- Instancier depuis la classe externe, pas depuis l'objet de la classe externe
- Bien sûr, vous ne pouvez pas accéder aux membres non statiques de la classe externe. Accessible si statique
String
- ==: La chaîne ne doit pas être comparée à ==
- +: La concaténation de chaînes Java utilise StringBuilder en interne, donc la concaténation de chaînes avec + est lente.
- length (): ne fonctionne pas comme prévu avec des paires de substitution, car il ne renvoie que le nombre d'unités de code Unicode. utiliser codePointCount
- String # split prend une expression régulière comme une chaîne au lieu d'un modèle
Integer
- Utilisez des méthodes d'usine telles que Integer.valueOf (int) au lieu de constructeurs. Parce que l'instance peut être réutilisée.
Deque
File d'attente à deux extrémités. Puisqu'il implémente l'interface Queue, il peut être utilisé comme Queue, mais Stack est une classe, donc il n'est pas implémenté.
D'autre part, Stack est recommandé dans la documentation Stack, telle que Use Deque over Stack. Si vous avez besoin d'une interface Wind, vous devez utiliser Deque. Stack implémente Vector, qui permet un accès aux index qui semble inutile.
En général, LinkedList a $ O (1) $ pour toutes les opérations, et une implémentation comme ArrayDeque a un pire temps de calcul supplémentaire de $ O (n) $, mais la complexité temporelle pour toutes les opérations est $ O dans l'analyse amortie. (1) Cela devient $.
Classe qui réserve une zone continue du tas
- ByteArrayOutputStream
- Buffered* (BufferedInputStream)
- ArrayList
- String
- StringBuilder
Veillez à ne pas utiliser trop de mémoire
Classe héritée
- Vector => ArrayList
- Stack => LinkedList
- HashMap => Hashtable
- StringBuffer => StringBuffer
Comparaison
Il existe deux manières principales d'implémenter des comparaisons de classes arbitraires.
Comparable.compareTo
class Foo implements Comparable<Foo> {
int key;
public Foo(int key) {
this.key = key;
}
@Override
public int compareTo(Foo f){
return this.key - f.key;
}
}
Collections.sort(fooList);
Collections.sort(fooList, Collections.reverseOrder());
Comparator.compare
class FooComparator implements Comparator<Foo> {
@Override
public int compare(Foo a, Foo b) {
return a.key - b.key;
}
}
Collections.sort(fooList, new FooComparator());
fil
Exemple d'utilisation
class Foo implements Runnable {
public void run() {
while (true) System.out.print(".");
}
}
Foo foo = new Foo();
Thread thread = new Thread(foo);
thread.start();
Classes qui ne sont pas thread-safe
Lorsqu'il y a accès en parallèle, il est nécessaire de gérer avec synchronisé etc.
référence
Il existe les types de références suivants:
- Strong: référence ordinaire
- Faible: références qui sont GC lorsque la référence String est épuisée
- Soft: Contrairement à Weak, il ne disparaît pas toujours, il ne disparaît que lorsque la mémoire est vraiment nécessaire. Cela doit être nettoyé avant que le GC n'obtienne une OutOfMemoryError
- Phantom: Utilisez pour planifier votre finalisation https://qiita.com/yoshi389111/items/66448f9a013eee4be035
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/ref/Reference.html
Generics
- Les classes et méthodes peuvent être génériques
- Le type primitif ne peut pas être un paramètre
- Vous pouvez écrire
? Super Xxx
ou? Etend Xxx
pour définir des paramètres de type borné
- Le type de paramètre ne peut pas être instancié
- Le type de paramètre ne peut pas être utilisé pour les méthodes et variables statiques
D'autres choses que je veux découvrir plus tard
- réflexion d'objet:
Class.forName
etc.
- class loader
- dependency injection