Zweck des Artikels
Wir haben den Inhalt der Java Programmer Gold SE 8-Prüfung zusammengefasst.
Es ist für die Nische: "Ich mache schon lange Java, aber ich weiß nicht viel über SE8."
Wie haben Sie diesen Artikel geschrieben?
Neulich habe ich den Java SE 8 Programmer II (1Z0-809) bestanden und den Oracle Certified Java Programmer Gold SE 8 erhalten.
Ich habe es einmal in Java2 erworben, aber es unterschied sich deutlich von dem Wissensstand, den die Welt heute benötigt. Deshalb habe ich mich entschlossen, es erneut zu studieren, um mein Wissen zu aktualisieren. Das Wissen über SE8 wird auch in der Android-Entwicklung immer wichtiger.
Es gibt eine Zusammenfassung des Testbereichs, wenn ich den Test mache, aber ich kann es nicht ertragen, ihn so zu speichern, wie er ist, wenn der Test beendet ist. Deshalb habe ich beschlossen, ihn in Form eines Artikels zu belassen. Ich würde mich sehr freuen, wenn es jemandem nützen würde.
Zusammenfassung der Punkte
Java-Grundlagen
Numerisches Literalpräfix
Das am Anfang der Nummer hinzugefügte Präfix bestimmt die Basisnummer.
- "0b" ... binär
- "0" ... Oktalzahl
- Keine ... Dezimalzahl
- "0x" ... hexadezimal
Timing zum Initialisieren der endgültigen Variablen
Instanzvariablen mit dem endgültigen Modifikator müssen im Konstruktor initialisiert werden
Initialisierungsreihenfolge durch Initialisierer und Konstruktor
Die Verarbeitung im Zusammenhang mit der Objektinitialisierung wird in der folgenden Reihenfolge ausgeführt
- statischer Initialisierer
Beim Laden einer Klasse
- Instanzinitialisierer
Beim Erstellen einer Instanz vor dem Ausführen des Konstruktors
Das Deklarieren einer Variablen führt sie nicht aus. Brauchen Instanziierung
- Konstruktor
Vererbung von Aufzählungswerten und Implementierung der Schnittstelle
- Die Aufzählungsmethoden
name ()
undtoString ()
geben ihre eigene Zeichenfolgendarstellung zurück.
name ()
ist endgültig und kann nicht überschrieben werden. toString ()
ist möglich
- Aufzählungstypen können Schnittstellen implementieren und abstrakte Methoden definieren. Wenn Sie dies tun, müssen Sie jeden Aufzählungswert überschreiben
- Wenn Sie den Aufzählungswert aus einer Zeichenfolge abrufen möchten, können Sie die Methode
valueOf ()
verwenden
Hinweise zu Aufzählungswerten
- Sie können einen Konstruktor für den aufgezählten Wert definieren, die Instanziierung mit new ist jedoch nicht zulässig. Das Hinzufügen von public oder protected zum Konstruktor führt daher zu einem Kompilierungsfehler.
Wenn nichts angehängt ist, wird die Kompilierung bestanden, aber es kann keine neue Kompilierung durchgeführt werden (ein Kompilierungsfehler tritt auf).
- Wenn Sie ein Feld ohne endgültige Deklaration definieren, kann der Wert dieses Feldes jederzeit geändert werden.
enum Direction {
North(0), South(1);
//Wenn Sie nicht final deklarieren, können Sie diesen Wert ändern
int index;
private Direction(int index) { this.index = index; }
}
//Beispiel für das Ändern des Indexfelds Richtung
Direction d = Direction.North;
System.out.println(d.index); // 0
d.index = 10;
System.out.println(d.index); // 10
hashCode () und equals ()
- Die folgenden zwei Bedingungen sind erforderlich, damit mehrere Objekte denselben Wert haben.
- Der Rückgabewert (Hashwert) von "hashCode ()" ist der gleiche
equals ()
ist wahr
- Doppelte Prüfung in der Sammlung ist wie folgt. Wenn beide festgelegt sind, werden sie als der gleiche Wert betrachtet
- Überprüfen Sie, ob die Hashwerte gleich sind
- Vergleichen Sie mit
equals ()
nur für diejenigen mit demselben Hashwert
- Implementieren Sie bei der Implementierung von "hashCode ()", dass Werte von Objekten mit demselben Wert zurückgegeben werden.
- Das Argument von
equals ()
ist Object. Wenn es sich um denselben Typ wie der Empfänger handelt, wird die Übersteuerung nicht hergestellt und die Überlastung wird hergestellt. Kein Kompilierungsfehler
Schnittstellenmethode
- Die in der Schnittstelle definierte Instanzmethode kann eine öffentliche abstrakte Methode sein. Selbst wenn es eine Beschreibung wie abstrakt gibt, wird die Kompilierung bestanden
- In einer Situation, in der für mehrere Schnittstellen die Standardmethode mit demselben Namen definiert ist und beide geerbt oder implementiert werden, tritt die Standardmethode in Konflikt und es tritt ein Kompilierungsfehler auf.
Durch Überschreiben der Standardmethode auf der erbenden oder implementierenden Seite wird der Fehler jedoch behoben.
interface Sample {
// "public abstract"Kompiliert mit oder ohne
public abstract void execute();
}
interface A { default void execute() { System.out.println("A"); } }
interface B { default void execute() { System.out.println("B"); } }
interface C extends A, B {
//Wenn Sie dies nicht kommentieren, wird der Kompilierungsfehler behoben
// default void execute() { System.out.println("C"); }
}
Bedingungen für die Außerkraftsetzung
- Beim Überschreiben einer Methode muss der Rückgabewert mit einer Oberklasse oder einem Unterklassentyp identisch sein
- Die Methodenüberschreibung gilt nur für die folgende Übereinstimmung. Überladung auch wenn die Bestellung nicht übereinstimmt
- Methodenname
- Argumenttyp
- Reihenfolge der Argumente
- statische Methoden und statische Felder können auch in Unterklassen neu definiert werden
Sie können die übergeordnete statische Methode jedoch nicht mit dem Schlüsselwort super aufrufen, da sie eher "versteckt" als überschrieben ist.
Methode lokale Klasse
- Sie können direkt aus der lokalen Klasse der Methode auf die Variablen in der Methode verweisen, die Variablen müssen jedoch praktisch endgültig sein. Selbst wenn keine endgültige Deklaration vorhanden ist, wird sie automatisch als endgültig deklariert, wenn auf sie von der lokalen Klasse der Methode verwiesen wird. Dies gilt auch für Lambda
- Wenn Sie einer methodenlokalen Klasse im Konstruktor eine Methodenvariable zuweisen, müssen Sie diese nicht endgültig festlegen, da auf die ursprüngliche Variable nicht direkt verwiesen wird.
- Wenn Sie von einer lokalen Methodenklasse auf eine Mitgliedsvariable einer Klasse außerhalb der Methode verweisen möchten, können Sie die Mitgliedsvariable ändern.
Lambda-Stil
- Der Argumentdatentyp kann weggelassen werden
- Wenn es ein Argument gibt, kann "()" weggelassen werden
- Wenn sich auf der rechten Seite ein Ausdruck befindet, kann "{}" weggelassen werden, unabhängig davon, ob auf der rechten Seite ein Rückgabewert vorhanden ist.
- Wenn sich auf der rechten Seite ein Ausdruck befindet und ein Rückgabewert zurückgegeben wird, kann die Rückgabe weggelassen werden.
Funktionsschnittstelle
Funktionsbezogen
Schnittstelle |
Methode |
Rückgabetyp |
Function<T, R> |
apply(T t) |
R |
UnaryOperator<T> |
apply(T t) |
T |
BinaryOperator<T> |
apply(T t1, T t2) |
T |
BiFunction<T, U, R> |
apply(T t, U u) |
R |
Verbraucherbezogen
Schnittstelle |
Methode |
Rückgabetyp |
Consumer<T> |
accept(T t) |
void |
BiConsumer<T, U> |
accept(T t, U u) |
void |
Prädikat verwandt
Schnittstelle |
Methode |
Rückgabetyp |
Predicate<T> |
test(T t) |
boolean |
BiPredicate<T, U> |
test(T t, U u) |
boolean |
Supplier
Schnittstelle |
Methode |
Rückgabetyp |
Supplier<T> |
get() |
T |
Funktionsschnittstelle, die primitive Typen akzeptiert
- Jedes von int, long und double hat eine eigene Funktionsschnittstelle.
** Boolean hat auch nur BooleanSupplier **
- Die Methodennamen für "Supplier", "UnaryOperator" und "BinaryOperator" lauten wie folgt.
** Regel: [Methodenname] Als [Datentyp] **
Beispiel:
applyAsInt
, getAsBoolean
usw.
Datentyp |
Function |
Consumer |
Predicate |
Supplier |
UnaryOperator |
BinaryOperator |
int |
IntFunction<R> |
IntConsumer |
IntPredicate |
IntSupplier |
IntUnaryOperator |
IntBinaryOperator |
long |
LongFunction<R> |
LongConsumer |
LongPredicate |
LongSupplier |
LongUnaryOperator |
LongBinaryOperator |
double |
DoubleFunction<R> |
DoubleConsumer |
DoublePredicate |
DoubleSupplier |
DoubleUnaryOperator |
DoubleBinaryOperator |
boolean |
- |
- |
- |
BooleanSupplier |
- |
- |
Funktionsschnittstelle, die einen primitiven Typ zurückgibt
Name der Schnittstelle |
Methode |
Erläuterung |
ToIntFunction<T> |
applyAsInt(T t) |
Gibt int von einem T-Typ-Wert zurück |
ToIntBiFunction<T, U> |
applyAsInt(T t, U u) |
Gibt int von T- und U-Werten zurück |
ToLongFunction<T> |
applyAsLong(T t) |
Gibt lange von einem T-Wert zurück |
ToLongBiFunction<T, U> |
applyAsLong(T t, U u) |
Gibt lange von T- und U-Werten zurück |
ToDoubleFunction<T> |
applyAsDouble(T t) |
Gibt ein Double von einem T-Wert zurück |
ToDoubleBiFunction<T, U> |
applyAsDouble(T t, U u) |
Gibt das Doppelte von T- und U-Werten zurück |
Methodenreferenz
- Kann nur innerhalb einer funktionalen Schnittstelle verwendet werden
- Wenn Sie ein Argument verwenden, schreiben Sie es wie eine statische Methodenreferenz.
Sammlung
Arrays#asList
- Die von
Arrays # asList
generierte Liste bezieht sich nur auf das im Argument angegebene Array. Am ursprünglichen Array vorgenommene Änderungen werden auch in der Liste berücksichtigt
- Die von
Arrays # asList
generierte Liste ist ** nicht kompatibel mit ArrayList <E>
. ** Besetzung schlägt fehl
Die Art der Sammlungsklasse und wie man sie unterscheidet
List
ist im Prinzip die Reihenfolge des Index
Set
und Map
unterscheiden ihre Eigenschaften durch das Präfix des Klassennamens
- Klassen, die mit "Verknüpft" beginnen, werden in derselben Reihenfolge eingefügt
- Klassen, die mit "Baum" beginnen, sind nach natürlicher Reihenfolge sortiert. In natürlicher Reihenfolge wird es zu ** Zahl → Alphabet (groß) → Alphabet (klein) **
Die Art der Warteschlangenschnittstelle
- Es gibt zwei Arten von Einfüge- / Lösch- / Überprüfungsmethoden, und das Verhalten, wenn die Methodenausführung fehlschlägt, ist unterschiedlich.
- Ausnahme aufgetreten
- Einfügen ...
add (E)
- Entfernen ...
remove ()
- Inspektion…
get ()
- Null zurückgeben
- Einfügen ...
Angebot (E)
- Löschen ...
poll ()
- Inspektion…
peek ()
- Unzugängliches Element nach Index
Die Art der Deque-Schnittstelle
- Der Unterschied zu "Queue" besteht darin, dass Sie Elemente am Anfang oder Ende einfügen oder löschen können, wie der Name von "Double Ended Queue" andeutet.
- Ausnahme aufgetreten
- Fügen Sie ...
addFirst (E)
, push (E)
/ addLast (E)
ein
- Löschen ...
removeFirst ()
/ removeLast ()
- Inspektion…
getFirst ()
, pop ()
/ getLast ()
- Null zurückgeben
- Einfügen ...
OfferFirst (E)
/ OffsetLast (E)
- Löschen ...
pollFirst ()
/ pollLast ()
- Inspektion…
peekFirst ()
/ peekLast ()
- Wie bei "Queue" kann auf das Element nicht über den Index zugegriffen werden
- Die Schnittstellenerweiterung "Queue" im Paket "java.util.concurrent" enthält auch eine Methode, mit der Sie ein Zeitlimit festlegen können.
Warten tritt nicht immer auf, und Warten tritt auf, wenn Sie nicht einfügen oder löschen können
- Sie können in
ArrayDeque
, einer Implementierung von Deque
, keine Null setzen
Generika
Generika und Typparameter
- Wenn Sie einen Typparameter für eine Klasse deklarieren, kann der Typparameter nicht für folgende Zwecke verwendet werden:
- statisches Mitglied
- Generieren von Instanzen und Arrays mit dem neuen Operator
- Typüberprüfung mit
instanceof
- Verweis auf
.class
- Der Typ kann angegeben werden oder nicht, wenn eine Methode verwendet wird, auf die ein Typparameter angewendet wird.
- Die generische Typensyntax lautet wie folgt
** Klassenklassenname <Typparameter (, Typparameter n)> {...} **
- Wenn Sie Typparameter in Klassendeklarationen verwenden, können Sie das Schlüsselwort extens, aber nicht das Schlüsselwort super verwenden
- Die Syntax der Methode lautet wie folgt
Deklaration: ** Rückgabetyp Methodenname (Typargumentname) {...} **
Verwendung: ** Empfänger. Methodenname (Typargumentname) {...} **
Platzhalter
- Platzhalter sind
"? "
(" * "
Ist Kotlin) anstelle von"*"
- Platzhalter können nicht für Typparameter in Klassendeklarationen verwendet werden
- Da der Platzhaltertyp erst nach seiner Ausführung festgelegt wird, führt das Hinzufügen des Datentyps zur angegebenen Liste mithilfe des Platzhalters zu einem Kompilierungsfehler.
Die Ausnahme ist, dass die mit "<? Super XXXXX>" deklarierte Liste Objekte des gleichen Typs wie XXXXX enthalten kann.
- Bei Verwendung von Platzhaltern tritt kein Kompilierungsfehler auf, es sei denn, es liegt ein Problem innerhalb des Bereichs vor, das anhand des deklarierten Inhalts beurteilt werden kann. Kompilierungsfehler, wenn klar wird, dass die Typen nicht kompatibel sind
Wo ein Kompilierungsfehler auftritt, wenn Platzhalter für Typparameter verwendet werden
- Wenn Sie Platzhalter für Typparameter verwenden, wird bei ** ein Kompilierungsfehler angezeigt, bei dem Sie das Objekt tatsächlich hinzufügen **
Vergleichbar und Komparator
Vergleichbare -Schnittstelle
- Gehört zum Paket "java.lang"
- Schnittstelle zu vergleichen
- Die einzige Methode, die in
Comparable
implementiert werden sollte, ist compareTo (To)
. Gibt einen negativen Wert zurück, wenn er kleiner als der Vergleichspartner ist, Null, wenn er gleich ist, und einen positiven Wert, wenn er größer ist.
- Beim Deklarieren einer Klasse erhält der Typparameter von "Comparable " den Typ des Objekts, das "compareTo" als Argument verwendet.
Komparator -Schnittstelle
- Gehört zum Paket "java.util"
- Schnittstelle zum Vergleich. Beachten Sie, dass das Vergleichsziel nicht auf diejenigen beschränkt ist, die die Schnittstelle "Vergleichbar" implementieren.
- Die folgenden zwei Methoden sollten in
Comparator
implementiert werden ( equals
ist optional)
compare(T t1, T t2)
equals(T o)
compare (T t1, T t2)
gibt einen positiven Wert zurück, wenn t1 größer als t2 ist, Null, wenn t1 und t2 gleich sind, und einen negativen Wert, wenn t1 kleiner als t2 ist.
Stream API
Generieren Sie einen Stream mit einer endlichen Anzahl von Elementen
Collection#stream()
-> Stream<E>
Arrays#stream(E[] array)
-> Stream<E>
Arrays#stream(int[] array)
-> IntStream
Arrays#stream(long[] array)
-> LongStream
Arrays#stream(double[] array)
-> DoubleStream
Stream#of(E… values)
-> Stream<E>
Stream#empty()
-> Stream<E>
IntStream#of(int… values)
-> IntStream
LongStream#of(long… values)
-> LongStream
DoubleStream#of(double… values)
-> DoubleStream
IntStream#range()
/ IntStream#rangeClosed()
-> IntStream
LongStream#range()
/ LongStream#rangeClosed()
-> LongStream
BufferedReader#lines()
-> Stream<String>
java.nio.file.Files#lines()
-> Stream<String>
Generieren Sie einen Stream mit unendlich vielen Elementen
Beide Methoden von java.util.stream.Stream
generate(Supplier<T> supplier)
Generieren Sie einen Stream, der unendlich viele vom Lieferanten bereitgestellte Elemente enthält
iterate(T seed, UnaryOperator<T> f)
Seed ist das erste Element und erzeugt danach einen Stream, der das vorherige Element multipliziert mit f auf unbestimmte Zeit enthält.
Stream-Beendigungsoperation
- Nur eine Beendigungsoperation für denselben Stream. Wenn Sie dies mehrmals tun, erhalten Sie eine "IllegalStateException"
- Es wird nichts getan, indem nur die Zwischenoperation aufgerufen wird. Es wird nichts getan, es sei denn, die Beendigungsoperation wird aufgerufen. Die gesamte Verarbeitung wird ausgeführt, wenn die Beendigungsoperation aufgerufen wird
- Bei der Pipeline-Verarbeitung werden alle Zwischen- / Beendigungsoperationen einzeln im Stream ausgeführt, und dann wird das nächste Element verarbeitet.
Mit anderen Worten, ** "Zwischenbetrieb von Element 1 x m-> Abbruchbetrieb von Element 1" ⇒ "Zwischenbetrieb von Element 2 x m-> Abbruchbetrieb von Element 2" ⇒ ... ⇒ "Zwischenbetrieb von Element n x m-> Abbruch von Element n" Operation "**
Stream # Rückgabewert reduzieren
Stream # redu
ist eine Methode zum Aggregieren des Inhalts von Stream
. In der Methode, die den Anfangswert im ersten Argument festlegt, ist der Rückgabewert nicht "Optional"
redu (BinaryOperator op)
… Der Rückgabewert ist Optional <T>
redu (T initial, BinaryOperator op)
… Der Rückgabewert ist T.
Abbruchoperation mit optionalem Rückgabewert
- Der Rückgabewert ist bei den folgenden Methoden "Optional"
findAny ()
… Die Ergebnisse können sich bei jeder Ausführung ändern
findFirst ()
… Das gleiche Ergebnis kann erzielt werden, egal wie oft es ausgeführt wird.
min()
max()
reduce(BinaryOperator op)
- Die Art von "Optional" unterscheidet sich je nach Art von "Stream". Zum Beispiel lautet
findAny ()
wie folgt
Stream#findAny()
… Optional<T>
IntStream#findAny()
… OptionalInt
LongStream#findAny()
… OptionalLong
DoubleStream#findAny()
… OptionalDouble
Erstellen Sie eine Instanz von Optional
Optionale Anzahl von (T-Wert)
… Wert kann nicht null sein
Optional # ofNullable (T-Wert)
… Wert kann null sein
OptionalInt#of(int value)
OptionalLong#of(long value)
OptionalDouble#of(double value)
Optional # ifPresent und Optional # isPresent
- Es gibt zwei Methoden, um festzustellen, ob ein Wert vorhanden ist (null oder nicht null):
isPresent ()
… Bestimmt das Vorhandensein oder Fehlen eines Wertes
ifPresent (Consumer)
… Führen Sie Consumer
aus, wenn ein Wert vorhanden ist
Es gibt mehrere Methoden zum Abrufen eines Werts aus Optional
Die Methode zum Abrufen des Werts von "Optional " lautet wie folgt. Wenn ein Wert vorhanden ist, wird dieser Wert erhalten, aber wenn er nicht vorhanden ist, ist das Verhalten anders.
get()
NoSuchElementException
wenn es nicht existiert
orElse(T)
Gibt ein Argument zurück, wenn es nicht vorhanden ist
orElseGet(Supplier<T>)
Gibt den von "Lieferant" zurückgegebenen Wert zurück, falls er nicht vorhanden ist
orElseThrow(Supplier<X extends Exception>)
Löst eine vom Lieferanten zurückgegebene Ausnahme aus, wenn sie nicht vorhanden ist
Optionale Typen, die für einen bestimmten Datentyp spezifisch sind
Die Methode zum Abrufen der zugehörigen Klasse und des Werts von "Optional " lautet wie folgt
Optional<T>#get()
OptionalInt#getAsInt()
OptionalLong#getAsLong()
OptionalDouble#getAsDouble()
Typkonvertierung zwischen Stream und XXXStream
- Die Konvertierung zwischen denselben "Stream" -Typen ist "map ()"
- Die Konvertierung in den Typ "Stream " ist "mapToObj ()"
- Die Konvertierung in den Typ "IntStream" ist "mapToInt ()"
- Die Konvertierung in den Typ "LongStream" ist "mapToLong ()"
- Die Konvertierung in den Typ "DoubleStream" ist "mapToDouble ()"
Stream # collect () -Methode und Collector-Klasse
collect ()
ist eine Methode, die die Elemente in Stream
aggregiert, um ein Objekt zu erhalten.
- Die Klasse "Collectors" bietet eine geeignete Implementierung der Schnittstelle "Collector".
Aufgrund seiner Natur überschneiden sich einige Methoden und Rollen der "Stream" -Klasse.
Ausnahme
Error、Exception、 RuntimeException
- Alle Unterklassen von "Throwable" und gehören zum "java.lang" -Paket
Error
und Exception
sind Unterklassen von Throwable
RuntimeException
ist eine Unterklasse von Exception
(ein Nachkomme von Throwable
)
- Nur Unterklassen von "Ausnahme" außer "RuntimeException" sind geprüfte Ausnahmen, die "try ~ catch" erfordern.
Befehl, Ausnahmen zu fangen
- Ausnahmen sollten in der Reihenfolge der Unterklasse abgefangen werden
- Fangen Sie eine Oberklasse ab, bevor eine Unterklasse zu einem Kompilierungsfehler führt
- Kein Laufzeitfehler
Ausnahme Multi-Catch
- Kompilierungsfehler beim gleichzeitigen Abfangen mehrerer geerbter Ausnahmen
- Das Ausnahmeobjekt, wenn es mehrfach abgefangen wird, wird implizit als endgültig behandelt und kann nicht neu zugewiesen werden.
Wenn es sich nicht um einen Mehrfachfang handelt, wird es nicht als endgültig behandelt
Ausnahme neu werfen
- Wenn eine Methode mehrere Arten von Ausnahmeobjekten abfängt und erneut auslöst, müssen die Ausnahmen der Methoden "throw" und "catch" nicht übereinstimmen.
- Wenn Sie die übergeordnete Klasse aller möglichen Ausnahmen mit catch aufnehmen und so werfen, wie sie ist usw.
//In SE7 und höher können Sie zwei Ausnahmen zusammen abfangen.
//IllegalAccessException und ArighmeticException anstelle von Exception werden von der Ausführung ausgelöst
private void execute(int number) throws IllegalAccessException, ArithmeticException {
try {
switch (number) {
case 1:
throw new IllegalAccessException();
case 2:
throw new ArithmeticException();
default:
System.out.println("No exception");
}
} catch (Exception e) {
throw e;
}
}
Überschreiben Sie die Methode, die die Ausnahme auslöst
- Wenn Sie eine Methode mit einer "Throws" -Deklaration in einer Unterklasse überschreiben, liegt es an Ihnen, die überschriebene Methode "Throws" zu deklarieren.
- Die Ausnahme für das Deklarieren von "Würfen" in einer überschriebenen Methode muss mit der ursprünglichen Methode oder einer Unterklasse der ursprünglichen Methode identisch sein.
RuntimeException
und seine Unterklassen können bedingungslos in throw
angegeben werden. Da es sich jedoch um eine nicht aktivierte Ausnahme handelt, wird sie kompiliert, ohne den Anrufer zu erreichen.
Versuchen Sie ~ mit ~ Ressourcenanweisung
- Kann alleine mit
try
nur in try ~ with ~ resources
Anweisung verwendet werden
- Die zu verwendende Ressource muss "java.lang.AutoCloseable" oder deren Subschnittstelle "java.io.Closeable" implementieren.
- Beide "AutoCloseable" / "Closeable" haben eine "Throws" -Deklaration in "close ()". Unabhängig davon, ob Sie sie für eine Ressource oder in "try" verwenden, müssen Sie eine Ausnahme abfangen, um einen Kompilierungsfehler zu erhalten.
AutoCloseable#close() throws Exception
Closeable#close() throws IOException
- Wenn eine Ausnahme mit
close ()
von AutoCloseable
oder Closeable
auftritt, wird sie von catch abgefangen.
- Wenn eine Ausnahme sowohl im
try
-Block als auch beim Schließen der Ressource auftritt, wird die durch close ()
ausgelöste Ausnahme im Ausnahmeobjekt gespeichert, das als unterdrückte Ausnahme in einem Array von Throwable
und getSuppressed ( Kann mit)
erhalten werden
- Die Ausführungsreihenfolge, wenn eine Ausnahme in der Anweisung "try ~ with ~ resources" auftritt, lautet wie folgt
try
block
- Schließen Sie die Ressourcen in umgekehrter Reihenfolge der Deklaration (der folgende Code wird in der Reihenfolge von N bis 1 geschlossen).
- Block fangen
endlich
blockieren
// (1) ->Schließen Sie in der Reihenfolge von Ressource N bis 1() -> (2) -> (3)In der Reihenfolge ausführen
try (Resource1; Resource2; ...; ResourceN) {
(1)
} catch (Exception e) {
(2)
// getSuppressed()Sie können ein Throwable-Array mit nehmen
for (Throwable th : e.getSuppressed()) { ... }
} finally {
(3)
}
Behauptungen und wie man sie benutzt
- Assertion ist eine Funktion, die "AssertionError" auslöst, wenn in der "assert" -Anweisung false erkannt wird. Die Syntax lautet wie folgt.
booleschen Ausdruck bestätigen: Fehlermeldung;
- Boolesche Ausdrücke können in Klammern stehen oder nicht
- Fehlermeldung kann weggelassen werden
- Angriffe sind standardmäßig deaktiviert. AssertError wird nur ausgelöst, wenn Sie die Option "-ea" (kurz für "enable assertion"?) Im Java-Befehl explizit angeben.
- Um es explizit zu deaktivieren, geben Sie die Option "-da" (kurz für "Assertion deaktivieren"?) Mit dem Java-Befehl an.
- Wenn Sie angeben möchten, dass es das Ziel der Zusicherung ist, geben Sie das Ziel der Zusicherung als "java -ea: [Klassenname]" an, getrennt durch einen Doppelpunkt (wenn es -da ist, ist es nicht das Ziel).
Date and Time API
Klassenliste
LocalDate
… Datum
LocalTime
… Zeit
LocalDateTime
… Datum + Uhrzeit
OffsetTime
… Zeit einschließlich der Differenz von UTC / GMT in“ + hh: mm ”
OffsetDateTime
… Datum und Uhrzeit einschließlich der Differenz zu UTC / GMT in„ + hh: mm “
ZonedDateTime
… Datum + Uhrzeit einschließlich der Differenz von UTC / GMT in der Zeitzonen-ID
- Alle implementieren die temporäre Schnittstelle. Darüber hinaus ist seine Super-Schnittstelle "TemporalAccessor"
- Der Unterschied zwischen "Local ~", "Offset ~" und "Zoned ~" ist der Unterschied in der Methode zum Ausdrücken des gleichen Datums und der gleichen Uhrzeit.
- Kann mit "LocalDateTime # toLocalDate ()" und "LocalDateTime # toLocalTime ()" in jedes konvertiert werden
- Zwei Methoden können den Monat erhalten
getMonth ()
… Month
Get by enumeration value
getMonthValue ()
… Get by int value
Liste der Aufzählungstypen
Monat
: Repräsentiert den Monat
JANUARY
, FEBRUARY
, MARCH
, …, DECEMBER
DayOfWeek
: Repräsentiert den Tag
SUNDAY
, MONDAY
, TUESDAY
, …, SATURDAY
Instanziierung von LocalDate / LocalTime / LocalDateTime
now()
of(year, month, dayOfMonth, ...)
Erstellen Sie eine Instanz mit einem Wert, der von jeder Klasse als Argument behandelt werden kann
Sie können das Argument Monat auf den Aufzählungswert "Monat" anstelle einer Ganzzahl setzen.
Nur "LocalDateTime" hat eine Überladung, die "LocalDate" und "LocalTime" als Argumente verwendet. Es kann Jahr, Monat, Tag, Stunde, Minute, Sekunde, Millisekunde als Argumente dauern
parse(String)
、parse(String, DateTimeFormatter)
Generieren Sie eine Instanz aus einer Zeichenfolge
Wenn Sie "DateTimeFormatter" zusammen verwenden, können Sie eine beliebige Formatzeichenfolge verwenden.
Überladung von LocalDate # of und LocalTime # of
LocalDate # of
hat zwei Überladungsmethoden. In beiden Fällen wird das Datum angegeben, die anderen Unterschiede sind jedoch wie folgt.
- Das zweite Argument ist int
- Das zweite Argument ist der Aufzählungswert "Monat"
LocalTime # of
verfügt über drei Überladungsmethoden, die alle Stunde und Minute angeben. Die anderen Unterschiede sind jedoch wie folgt:
- Nur Stunden
- Geben Sie zusätzlich zu Stunden und Minuten Sekunden an
- Geben Sie zusätzlich zu Stunden und Minuten Sekunden und Nanosekunden an
java.time.format.DateTimeFormatter
ofPattern(String)
Geben Sie das Formatmuster an
ofLocalizedDate(FormatStyle)
Geben Sie die Datumsformatmethode an
ofLocalizedTime(FormatStyle)
Geben Sie die Zeitformatmethode an
ofLocalizedDateTime(FormatStyle)
Geben Sie die Datums- und Uhrzeitformatmethode an
ofLocalizedDateTime(FormatStyle, FormatStyle)
Geben Sie die Datums- und Uhrzeitformatmethode für Datum und Uhrzeit separat an
- statischer vordefinierter Formatierer
BASIC_ISO_DATE
etc.
java.time.format.FormatStyle
Es gibt 4 Arten von FormatStyle
FormatStyle.FULL
Vollformat einschließlich Zeitzone. Ausnahme zur Laufzeit bei Anwendung auf LocalDateTime usw. ohne Zoneninformationen
FormatStyle.LONG
Prägnantes Format einschließlich Zeitzone. Ausnahme zur Laufzeit bei Anwendung auf LocalDateTime usw. ohne Zoneninformationen
FormatStyle.MEDIUM
Prägnantes Format ohne Zeitzone
FormatStyle.SHORT
Prägnante Formatierung von Datum und Uhrzeit ohne Zeitzone
LocalDateTime dateTime = LocalDateTime.of(2020, 8, 14, 9, 54, 30);
ZonedDateTime zDateTime =
ZonedDateTime.of(dateTime, ZoneId.systemDefault());
// FormatStyle.VOLL… “14. August 2020 9:54:30”
println(fmt1.format(zDateTime));
// FormatStyle.LONG … 『2020/08/14 9:54:30 JST』
println(fmt2.format(zDateTime));
// FormatStyle.MEDIUM … 『2020/08/14 9:54:30』
println(fmt3.format(dateTime));
// FormatStyle.SHORT … 『20/08/14 9:54』
println(fmt4.format(dateTime));
Zeichenfolge für das Datums- und Uhrzeit-API-Format
- "y" ... Jahr
- "M" ... Monat (Kapital)
- "d" ... Tag
- "H" ... Stunde (oberes Kapital)
- "m" ... Minuten
- "s" ... Sekunden
- "S" ... Millisekunde (Hauptstadt)
- "n" ... Nanosekunden
Addition / Subtraktion von Datum / Uhrzeit
Add ... plus (Zeitbetrag ToAdd)
Subtrahieren… minus (zeitlicher Betrag zum Subtrahieren)
Period
und Duration
implementieren die TemporalAmount
-Schnittstelle
- Addition und Subtraktion zu einzelnen Feldern wie "plusYears" und "plusWeeks" sind möglich. Wenn Sie jedoch mehrere Felder gleichzeitig bearbeiten, rufen Sie plus mit "Period" und "Duration" als Argumenten auf.
Sommerzeit
- Das Startdatum der Anwendung (Datum, um die Uhrzeit vorzuverlegen) und das Enddatum der Bewerbung (Datum, um die Uhrzeit zurückzugeben) der Sommerzeit unterscheiden sich jedes Jahr, selbst in demselben Gebiet. Die Zeit ist jedoch auf 02:00 Uhr festgelegt
- Wenn die Anwendung gestartet wird, wird der Offset um 1 Stunde reduziert und die Zeit um 1 Stunde verlängert.
Es wird 03:00 eine Minute nach 01:59 sein, da es eine Stunde von 02:00 vorrücken wird.
Wenn Sie am Startdatum der Anwendung das Intervall zwischen 01:00 und 03:00 Uhr einhalten, beträgt es 1 Stunde anstelle von 2 Stunden.
- Wenn die Anwendung beendet ist, erhöht sich der Versatz um 1 Stunde und die Zeit kehrt um 1 Stunde zurück.
Es wird 01:00 eine Minute nach 01:59 sein, da es eine Stunde ab 02:00 zurückkehren wird.
Zeitraum: Datum
- Der Punktausdruck mit
toString ()
ist ** "P00Y00M00D" **
Das führende "P" ist eine Abkürzung für "Periode"
- Es gibt verschiedene Möglichkeiten, eine Instanz von "Punkt" zu erstellen
- Nehmen Sie den Unterschied zwischen zwei "LocalDate" und "LocalDateTime" mit der "Between" -Methode
- Erstellt durch die ofXXXXX-Methode wie "ofYears (1)". Eine Methodenkette ist jedoch nicht möglich
Periode
kann nach Jahr, Monat, Tag oder Woche addiert oder subtrahiert werden
Die Additions- / Subtraktionsmethode ist plusXXXXX / minusXXXXX. plusYears (1)
etc.
Wenn Sie die Wochen mit "plusWeeks (3)" addieren, erhalten Sie "P21D". Weil es für die Woche keinen "Punkt" -Ausdruck gibt
LocalDate
/ LocalDateTime
kann Datumsangaben mit Period
als Argument in der Methode plus
/ minus
hinzufügen oder entfernen.
//Addition von Jahren mit Periode
LocalDateTime dt = LocalDateTime.now();
Period p = Period.ofYears(1);
//Dies entspricht den folgenden zwei Zeilen (Methodenkette ist bedeutungslos)
// Period p1 = Period.ofDays(1);
// Period p = Period.ofYears(2);
Period p = Period.ofDays(1).ofYears(2);
Dauer: Stunde, Minute und Sekunde
- Der Ausdruck "Dauer" von "toString ()" ist ** "PT00H00M00S" **
Das führende "PT" ist eine Abkürzung für "Period of Time".
- Es gibt verschiedene Möglichkeiten, eine Instanz von "Duration" zu erstellen
- Nehmen Sie den Unterschied zwischen zwei "LocalDateTime" und "LocalTime" mit der "Between" -Methode
- Erstellt durch die ofXXXXX-Methode wie "ofHours (1)"
- Erstellt mit
ChromeUnit
in Methoden wie of (1, ChronoUnit.HOURS)
- "Dauer" kann in Tagen, Stunden, Minuten, Sekunden, Millisekunden, Nanosekunden addiert oder subtrahiert werden
Wenn die Tage hinzugefügt werden, wird es zu PT24H, und wenn es weniger als eine Millisekunde beträgt, wird es zu PT0.13S.
LocalTime
/ LocalDateTime
kann Stunden, Minuten und Sekunden mit Duration
als Argument in der Plus
/ Minus
-Methode addieren oder subtrahieren.
java.time.Instant
- Klasse, die den Verlauf der Epoche ausdrückt
- Es gibt verschiedene Möglichkeiten, eine Instanz zu erstellen
Instant#now()
Instant#ofEposSecond(long)
Instant#ofEpocMilli(long)
LocalDateTime#toInstant(ZoneOffset)
ZonedDateTime#toInstant()
LocalDateTime # toInstant
erfordert ZoneOffset
, da LocalDateTime
keine Zeitzoneninformationen enthält.
- Die Zeitzone von "Instant" ist immer UTC
Input-Output
Lesen mit java.io.Reader
Reader
public int read()
Gibt das gelesene Zeichen zurück. Wenn Sie das Ende erreichen ** - 1 **
public int read(char[] buffer)
public int read(char[] buffer, int offset, int length)
Gibt die Anzahl der Zeichen zurück, indem die gelesenen Zeichen in einen Teil oder das gesamte Array eingefügt werden. Wenn Sie das Ende erreichen ** - 1 **
BufferedReader
public String readLine()
Gibt die gelesene Textzeile zurück. ** null ** am Ende
Schreiben mit java.io.Writer
Writer
public void write(char[] buffer)
public void write(char[] buffer, int offset, int length)
Schreiben Sie einen Teil oder das gesamte Array
public void write(int c)
Schreiben Sie ein Zeichen
public void write(String str)
public void write(String str, int offset, int length)
Schreiben Sie einen Teil oder die gesamte Zeichenfolge
BufferedWriter
public void newLine()
Schreiben Sie ein Zeilenvorschubzeichen
Lesen Sie die Positionssteuerung von java.io.Reader und java.io.InputStream
skip(long bytes)
Überspringt die angegebene Anzahl von Bytes von der aktuellen Position
mark(int readAheadLimit)
Markieren Sie die aktuelle Position, damit Sie mit reset ()
zurückkehren können. Das Argument ist ** die Obergrenze der Anzahl der Zeichen, die unter Beibehaltung der Markierung gelesen werden können **
reset()
Kehren Sie zu der Position zurück, an der mark ()
ausgeführt wurde
//Der Inhalt der Datei"01234567"
//Das Ausführungsergebnis ist"025676"
try (BufferedReader br =
new BufferedReader(new FileReader("sample.txt"))) {
for (int i = 0; i < 3; i++) {
br.skip(i); //Überspringe i Bytes
System.out.print((char)br.read());
}
br.mark(3); //gegenwärtiger Ort("6"INDEX mit=5 Plätze)Kennzeichen
System.out.print(br.readLine());
br.reset(); //Markierte Position(INDEX=5 Plätze)Zurück zu
System.out.println((char)br.read());
} catch (IOException e) {
e.printStackTrace();
}
java.io.PrintWriter
- Eine Unterklasse von "java.io.Writer", die primitive Typen so ausgeben kann, wie sie sind
Für boolean / char / char [] / int / float / long / String / Object
- Zusätzlich zu "print" und "println" können Sie Zeichenfolgen mit "format" formatieren
- Hat automatische Blitzfunktion
- In einer Klasse mit derselben Funktion gibt es "PrintStream"
Ersetzt durch "PrintWriter" in JDK1.2, bleibt jedoch aus Gründen der Abwärtskompatibilität erhalten
java.io.Console
- Lesen Sie Daten von der Standardeingabe
- Holen Sie sich eine Singleton-Instanz mit
System # console ()
. ** Gibt null zurück, wenn nicht verfügbar **
- Holen Sie sich die eingegebene Zeichenfolge als Zeichenfolge mit "readLine ()"
- Holen Sie sich die eingegebene Zeichenfolge mit char [] mit
readPassword ()
. Da das Passwort gelesen wird, wird die Zeichenkette bei der Eingabe nicht angezeigt
- Sie können den "PrintWriter" und "Reader", die der Konsole zugeordnet sind, mit "writer ()" bzw. "reader ()" abrufen.
Console
selbst verfügt über die Methoden printf
und format
, um Zeichenfolgen auf der Konsole zu drucken
Vorsichtsmaßnahmen bezüglich der Serialisierung
- Klassen, die die Schnittstelle "java.io.Serializable" implementieren, können serialisiert werden
- Eine der folgenden Optionen ist von der Serialisierung ausgeschlossen
- statische Variable
- Transient deklarierte Mitgliedsvariablen
- Wenn die Oberklasse serialisiert werden kann, kann die Unterklasse auch serialisiert werden
- Die Deserialisierung ruft weder den Instanzinitialisierungsblock noch den Konstruktor auf. Der statische Initialisierungsblock wird jedoch aufgerufen
In den folgenden Fällen wird auch nur der Konstruktor der Oberklasse aufgerufen.
- Es ist selbst "serialisierbar", aber die Oberklasse ist nicht "serialisierbar"
- Superklasse hat einen Konstruktor ohne Argumente
- Der Unterklassenkonstruktor ruft den übergeordneten Konstruktor nicht explizit auf
- Ob eine Mitgliedsvariable serialisiert werden kann, hängt vom Datentyp des Inhalts ab, nicht vom Feld.
Unabhängig von der Art der Variablen kann sie serialisiert werden, wenn ihr Inhalt "serialisierbar" ist
NIO2
java.nio.file.Path (Funktion)
- Erstellt mit der folgenden Methode
Paths#get(String, String...)
FileSystem#getPath(String, String...)
- Die Hauptmerkmale sind wie folgt. Hat Funktionen nicht in
java.io.File
gefunden
- Behandeln Sie Datei- und Verzeichnispfade
- Dateiattribute (Eigentümer, Berechtigungen usw.) können erfasst und geändert werden
- Kann mit symbolischen Links umgehen
- Änderungen und Überwachung von Ereignissen, die im Verzeichnis auftreten, z. B. Dateierstellung
- Eine gegenseitige Konvertierung mit
java.io.File
ist möglich
File#toPath()
Path#toFile()
java.nio.file.Path (Methode)
getRoot()
Gibt die Wurzel des Pfades zurück. Null aus Pfad, der mit dem relativen Pfad generiert wurde
subpath(int start, int end)
Erzeugt einen Pfad, der den vom Index angegebenen Bereich mit Ausnahme des Stamms extrahiert.
getName(int)
Gibt den vom Index angegebenen Teil als String ohne Root zurück
relativize(Path)
Gibt den relativen Pfad zum Argument zurück
resolve(String)
、resolve(Path)
Löse den Pfad auf. Der Rückgabepfad unterscheidet sich je nach Argument
- Argumente sind relative Pfade ... Gibt verkettete Argumente an den Empfänger zurück
- Argument ist ein absoluter Pfad ... Gibt das Argument so zurück, wie es ist
- Leeres Argument ... Gibt den Empfänger selbst zurück
resolveSibling(String)
、resolveSibling(Path)
Lösen Sie den Pfad zum übergeordneten Element des Empfängers auf. Der Rückgabepfad unterscheidet sich je nach Argument
- Argument ist ein absoluter Pfad ... Gibt das an den Empfänger verkettete Argument zurück
- Andere ... Argumente werden verkettet und an den Empfänger zurückgegeben
normalize()
Gibt einen Pfad zurück, der in die entsprechende Form konvertiert wurde, indem redundante Teile wie "." Und ".." entfernt wurden.
String sp1 = "/tmp/work1/sample.txt";
String sp2 = "/tmp/work2/dummy.txt";
Path p1 = Paths.get(sp1);
Path p2 = FileSystems.getDefault().getPath(sp2);
println(p1.getRoot()); // "/"
println(p1.subpath(0, 2)); // "tmp/work1"
println(p1.relativize(p2)); // "../../work2/dummy.txt"
println(p1.getName(0)); // "tmp"
Path rp = p1.resolve("../dat");
println(rp); // "/tmp/work1/sample.txt/../dat"
println(rp.normalize()); // "/tmp/work1/dat"
//Für Windows
Path wp = Paths.get("C:¥¥temp¥¥work¥¥sample.txt");
println(wp.getRoot()); // "C:¥"
java.nio.file.FileSystem
Bietet eine Schnittstelle zum Dateisystem. Holen Sie sich mit der statischen Methode der Klasse "FileSystems"
FileSystems#getDefault
FileSystems#getFileSystem
FileSystems#newFileSystem
java.nio.file.Files (Dateivorgang)
Das Folgende sind alle statischen Methoden
copy
Kopie von Dateien und Verzeichnissen
- Der Inhalt des Verzeichnisses wird nicht kopiert
- Wenn im Kopierziel eine Datei mit demselben Namen vorhanden ist, wird eine Ausnahme gemacht, wenn in CopyOption keine Überschreibspezifikation vorhanden ist.
- Das Standardverhalten ist, dass beim Kopieren einer Datei keine Attribute kopiert werden
- Wenn Sie einen symbolischen Link ohne Angabe von CopyOption kopieren, wird der durch den Link angegebene Stoff kopiert.
- Der dem Argument angegebene Pfad ist nicht der Ort zum Kopieren / Verschieben, sondern der Pfad nach dem Verschieben / Kopieren
move
Dateien und Verzeichnisse verschieben. Das Verhalten entspricht 1 bis 5 der Kopie
getAttribute(Path, String, LinkOption...)
Lesen Sie die Dateiattributwerte (Dateigröße, Änderungsdatum usw.).
Stream<String> lines(Path)
List<String> readAllLines(Path)
Gibt alle Zeilen der Datei zurück. Der Rückgabetyp unterscheidet sich je nach Methode
java.nio.file.Files (Manipulation von Verzeichnissen)
Das Folgende sind alle statischen Methoden
createDirectory()
Erstellen Sie ein Verzeichnis, aber kein übergeordnetes Verzeichnis
createDirectories()
Erstellen Sie ein Verzeichnis mit dem übergeordneten Verzeichnis
delete
/ deleteIfExists
Löschen Sie die Datei. Wenn dies fehlschlägt, ist Ersteres eine Ausnahme, Letzteres ist ein boolescher Typ und das Ergebnis wird zurückgegeben.
Beides kann nicht gelöscht werden, wenn sich eine Datei im Verzeichnis befindet und eine Ausnahme auftritt
newDirectoryStream(Path)
Gibt den Pfad im Verzeichnis mit der Implementierungsklasse "Iterable" "DirectoryStream " zurück
list(Path)
Gibt eine Liste der Dateien und Verzeichnisse im Verzeichnis mit "Stream " zurück. Eine Ausnahme tritt auf, wenn das Argument kein Verzeichnis ist
java.nio.file.Files (Suchverzeichnis)
Das Folgende sind alle statischen Methoden
walk()
walkFileTree()
Rekursiv einschließlich Unterverzeichnissen suchen
list()
Suchen Sie nur dieses Verzeichnis
find()
Suchen Sie rekursiv nach Elementen, die die Bedingungen erfüllen, einschließlich Unterverzeichnissen
- Alle diese Rückgabewerte sind Streams, sodass eine Pipeline-Verarbeitung möglich ist
java.nio.file.attribute
Ein Paket mit Klassen, die die Attribute einer Datei darstellen (Erstellungszeit, Zugriffszeit, Eigentümer usw.). Enthält auch eine Attributansichtsschnittstelle, die eine Reihe von Attributinformationen anzeigt
BasicFileAttributes
Schnittstelle
Grundlegende Attributinformationen
DosFileAttributes
Schnittstelle
DOS-Attributinformationen
PosixFileAttributes
Schnittstelle
Informationen zu Unix / Linux-Attributen
AttributeView
Schnittstelle
Eine Reihe von Attributinformationen. Die folgenden existieren als Unterschnittstellen
BasicFileAttributeView
DosFileAttributeView
PosixFileAttributeView
Parallelverarbeitung
Vom Dienstprogramm für die Parallelverarbeitung bereitgestellte Funktionen
- Thread-Pool
Thread-Erstellung und Wiederverwendung
- Parallele Sammlung
Eine Sammlung, die den parallelen Zugriff von mehreren Threads ordnungsgemäß verarbeiten kann
- Atomvariablen
Implementierte eine Reihe unteilbarer Operationen, um Wertinkonsistenzen aufgrund von parallelem Zugriff zu vermeiden (wie synchronisiert).
- Semapho zählen
Sie können die Anzahl der Threads frei festlegen, die parallel auf eine begrenzte Anzahl von Ressourcen zugreifen können.
Parallele Sammlung
- Die API für die Parallelverarbeitung lautet wie folgt. Alle
java.util.concurrent
Pakete
BlockingQueue
Schnittstelle
BlockingDeque
Schnittstelle
ConcurrentMap
Schnittstelle
- ConcurrentHashMap-Klasse
CopyOnWriteArrayList
Klasse
CopyOnWriteArraySet
Klasse
- Wenn Sie ein Auflistungsobjekt betreiben, das die parallele Verarbeitung von mehreren Threads nicht unterstützt, tritt "java.util.ConcurrentModificationException" auf.
- Wenn Sie einen Iterator in einer erweiterten for-Anweisung verwenden, wenn Sie mit mehreren Threads arbeiten, wird der Inhalt der Sammlung zum Zeitpunkt der Erstellung des Iterators verwendet.
java.util.concurrent.ConcurrentMap-Schnittstelle
V getOrDefault(Object key, V defaultValue)
Gibt den dem Schlüssel zugeordneten Wert zurück. Gibt defaultValue zurück, wenn nicht
V putIfAbsent(K key, V value)
Wird nur hinzugefügt, wenn der mit dem Schlüssel verknüpfte Wert nicht in der Karte enthalten ist
boolean remove(Object key, Object value)
Löschen Sie alle Elemente, die sowohl dem Schlüssel als auch dem Wert entsprechen
V replace(K key, V value)
Ersetzen Sie, wenn sich der für key angegebene Wert in der Karte befindet
V replace(K key, V oldValue, V newValue)
Ersetzen Sie den Wert durch newValue, wenn ein Element vorhanden ist, das sowohl key als auch oldValue entspricht
//Der Inhalt der Karte[1, "One"], [2, "Two.2"], [3, "Three"]
Map<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "One");
map.putIfAbsent(1, "One.2"); //Nicht hinzufügen(KEY=1 Element existiert bereits)
map.put(2, "Two");
map.replace(2, "Two.2"); //Ersatz
map.replace(2, "Two.22", "Two.3"); //Nicht ersetzen(Das zweite Argument unterscheidet sich vom vorhandenen Wert)
map.put(3, "Three"); //Löschen
map.remove(3, "Three2"); //Nicht löschen(Das zweite Argument unterscheidet sich vom vorhandenen Wert)
java.util.concurrent.CopyOnWriteArrayList-Klasse
- Wenn Sie die intern gespeicherten Elemente ändern, kopieren Sie das Array mit den alten Elementen, ändern Sie es und ersetzen Sie es.
Je größer die Liste ist, desto größer ist daher der Overhead.
- Wenn ein anderer Thread beim Ändern eines Elements (Kopieren in ein neues Array) auf die Liste zugreift, verweist er auf den Inhalt des alten Arrays.
java.util.concurrent.CyclicBarrier-Klasse
- Bietet die Möglichkeit, jeden Thread in einer Thread-Gruppe auszurichten (eine Sammlung hervorgehobener Threads).
- Geben Sie die Anzahl der Threads an, die im Konstruktor zusammenarbeiten sollen. Das erste Argument ist die Anzahl der zu koordinierenden Threads, und wenn es ein zweites Argument gibt, der Prozess, der ausgeführt werden soll, wenn eine Auslösung (= Barriere freigegeben wird)
new CyclicBarrier(int)
new CyclicBarrier(int, Runnable)
- Der Thread, der
await ()
ausgeführt hat, wartet, bis die im Konstruktor von CyclicBarrier
angegebene Anzahl von Threads wartet.
await(long timeout)
Keine Auszeit
await(long timeout, TimeUnit unit)
Es gibt eine Zeitüberschreitung
- Wenn "new CyclicBarrier (3)" für 4 Threads verwendet wird, tritt eine Auslösung auf, wenn 3 Threads "warten".
Aber der letzte kann die Barriere nicht durchbrechen, bis zwei weitere Fäden "warten", also kann er nicht fortgesetzt werden.
//Weil es 3 Fäden für 2 Barrieren gibt
// "wait wait wait finish finish"Und der Prozess stoppt
ExecutorService service = Executors.newCachedThreadPool();
CyclicBarrier barrier = new CyclicBarrier(2);
for (int i = 0; i < 3; i++) {
service.execute(() -> {
try {
System.out.print("wait ");
barrier.await();
System.out.println("finish ");
} catch (BarrierBrokenException | InterruptedException ignore) {
}
});
}
service.shutdown();
ExecutorService-Vererbungsbeziehung
Executor
… execute(Runnabble)
ExecutorService
…submit (Runnable)
etc.
* ThreadPoolExecutor
* ForkJoinPool
ScheduledExecutorService
…Schedule (Runnable, Long, TimeUnit)
etc.
* ScheduledThreadPoolExecutor
Executors-Methoden und entsprechende ExecutorService-Spezifikationen
newSingleThreadExecutor()
Führen Sie Aufgaben in einem einzelnen Thread aus
newCachedThreadPool()
Erstellen Sie neue Threads oder verwenden Sie sie erneut, um Aufgaben nach Bedarf auszuführen
newFixedThreadPool(int)
Führen Sie Aufgaben aus, indem Sie eine feste Anzahl von Threads wiederverwenden
newScheduledThreadPool(int)
Führen Sie Aufgaben aus, indem Sie eine feste Anzahl von Threads wiederverwenden. Aufgaben können geplant werden
newSingleThreadScheduledExecutor()
Führen Sie Aufgaben in einem einzelnen Thread aus. Aufgaben können geplant werden
ExecutorService#execute
- Holen Sie sich das "ExecutorService" -Objekt der entsprechenden Art mit der statischen Methode der "Executors" -Klasse und führen Sie es mit der "execute (Runnable)" -Methode aus
- Verwenden Sie die folgende Methode, um den Ausführungsstatus der Aufgabe zu überprüfen
isShutdown()
Wenn dies der Fall ist, können neue Aufgaben nicht akzeptiert werden (möglicherweise nicht ausgeführte oder ausgeführte Aufgaben).
isTerminated()
Wenn dies der Fall ist, können neue Aufgaben nicht akzeptiert werden und alle Aufgaben wurden abgeschlossen.
- Wenn
isShutdown ()
nicht true ist, ist eine neue Task execute
möglich. execute
wenn true eine Ausnahme auslöst
ExecutorService#submit
- ExecutorService verfügt über mehrere Überladungsmethoden und der Rückgabewert ist Future. Was Sie von Future erhalten können, hängt von der Methode ab
Future<T> submit(Runnable)
Führen Sie die Aufgabe aus. Sie können den Erfolg oder Misserfolg der Aufgabe erhalten
Future<?> submit(Runnable, T)
Führt die Aufgabe des ersten Arguments aus und gibt den Wert des zweiten Arguments zurück. Sie können den Erfolg oder Misserfolg der Aufgabe erhalten
Future<T> submit(Callable<T>)
Führen Sie die Aufgabe aus. Sie können den Rückgabewert aus der Aufgabe abrufen
- Die Aufgabe wird sofort ausgeführt, aber wenn "Future # get ()" ausgeführt wird, gibt es eine Wartezeit, bis der Wert auch nach Abschluss der Aufgabe erhalten werden kann.
- Sie können auch eine Aufgabe abbrechen, die von Future "gesendet" wurde (nur wenn möglich).
Runnable und Callable
Runnable
- Geben Sie keinen Rückgabewert zurück
- Überprüfte Ausnahme kann nicht ausgelöst werden
- Kann entweder mit "Ausführen" oder "Senden" ausgeführt werden
Callable
- Kann einen Rückgabewert zurückgeben
- Kann geprüfte Ausnahmen auslösen
- Kann nur mit
submit
ausgeführt werden
java.util.concurrent.Future-Schnittstelle
V get()
Sie können das Ausführungsergebnis der Aufgabe abrufen
boolean cancel(boolean)
Versuch, die Aufgabe abzubrechen
boolean isCancelled()
Wissen Sie, ob die Aufgabe abgebrochen wurde
boolean isDone()
Wissen Sie, ob die Aufgabe abgeschlossen ist
Paralleler Stream
- Generieren
Collection#parallelStream()
Generieren Sie einen parallelen Stream aus der Sammlung
- Gegenseitige Umwandlung
BaseStream#parallel()
Generieren Sie einen parallelen Stream aus einem sequentiellen Stream
BaseStream#sequential()
Generieren Sie einen sequentiellen Stream aus einem parallelen Stream
- Beurteilung
BaseStream#isParallel()
Stellen Sie fest, ob es sich um einen parallelen Stream handelt
//Parallele Stream-Generierung
Arrays.asList(1, 2, 3).parallelStream().forEach(System.out::println);
//Generieren Sie einen parallelen Stream aus einem sequentiellen Stream
Stream.of("a", "b", "c").parallel().forEach(System.out::println);
//Generieren Sie einen sequentiellen Stream aus einem parallelen Stream
Arrays.asList("A", "B", "C").parallelStream().sequential().forEach(System.out::println);
Fork / Join-Framework
- Ich habe hier aufgegeben. Wenn Sie es ernst meinen, lassen Sie uns richtig lernen
Atomvariablen
- Klassen mit Namen, die mit Atomic ~ beginnen, garantieren, dass Operationen mit den von ihnen behandelten Werten threadsicher sind.
- Die Hauptklassen sind wie folgt. Float und Double existieren nicht
AtomicInteger
… int type
AtomicLong
… langer Typ
AtomicBoolean
… boolescher Typ
AtomicReference
… Referenztyp
JDBC
Abfrage ausführen
- Die Pakete, zu denen die zu verwendende Klasse gehört, sind "java.sql" und "javax.sql"
- Das URL-Format für die Verbindung zur Datenbank mit JDBC lautet wie folgt
jdbc: [DB-Name] // [Host (: Port)] / [Datenbankname](? Option)
- Der grundlegende Verarbeitungsablauf ist wie folgt
- Holen Sie sich "Verbindung" mit "DriverManager # getConnection (URL, ID, Pass)"
- Holen Sie sich "Statement" mit "Connection # createStatement ()"
- Holen Sie sich "ResultSet" mit "Statement # executeQuery (sql)"
- Extrahieren Sie das Ergebnis der Abfrage aus
ResultSet
- Vor JDBC3.0 mussten Sie "Class.forName ([Name der JDBC-Treiberklasse])" vor "DriverManager # getConnection" ausführen.
- Auch wenn das Ergebnis der von
executeQuery
ausgeführten Abfrage 0 ist, ist der Rückgabewert leer ResultSet
anstelle von null.
- Nur ein "ResultSet" kann von einem "Statement" verarbeitet werden. Wenn Sie ein anderes "ResultSet" erhalten, ohne das erste "ResultSet" zu schließen, wird das erste automatisch geschlossen. Ausnahme beim Versuch, ein geschlossenes "ResultSet" zu manipulieren
Wird automatisch geschlossen, wenn "executeUpdate" usw. ausgeführt wird
Ordnungsgemäße Verwendung der Methoden in Statement
ResultSet executeQuery(String sql)
Gibt das Ergebnis der Abfrageausführung zurück
int executeUpdate(String sql)
Führt SQL wie INSERT / UPDATE / DELETE aus und gibt die Anzahl der Prozesse zurück
boolean execute(String sql)
Führt alle Arten von SQL aus, einschließlich Abfragen, und gibt zurück, ob die Verarbeitung zu "ResultSet" geführt hat. Wenn true, wird ResultSet
zurückgegeben, wenn false, ist dies nicht der Fall.
Wenn "ResultSet" als Ergebnis der Verarbeitung zurückgegeben wird, rufen Sie es mit "Statement # getResultSet ()" ab. Wenn es sich nicht um "ResultSet" handelt, verwenden Sie "Statement # getUpdateCount ()", um die Anzahl der Prozesse abzurufen.
Erwerb und Eigenschaften von ResultSet
- Geben Sie unter "Connection # createStatement (Typ, Parallelität)" die Reihenfolge "Bildlauffähigkeit" und "Verfügbarkeit der Aktualisierung von Tabellendaten" von "ResultSet" in der angegebenen Reihenfolge an.
- Es gibt drei Arten der Bildlauffähigkeit, die alle Konstanten der Klasse "ResultSet" sind.
TYPE_FORWARD_ONLY
… Kann sich nur in Vorwärtsrichtung bewegen
TYPE_SCROLL_INSENSITIVE
… Kann sich in beide Richtungen bewegen. Änderungen am Cursor werden nicht berücksichtigt
TYPE_SCROLL_SENSITIVE
… Kann sich in beide Richtungen bewegen. Reflektieren Sie Änderungen am Cursor
- Die Tabellendaten können in den folgenden zwei Typen aktualisiert werden, die alle Konstanten der Klasse "ResultSet" sind.
CONCUR_READ_ONLY
… schreibgeschützt
CONCUR_UPDATABLE
… Aktualisierbar
- Wenn Sie ein aktualisierbares "ResultSet" mit "Statement # createStatement (..., ResultSet.CONCUR_UPDATABLE)" erhalten, muss die zu aktualisierende Spalte in der select-Anweisung von "executeQuery" angegeben werden.
ResultSet-Bildlaufmethode
boolean absolute(int)
Gehen Sie zur angegebenen Zeile (geben Sie die absolute Position an). Die erste Zeile ist 1.0 vor First
boolean relative(int)
Bewegen Sie sich, indem Sie eine relative Position angeben. Der positive Wert geht in die nächste Zeile, der negative Wert in die vorherige Zeile
boolean next()
Gehen Sie zur nächsten Zeile
boolean previous()
Gehen Sie zur vorherigen Zeile
boolean first()
Gehen Sie zur ersten Zeile
void beforeFirst()
Bewegen Sie sich kurz vor der ersten Zeile
boolean last()
Zur letzten Zeile wechseln
void afterLast()
Bewegen Sie sich unmittelbar nach der letzten Zeile
Aktualisierbares ResultSet
- Update
Ändern Sie mit
updateString
oder updateInt
und bestätigen Sie die Änderung mit updateRow
Selbst wenn der Typ von "Anweisung" "TYPE_SCROLL_INSENSITIVE" ist, werden der Inhalt der Datenbank und sogar die Ergebnismenge nur geändert, wenn es sich um "updateRow" handelt.
updateString(int, String)
updateInt(int, int)
updateRow()
- Einfügen
Verwenden Sie
moveToInsertRow
, um in die Einfügezeile zu wechseln, verwenden Sie updateString
oder updateInt
, um den Einfügeinhalt anzugeben, und verwenden Sie insertRow
zum Einfügen.
moveToInsertRow()
insertRow()
- Löschen
Aktuelle Zeile löschen
Lokalisierung und Formatierung
Holen Sie sich das Objekt java.util.Locale
Locale#getDefault()
Gebietsschema der Java-Ausführungsumgebung
new Locale(String)
Das Argument ist "Sprachcode"
new Loacle(String, String)
Das Argument ist "Sprachcode, Ländercode"
new Loacle(String, String, String)
Das Argument lautet "Sprachcode, Ländercode, Variante"
- Stellen Sie den entsprechenden Wert für "Locale.Builder" ein, der von new generiert wurde, und generieren Sie ihn mit "build ()"
java.util.Properties
- Unterstützte Dateiformate sind Text und XML
- Listen Sie für Textdateien die Schlüssel und Werte auf, die durch = oder getrennt sind:
- Laden Sie die Eigenschaftsliste aus der Datei
load(InputStream)
load(Reader)
loadFromXML(InputStream)
- Liste der Ausgabeeigenschaften
list(OutputStream)
list(Writer)
entrySet()
forEach(BiConsumer)
- Eigenschaften abrufen
getProperty(String)
Gibt null zurück, wenn kein entsprechender Schlüssel vorhanden ist
getProperty(String, String)
Wenn kein entsprechender Schlüssel vorhanden ist, wird das zweite Argument zurückgegeben.
java.util.ListResourceBundle
- Bereiten Sie die Ressource in einer .class-Datei vor und platzieren Sie sie an der Stelle, an der der Klassenpfad festgelegt ist.
- Die Verwendung ist wie folgt
- Definieren Sie eine öffentliche Klasse, die ListResourceBundle erbt
Überschreiben Sie
public Object [] [] getContents ()
Der vollständig qualifizierte Name (Paketname + Klassenname) dieser Klasse ist der Basisname, und diese Klasse ist für das Standardgebietsschema.
Beispiel: Der Klassenname lautet "MyResource".
- Definieren Sie eine Klasse für ein anderes Gebietsschema als 1, indem Sie "ListResourceBundle" erben
Die Namensregel lautet ** "base name_language code_country code" **
Beispiel: Der Klassenname für das englische Gebietsschema lautet "MyResource_en_US".
- Holen Sie sich das ListResourceBundle-Objekt mit ResourceBundle # getBundle (Basisname [, Gebietsschema])
- Holen Sie sich den Wert mit "ResourceBundle # getXXXXX (Schlüsselzeichenfolge)"
java.util.PropertyResourceBundle
- Bereiten Sie die Ressource in der .properties-Datei vor und platzieren Sie sie an der Stelle, an der der Klassenpfad festgelegt ist.
- Die Verwendung ist wie folgt
- Erstellen Sie eine Eigenschaftendatei für das Standardgebietsschema
- Erweiterung ist **. Eigenschaften **
- Definieren Sie mehrere Eigenschaften im Format "Schlüsselname = Wert"
- Die Datei muss ISO-8859-1-codiert sein
- Die Dateinamenskonvention entspricht dem Klassennamen von ListResourceBundle
- Erstellen Sie eine Datei für ein anderes Gebietsschema als 1
- Die Dateinamenskonvention entspricht dem Klassennamen von ListResourceBundle
- MyResource_en_US.properties für das englische Gebietsschema
- Holen Sie sich das
PropertyResourceBundle
-Objekt mit ResourceBundle # getBundle (Basisname [, Gebietsschema])
- Gleiche Methode, um "ListResourceBundle" zu erhalten
- Verwenden Sie die folgende Methode, um den Wert abzurufen. Es gibt kein GetInt
ResourceBundle # getObject (Schlüsselzeichenfolge)
ResourceBundle # getString (Schlüsselzeichenfolge)
ResourceBundle # getStringArray (Schlüsselzeichenfolge)
Priorität der verwendeten Ressourcenpakete
- Eine "MissingResourceException" -Ausnahme wird ausgelöst, wenn das dem Gebietsschema entsprechende Ressourcenpaket nicht vorhanden ist
- Es gibt keine Ausnahme, auch wenn mehrere Ressourcenpakete mit demselben Namen vorhanden sind.
- Ressourcenpakete werden nach einzelnen Eigenschaften und nicht nach Dateien durchsucht. Die Suchpriorität ist wie folgt
- Sprachcode und Ländercode stimmen überein
- Sprachcode abgleichen
- Passen Sie das Standardgebietsschema an
- Wenn die dem angegebenen Schlüssel entsprechende Eigenschaft in keiner Klasse / Datei vorhanden ist, tritt "MissingResourceException" auf.
- Wenn sowohl die ListResourceBundle-Klasse als auch die Eigenschaftendatei denselben Namen haben, hat die Klasse Vorrang vor der Datei.
Formatieren Sie Zahlen mit NumberFormat
- Verwenden Sie die statische Methode der NumberFormat-Klasse, um das gewünschte Objekt abzurufen
getInstance()
Numerisches Format des Standardgebietsschemas
getInstance(Locale)
Numerisches Format eines beliebigen Gebietsschemas
getCurrencyInstance(Locale)
Währungsformat eines beliebigen Gebietsschemas
getIntegerInstance(Locale)
Ganzzahliges Format für jedes Gebietsschema
- Holen Sie sich die formatierte Zeichenfolge mit "Format (lang)" oder "Format (doppelt)"
- Holen Sie sich eine Nummer aus einem String mit
parse (String)
. Der Rückgabewert ist "Number"
Änderungsprotokoll
- 2020/08/23
Veröffentlicht in Qiita
- 2020/08/24
Die Liste der Funktionsschnittstellen wurde in ein Tabellenformat geändert
Beispielcode für Aufzählungswerte hinzugefügt