Ein persönliches Memo, das ich nicht zusammengestellt habe, um andere es lesen zu lassen.
Primitive Type
- Es gibt keinen vorzeichenlosen numerischen Typ
- Verwenden Sie Double.compare anstelle von == für Gleitkommawerte, um NaN oder +0.0 mit -0.0 zu vergleichen
Erbe
Vererbungsbeispiel:
interface Foo {
void bar();
}
class Foo extends Bar implements Foo {
...
}
Mehrfachvererbung
- Im Gegensatz zu C ++ können nicht mehrere Klassen vererbt werden
Operator
- Im Gegensatz zu C ++ ist eine Operatorüberladung nicht möglich
Override ist gleich
- Implementieren Sie, um die folgenden Regeln zu erfüllen:
- Reflexiv: x.equals (x) ist wahr
- Symmetrisch: x.equals (y) ist auch nur wahr, wenn y.equals (x) wahr ist
- Transitiv: Wenn x.equals (y) und y.equals (z) wahr sind, dann ist auch x.equals (z) wahr
- Konsistent: Das Ergebnis von x.equals (y) bleibt unverändert, wenn die Informationen nicht geändert werden.
- HashCode überschreiben
final, finally, finalize
final
- Klasse: Vererbbar
- Methode: Kann nicht überschrieben werden
- Variable: Kann nicht geändert werden
finally
- Normalerweise wird final ausgeführt, egal was Sie tun, z. B. return, continue, break und exception.
- Wird nicht ausgeführt, wenn Thread oder VM plötzlich sterben
- Wird nicht durch System # Exit oder Runtime # Exit ausgeführt
finalize
- Eine Methode, die die JVM vor dem GCing des Objekts ausführt
- Java 9 ist veraltet, sodass Sie sich nicht erinnern müssen
Qualifikation
abstract
- Klasse: Hat eine abstrakte Methode. Ich kann nicht instanziieren.
- Schnittstelle: Alle Schnittstellen sind implizit abstrakt, sodass Sie keine Zusammenfassung schreiben müssen.
- Methode: Eine Methode ohne Definition. Die Klasse muss auch abstrakt sein.
protected
- Kann nur Methoden und Variablen zugewiesen werden
- Kann aus derselben Klasse oder Unterklasse referenziert werden
private
- Wenn Sie den Konstruktor privat machen, können Sie die Klasse außerhalb dieser Klasse nicht instanziieren.
- Wird verwendet, um nur aus statischen öffentlichen Methoden im Factory-Methodenmuster zu erstellen.
- Vererbung wird unmöglich
static
- Methode: Werden Sie eine Klassenmethode
- Variable: Werden Sie eine Klassenvariable. Werden Sie einer in der Klasse und greifen Sie über den Klassennamen zu
volatile
- Aufgrund der Multithread-Umgebung wird der Cache von Feldwerten zwischen Threads verhindert und Führungskräfte wie die Zuweisungsverarbeitung verhindert.
- Wenn eine Abhängigkeit von der Aktualisierung besteht, ist die Flüchtigkeit nicht ausreichend und Sie müssen einen synchronisierten Block verwenden.
Klasse
Externe Klasse
- Eine Klasse, die eine innere Klasse hat
- ** In der äußeren Klasse gibt es keine statische Aufladung **
- ** Privat kann nicht in einer externen Klasse geschrieben werden **
- Standardmäßig kann nur innerhalb desselben Pakets darauf zugegriffen werden. Wenn es veröffentlicht wird, kann es von einem anderen Paket aus verwendet werden.
- Öffentliche Klassen müssen denselben Dateinamen haben
Innere Klasse
- Eine Klasse, die durch Verschachtelung in einer externen Klasse definiert wurde. Kann aus Klassen verwendet werden, die keine externen Klassen sind
- Sie können auf die Mitglieder der äußeren Klasse zugreifen, indem Sie die innere Klasse vom Objekt der äußeren Klasse aus instanziieren.
- ** Nicht statische innere Klassen können nicht aus einem statischen Kontext instanziiert werden **
Lokale Klasse
- Klasse definiert in der Methode der externen Klasse
- Da es sich um eine Art innere Klasse handelt, können keine statischen Felder und Methoden erstellt werden.
statische innere Klasse
- Das Verhalten unterscheidet sich völlig von der inneren Klasse
- Instanziieren Sie von der äußeren Klasse, nicht vom Objekt der äußeren Klasse
- Natürlich können Sie nicht auf nicht statische Mitglieder der äußeren Klasse zugreifen. Kann aufgerufen werden, wenn statisch
String
- ==: String darf nicht mit == verglichen werden
- +: Die Java-String-Verkettung verwendet StringBuilder intern, sodass das Verketten von Strings mit + langsam ist.
- length (): Funktioniert nicht wie erwartet mit Ersatzpaaren, da nur die Anzahl der Unicode-Codeeinheiten zurückgegeben wird. Verwenden Sie codePointCount
- String # split verwendet einen regulären Ausdruck als String anstelle eines Musters
Integer
- Verwenden Sie Factory-Methoden wie Integer.valueOf (int) anstelle von Konstruktoren. Weil die Instanz wiederverwendet werden kann.
Deque
Doppelendige Warteschlange. Da es die Warteschlangenschnittstelle implementiert, kann es als Warteschlange verwendet werden, aber Stack ist eine Klasse, daher wird es nicht implementiert.
Auf der anderen Seite wird Stack in der Stack-Dokumentation empfohlen, z. B. Deque over Stack verwenden. Wenn Sie eine Windschnittstelle benötigen, sollten Sie Deque verwenden. Stack implementiert Vector, wodurch ein Indexzugriff ermöglicht wird, der unnötig erscheint.
Im Allgemeinen hat LinkedList $ O (1) $ für alle Operationen, und eine Implementierung wie ArrayDeque hat eine zusätzliche schlechteste Berechnungszeit von $ O (n) $, aber die Zeitkomplexität für alle Operationen beträgt in der amortisierten Analyse $ O. (1) Es wird $.
Klasse, die einen durchgehenden Bereich des Haufens reserviert
- ByteArrayOutputStream
- Buffered* (BufferedInputStream)
- ArrayList
- String
- StringBuilder
Achten Sie darauf, nicht zu viel Speicher zu verwenden
Legacy-Klasse
- Vector => ArrayList
- Stack => LinkedList
- HashMap => Hashtable
- StringBuffer => StringBuffer
Vergleich
Es gibt zwei Hauptmethoden, um beliebige Klassenvergleiche zu implementieren.
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());
Faden
Anwendungsbeispiel
class Foo implements Runnable {
public void run() {
while (true) System.out.print(".");
}
}
Foo foo = new Foo();
Thread thread = new Thread(foo);
thread.start();
Klassen, die nicht threadsicher sind
Wenn parallel zugegriffen wird, ist es erforderlich, mit synchronisierten usw. zu behandeln.
Referenz
Es gibt folgende Arten von Referenzen:
- Stark: Gewöhnliche Referenz
- Schwach: Referenzen, die GC-fähig sind, wenn die String-Referenz abgelaufen ist
- Weich: Im Gegensatz zu Schwach verschwindet es nicht immer, es verschwindet nur, wenn wirklich Speicher benötigt wird. Dies muss bereinigt werden, bevor der GC einen OutOfMemoryError erhält
- Phantom: Verwenden Sie diese Option, um sich selbst zu finalisieren. Https://qiita.com/yoshi389111/items/66448f9a013eee4be035
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/ref/Reference.html
Generics
- Klassen und Methoden können generisch sein
- Primitiver Typ kann kein Parameter sein
- Sie können "Super Xxx" oder "Erweitert Xxx" schreiben, um begrenzte Typparameter zu definieren
- Parametertyp kann nicht instanziiert werden
- Der Parametertyp kann nicht für statische Methoden und Variablen verwendet werden
Andere Dinge möchte ich später herausfinden
- Objektreflexion:
Class.forName
etc.
- class loader
- dependency injection