Java 12 ist bereits in die Rampdown-Phase eingetreten und seine Funktionen sind fast abgeschlossen und werden am 19. März veröffentlicht, wenn alles gut geht. -> Es wurde getan. Daher werde ich die Funktionen, die Java 12 eingeben, in JEP, API und anderen zusammenfassen. JDK 12 Early-Access Builds
JEP Zunächst JEP-basierte Änderungen, die wichtige Funktionen zusammenfassen http://openjdk.java.net/projects/jdk/12/
Enthält insgesamt 8 JEPs. Die drei oben genannten und die Standard-CDS wirken sich wahrscheinlich auf den durchschnittlichen Java-Programmierer aus. Leider wurden Raw String Literals gelöscht. 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) 230: Microbenchmark Suite 325: Switch Expressions (Preview) 334: JVM Constants API 340: One AArch64 Port, Not Two 341: Default CDS Archives 344: Abortable Mixed Collections for G1 346: Promptly Return Unused Committed Memory from G1
Ich werde über jedes in der Reihenfolge schreiben, in der sie wahrscheinlich verwendet werden.
325: Switch Expressions (Preview)
Die Switch-Anweisung wurde als Vorschaufunktion erweitert und kann jetzt als Ausdruck verwendet werden. (Um die Vorschaufunktion zu verwenden, müssen Sie --enable-Preview
zu javac
usw. hinzufügen.)
String time = switch (weekday) {
case MONDAY, FRIDAY -> "10:00-18:00";
case TUESDAY, THURSDAY -> "10:00-14:00";
default -> "Urlaub";
};
Das sieht bis jetzt so aus.
String time;
switch (weekday) {
case MONDAY:
case FRIDAY:
time = "10:00-18:00";
break;
case TUESDAY:
case THURSDAY:
time = "10:00-14:00";
break;
default:
time = "Urlaub";
}
Ich denke, dies ist das Muster, das Sie meistens verwenden, wenn Sie "Schalter" verwenden. Beim herkömmlichen Switch ist die Menge an Beschreibungen natürlich groß, aber es hat Fehler wie das Auslassen von Unterbrechungen, das Aktualisieren der falschen Variablen und die Nichtgarantie verursacht, dass kein Auslassen von Aktualisierungen vorliegt. Dies wird gelöst, daher möchte ich es aktiv nutzen.
Tatsächlich ist es in drei zusätzliche Spezifikationen unterteilt.
Sie können jetzt mehrere Werte für "case" angeben.
String time;
switch (weekday) {
case MONDAY, FRIDAY:
time = "10:00-18:00";
break;
case TUESDAY, THURSDAY:
time = "10:00-14:00";
break;
default:
time = "Urlaub";
}
Rule Switch
Mit ->
ist eine Pause nicht mehr erforderlich.
String time;
switch (weekday) {
case MONDAY, FRIDAY -> time = "10:00-18:00";
case TUESDAY, THURSDAY -> time = "10:00-14:00";
default -> time = "Urlaub";
}
Sie können auch mehrere Zeilen mit Blöcken verarbeiten.
String time;
switch (weekday) {
case MONDAY, FRIDAY -> {
var endTime = getEndTime();
time = "10:00-" + endTime;
}
case TUESDAY, THURSDAY -> time = "10:00-14:00";
default -> time = "Urlaub";
}
Ich möchte das positiv nutzen.
Und "Schalter" wurde ein Ausdruck.
Wenn Sie die Pfeilsyntax nicht verwenden oder wenn Sie Blöcke für die Pfeilsyntax verwenden, gibt break
den Wert zurück.
String time = switch (weekday) {
case MONDAY, FRIDAY -> {
var endTime = getEndTime();
break "10:00-" + endTime;
}
case TUESDAY, THURSDAY -> "10:00-14:00";
default -> "Urlaub";
};
Ein Fehler tritt auf, wenn nicht alle Eingaben unterstützt werden können.
jshell> switch("a"){ case "a" -> 3;}
|Error:
|Der Schalterausdruck deckt nicht alle möglichen Eingabewerte ab
| switch("a"){ case "a" -> 3;}
| ^--------------------------^
Die "Pause", die einen Wert zurückgibt, könnte "Pause" sein, wenn sie offiziell wird. Call for feedback -- enhanced switch In JDK 13 ist es jedoch "Ertrag".
341: Default CDS Archives
Es gibt einen Mechanismus, um Klassendaten im Voraus zu erstellen und gemeinsam zu nutzen. Bisher war es jedoch erforderlich, Klassendaten selbst als "java -Xshare: dump" zu erstellen. Ab JDK12 ist "lib / server / classes.jsa" im Voraus enthalten, daher ist diese Arbeit nicht erforderlich. Wenn "-Xshare: auto" in JDK11 die Standardeinstellung ist und "classes.jsa" vorhanden ist, erfolgt dies automatisch. Da CDS in verwendet wird, scheint es, dass CDS von Anfang an verwendet wird, ohne etwas zu tun. Dies sollte die Java-Startzeit verbessern.
189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) Dies ist ein von Red Hat entwickelter GC. Es scheint, dass sich die Stoppzeit nicht ändert, egal ob es sich um 2 GB oder 200 GB handelt.
Da es viele Codes gibt, die mit G1GC gemeinsam sind, scheint es, dass G1GC während der Entwicklung von Shenandoah verbessert werden könnte. Dieses JEP346 ist auch eine der Reflexionen solcher Verbesserungen unter der Entwicklung von Shenandoah in G1GC. Parallel Full GC für G1 in Java 10 scheint dasselbe zu sein. InfoQ: Die Zukunft von OpenJDK in Red Hat
JDK11 enthält übrigens auch zwei GCs, ZGC und Epsillon. JDK12 enthält also 7 GCs.
Der Standardwert ist Java 9 bis G1GC. JEP 248: Make G1 the Default Garbage Collector
Es scheint jedoch, dass Parallel GC in Umgebungen mit wenig Speicher und Serial GC in Single Core-Umgebungen verwendet wird.
Es scheint besser, ZGC nicht mit einem Heap von 32 GB oder weniger zu verwenden, daher denke ich, dass es verwendet wird, wenn es einen Heap von mehreren hundert GB bis zu mehreren TB gibt. Wie wäre es mit der richtigen Verwendung von G1GC und Shenandoah?
CMS ist seit Java 9 veraltet und wird in Zukunft entfernt JEP 291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector
Ich dachte auch, dass Epsilon GC gut wäre, wenn es mit jeder Anfrage wie ohne Server beginnt, aber als ich versuchte, Epsilon GC mit einem einfachen Programm zu verwenden, war es langsam.
230: Microbenchmark Suite Es gibt ein Benchmark-Framework namens JMH (Java Microbenchmark Harness?), Aber es scheint, dass es jetzt im JDK enthalten ist. Wartung synchronisieren? OpenJDK: jmh
Ich konnte jedoch kein Material darüber finden, was sich im Vergleich zur Verwendung eines externen JMH geändert hat und wie es verwendet wird.
334: JVM Constants API
Dynamische Klassendateikonstanten sind in Java 11 enthalten, und Invoke Dynamic kann zum Zeitpunkt der Klasseninitialisierung für die Verarbeitung verwendet werden. JEP 309: Dynamic Class-File Constants Zu diesem Zeitpunkt wurden jedoch keine Sprachspezifikationen oder APIs hinzugefügt, sodass ich meine eigene Klassendatei erstellen musste, um sie verwenden zu können.
Das Paket "java.lang.constant" wurde hinzugefügt, einschließlich der Schnittstelle "Constable" und der Schnittstelle "ConstantDesc". Und eine Klasse wie "String", "Integer", "Class", "Enum" usw., die sie nicht als Konstante verwendet, implementiert "Constable" und die Methode "descriptionConstable ()".
346: Promptly Return Unused Committed Memory from G1 Geben Sie im Leerlauf nicht verwendeten Speicher zurück. Reflexion von Änderungen in Shenandoah zu G1GC.
344: Abortable Mixed Collections for G1
Machen Sie Mixed GC stoptable. Ich weiß nicht, ob das von Shenandoah kommt.
340: One AArch64 Port, Not Two Da es zwei Quellcodes von arm64 und aarch64 als Port für ARM64bit gab, wurde arm64 anscheinend gelöscht, um Doppelarbeit zu vermeiden.
API Die API-Änderungen sind auch nicht auffällig und es scheint, dass es einige kleinere Korrekturen gibt.
CompactNumberFormat Es ist ein "NumberFormat", das eine große Zahl ausdrückt, z. B. 10.000 als 10.000 oder 10 KB. [JDK-8188147] Compact Number Formatting support - Java Bug System
Die Instanz wird mit der Methode "getCompactNumberInstance" von "java.text.NumberFormat" abgerufen. Im Falle eines japanischen Gebietsschemas sieht es so aus. Es scheint, dass Kyo nicht mit bis zu Billionen kompatibel ist.
jshell> import java.text.*
jshell> var cnf = NumberFormat.getCompactNumberInstance()
cnf ==> java.text.CompactNumberFormat@73cf7357
jshell> cnf.format(10000)
$4 ==> "10 000"
jshell> cnf.format(10000_0000)
$5 ==> "Ein hundert Millionen"
jshell> cnf.format(10000_0000_0000L)
$6 ==> "1 Billion"
jshell> cnf.format(10000_0000_0000_0000L)
$7 ==> "10000 Billionen"
Wenn Sie ein Gebietsschema angeben, müssen Sie auch einen Stil angeben. Sie können entweder "KURZ" oder "LANG" wählen.
So sieht es mit SHORT
aus.
jshell> cnf = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT)
cnf ==> java.text.CompactNumberFormat@952071d5
jshell> cnf.format(1000)
$9 ==> "1K"
jshell> cnf.format(1000_000)
$10 ==> "1M"
jshell> cnf.format(1000_000_000)
$11 ==> "1B"
jshell> cnf.format(1000_000_000_000L)
$12 ==> "1T"
jshell> cnf.format(1000_000_000_000_000L)
$13 ==> "1000T"
Es unterstützt bis zu T. Ist das nicht 1 Milliarde 1G? Es ist wie es ist. Geben wir "LONG" an.
jshell> cnf = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG)
cnf ==> java.text.CompactNumberFormat@38c39d6b
jshell> cnf.format(1000)
$15 ==> "1 thousand"
jshell> cnf.format(1000000)
$16 ==> "1 million"
jshell> cnf.format(1000000000)
$17 ==> "1 billion"
jshell> cnf.format(1000000000000L)
$18 ==> "1 trillion"
jshell> cnf.format(1000000000000000L)
$19 ==> "1000 trillion"
Im Fall von 1000 scheint es Kilos K zu sein, aber M und T schienen Millionen und Billionen anstelle von Mega und Tera zu sein.
Wenn Sie nach dem Dezimalpunkt anzeigen möchten, verwenden Sie "setMaximumFractionDigit" oder "setMinimumFractionDigit". Standardmäßig werden die Zahlen nach dem Dezimalpunkt gerundet.
jshell> cnf.format(123456)
$20 ==> "123 thousand"
Sie können "setMaximumFractionDigits" verwenden, um die maximale Anzahl von Stellen nach dem Dezimalpunkt anzugeben.
jshell> cnf.setMaximumFractionDigits(2)
jshell> cnf.format(123456)
$21 ==> "123.46 thousand"
jshell> cnf.format(123400)
$22 ==> "123.4 thousand"
Sie können setMinimumFractionDigits
verwenden, um die minimale Anzahl von Stellen nach dem Dezimalpunkt anzugeben.
jshell> cnf.setMinimumFractionDigits(2)
jshell> cnf.format(123400)
$23 ==> "123.40 thousand"
String.indent(int) Fügt Einrückungen für die angegebene Anzahl von Zeichen hinzu.
jshell> "123\n456".indent(2)
$24 ==> " 123\n 456\n"
Sie können die Einrückung reduzieren, indem Sie einen negativen Wert angeben.
jshell> " 123\n 123".indent(-2)
$25 ==> "123\n123\n"
Es ist ein Überbleibsel von Raw String Literals. [JDK-8200435] String::align, String::indent - Java Bug System
Das align ()
, das auch für RSL eingegeben wurde, bleibt in ea27, sollte jedoch in ea28 verschwinden, da ein Lösch-Commit aufgetreten ist.
[JDK-8215490] Remove String::align - Java Bug System
String.transform(Function<String, R>) Dies ist auch ein Überbleibsel von Raw String Literals. Wenn es eine Funktion gibt, die "String" nimmt und etwas zurückgibt, wendet sie es an. Allein damit habe ich das Gefühl, dass ich die Funktion einfach normal aufrufen sollte, aber als Motivation habe ich das Gefühl, dass ich in der Reihenfolge schreiben kann, in der ich denke. [JDK-8203703] String::transform - Java Bug System
Angenommen, Sie haben eine Funktion, die Ihnen eine Adresse durch Übergabe eines Namens gibt, und eine Funktion, die Ihnen die Bevölkerung durch Übergabe einer Adresse gibt. Hier ist Karte.
jshell> var addresses = Map.of("Mike", "Fukuoka", "John", "Tokyo")
addresses ==> {John=Tokyo, Mike=Fukuoka}
jshell> var population = Map.of("Tokyo", 30000000, "Fukuoka", 2000000)
population ==> {Fukuoka=2000000, Tokyo=30000000}
Und als ich sagte: "Ich möchte die Bevölkerung der Adresse der Person anzeigen, wenn ich den Namen übergebe", musste ich so etwas schreiben.
jshell> population.get(addresses.get(name))
$37 ==> 2000000
Obwohl es sich um einen Prozess handelt, bei dem "ein Name genommen und eine Adresse genommen wird, um die Bevölkerung aufzunehmen", muss in der Reihenfolge "Übergeben des Namens, um die Adresse zu übergeben, um die Bevölkerung zurückzugeben" geschrieben werden.
Dies kann wie folgt mit transform
geschrieben werden.
jshell> name.transform(addresses::get).transform(population::get)
$38 ==> 2000000
Die Reihenfolge lautet "Nimm die Adresse mit Namen und nimm die Bevölkerung". Es gibt viele Sprachen, in denen "Funktion (Wert)" in der Reihenfolge "Wert → Funktion" in den Sprachspezifikationen geschrieben werden kann, aber vorerst scheint Java dies erkannt zu haben. Ich wünschte, ich könnte in Java in der Reihenfolge "Name → Adresse :: Get → Population :: Get" schreiben.
Collectors.teeing(Collector, Collector, BiFunction) Verbinden Sie die Ergebnisse der beiden Kollektoren. [JDK-8209685] Create Collector which merges results of two other collectors - Java Bug System
Wenn Sie beispielsweise eine Liste von Zeichenfolgen haben und leere Zeichenfolgen weglassen und durch Kommas trennen möchten, um die endgültige Anzahl von Elementen zu erhalten, können Sie diese nicht mit einem einzigen Stream-Prozess lösen, aber jetzt können Sie dies tun. Ich werde.
jshell> Stream.of("aaa", "", "bbb", "ccc").
...> filter(Predicate.not(String::isEmpty)).
...> collect(Collectors.teeing(
...> Collectors.joining(","),
...> Collectors.counting(),
...> Map::entry))
$39 ==> aaa,bbb,ccc=3
Files.mismatch(Path, Path) Gibt die erste der beiden Dateien an einer anderen Position zurück. -1 für dieselbe Datei Ich habe eine "isSameFile", aber willst du nicht etwas anderes? Es scheint, dass es hinzugefügt wurde. [JDK-8202302](fs) New Files.mismatch method for comparing files - Java Bug System
InputStream.skipNBytes(long) Überspringt die angegebene Anzahl von Bytes und Daten. [JDK-8214072] InputStream.skipNBytes(long k) to skip exactly k bytes - Java Bug System
Ich habe das Gefühl, dass es ein "Überspringen (lang)" gibt, aber "Überspringen" gibt die tatsächlich erweiterte Nummer zurück, während "ÜberspringenNBytes" keinen Rückgabewert zurückgibt und einen Wert über das Ende des Streams hinaus angibt. Dann wird eine "EOFException" ausgelöst.
jshell> var input = new ByteArrayInputStream(new byte[5])
input ==> java.io.ByteArrayInputStream@64bf3bbf
jshell> input.skip(2)
$25 ==> 2
jshell> input.skip(4)
$26 ==> 3
jshell> input.reset()
jshell> input.skipNBytes(2)
jshell> input.skipNBytes(4)
|Ausnahme Java.io.EOFException
| at InputStream.skipNBytes (InputStream.java:600)
| at (#29:1)
CompletableFuture.exceptionallyAsync(Function) Die Methoden "ExceptionalAsync", "ExceptionalCompose" und "ExceptionalComposeAsync" wurden zu "CompletableFuture" hinzugefügt, um Ausnahmen zu behandeln. Tatsächlich wurde es der "CompletableStage" -Schnittstelle hinzugefügt, so dass es sich anfühlt, als wäre es implementiert worden. [JDK-8211010] Add exception handling methods to CompletionStage and CompletableFuture - Java Bug System
Es gibt bereits "außergewöhnlich", aber Compose- und Async-Versionen wurden hinzugefügt.
Systemänderungen, die ich vornehmen kann. Diese Art des Refactorings ist häufig ebenfalls enthalten. [JDK-8214971] Replace use of string.equals("") with isEmpty() - Java Bug System
Der Befehl jfr wurde hinzugefügt.
$ jfr print --categories GC --events CPULoad recording.jfr
Es scheint als verwendet zu werden [JDK-8205517] JFR tool - Java Bug System
Recommended Posts