JavaRush /Java-Blog /Random-DE /Neues Java... Schon wieder... Lernen Sie Java 10 kennen

Neues Java... Schon wieder... Lernen Sie Java 10 kennen

Veröffentlicht in der Gruppe Random-DE
Zuvor warteten Entwickler mehrere Jahre lang auf ein neues Java, manche mit Entsetzen, manche mit Hoffnung. Die Zeiten haben sich geändert und alle sechs Monate werden uns neue Versionen des JDK begeistern. Wenn Ihnen noch nicht klar ist, wozu das führen wird, schauen Sie sich die Meinung des Experten an . Hier listen wir die wichtigsten Änderungen in Java 10 auf – der neuesten Version unserer Lieblingssprache. Neues Java... Schon wieder... Lernen Sie Java 10 - 1 kennenIn eckigen Klammern vor dem neuen „Feature“ wird die JEP-Nummer angegeben, also „JDK Enchancement Proposal“. JEP ist ein Vorschlag zur Verbesserung von OpenJDK und kann genehmigt, verzögert oder abgelehnt werden. Das heißt, im Wesentlichen ist eine Sammlung von JEPs eine Entwicklungsstrategie für OpenJDK.

Wichtige Funktionen von Java 10

[286] Local-Variable Type Inference – Ein Vorschlag zur Einführung des Schlüsselworts var in Java, wodurch die Notwendigkeit entfällt, den Typ einer lokalen Variablen explizit anzugeben. Das heißt, Sie können jetzt nicht den Typ der initialisierten Variablen angeben, sondern etwas schreiben wie:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Dadurch entfällt die Duplizierung der ArrayList<String>-Typdefinition, die wir zuvor hätten verwenden müssen. Es ist interessant festzustellen, dass var kein Schlüsselwort wird, sondern ein reservierter Typ ist. Das heißt, Sie können var als Namen einer Variablen, Methode oder eines Pakets verwenden. Aber Sie können die Klasse nicht so benennen (was für ein Verlust!). [296] Zusammenführen der JDK-Gesamtstruktur in einem einzigen Repository . JDK 9 verfügt über acht Repositorys: Root, Corba, Hotspot, Jaxp, Jaxws, JDK, Langtools, Nashorn. In Java 10 wird diese gesamte Gesamtstruktur in einem einzigen Repository zusammengefasst, um die Durchführung von atomaren Commits über Repositorys mit voneinander abhängigen Änderungssätzen hinweg zu ermöglichen. [304] Die Garbage-Collector-Schnittstelle ist keine Schnittstelle, die von Entwicklern zur Steuerung der Garbage Collection verwendet werden kann. Stattdessen erhalten wir eine saubere Garbage-Collector-Schnittstelle im JVM-Quellcode, die es Ihnen ermöglicht, alternative Collectors schnell und einfach zu integrieren. Diejenigen, die davon geträumt haben, der JVM einen eigenen Garbage Collector hinzuzufügen, werden mit dieser Verbesserung am meisten zufrieden sein. [307] Paralleler vollständiger GC für den G1-Garbage Collector . In JDK 9 wurde G1 zum Standard-Garbage Collector, während zuvor Parallel GC der Standard-Garbage Collector war, der Müll über mehrere Threads hinweg sammeln konnte. Jetzt kann G1 dies auch tun; zuvor tat es dies in einem Thread, was manchmal zu Schwierigkeiten führte. Übrigens können Entwickler die Anzahl der Threads mithilfe des Parameters - XX:ParallelGCThreads. [310] Application Class-Data Sharing konfigurieren . Diese in Java 10 übernommene Entwicklung bietet verbessertes Laden und Tracking und erweitert die vorhandene Class Sharing (CDS)-Funktion um zu ermöglichen, dass sich Anwendungsklassen im allgemeinen Archiv befinden. Class-Data Sharing oder kurz CDS funktioniert mit Dateien mit der Erweiterung *class. Mit dieser Funktion können Sie eine bestimmte Teilmenge von Klassen auswählen, verarbeiten und in ein spezielles Archiv komprimieren. All dies geschieht, um Speicherplatz zu sparen. Oft laden verschiedene Instanzen der JVM dieselben Klassen, die in der Standardbibliothek enthalten sind. Und CDS ermöglicht allen diesen JVM-Instanzen die gemeinsame Nutzung eines einzigen Archivs mit darin platzierten Klassen. Dies reduziert sowohl die Ladezeit des Programms als auch den Speicherverbrauch. Tatsächlich verbessert CDS ab Version 5 die JVM-Startleistung und reduziert den Ressourcenbedarf, wenn mehrere JVMs auf derselben physischen oder virtuellen Maschine ausgeführt werden. Früher war die Verwendung von CDS jedoch nur auf den Bootstrap-Loader beschränkt. Mit einer erweiterten Version namens Application CDS können Sie jetzt spezielle Archive mit Klassen für andere Loader laden. [312] Thread-Lokale Handshakes sind eine relativ einfache Änderung innerhalb der JVM, die es ermöglicht, Rückrufe über Threads hinweg auszuführen, ohne einen globalen VM-Sicherheitspunkt auszuführen. Auf diese Weise können Sie einzelne Threads kostenlos stoppen, anstatt alle auf einmal (oder gar keine). [313] Entfernen Sie das Native-Header-Generierungstool (javah) . Bereits in Java 9 begannen Sprachentwickler, unnötige Tools aktiv zu entfernen, und JEP 313 setzt diese gute Arbeit fort. Das Javah-Tool generiert JNI-Header, wenn der Code native Methoden enthält. Gesund? Natürlich, aber der native Javac-Compiler kann ab JDK 8 selbst JNI-Header generieren. Nun beschlossen sie, Javah loszuwerden. Derzeit wird übrigens das Panama- Projekt entwickelt , das insbesondere JNI ersetzen kann. [314] Zusätzliche Unicode-Sprach-Tag-Erweiterungen Diese Änderung soll die Klasse java.util.Locale und zugehörige APIs verbessern, um zusätzliche Unicode-Erweiterungen für BCP 47-Sprach-Tags zu implementieren. Insbesondere Tags für den Währungstyp (cu), Tag eins Es werden nun Wochen- (fw), Regions- (rg) und Zeitzonenüberschreibungen (tz) unterstützt. [316] Heap-Zuweisung auf alternativen Speichergeräten Diese Innovation wird denjenigen helfen, die andere Speichertypen als DRAM verwenden. Da sich die Technologien ständig ändern, ist die Verwendung von nichtflüchtigen Speichern mit der gleichen Schnittstelle und den gleichen Leistungsmerkmalen wie DRAM heute eine objektive Realität. Daher ermöglicht JEP 316 der JVM, einen Heap in anderen Speichertypen zu platzieren. [317] Experimenteller Java-basierter JIT-Compiler . Kürzlich wurde das Metropolis-Projekt angekündigt, das vorschlägt, den Großteil der JVM in Java neu zu schreiben. Falls Sie es nicht wussten: Die aktuelle Version ist in C++ geschrieben. Nun, wenn Sie sich bereits auskennen, wird Ihnen eine solche Idee zunächst wahrscheinlich seltsam vorkommen. Da die JVM in Java geschrieben ist, benötigen Sie nicht eine JVM, um die JVM auszuführen? Dies ist die Rekursion, die an einander gegenüberliegende Spiegel erinnert. Die Realität sieht jedoch etwas anders aus: Nur weil die JVM in Java geschrieben ist, heißt das nicht, dass Sie sie in Bytecodes kompilieren müssen. Sie können tatsächlich die AOT-Kompilierung verwenden und dann JIT den Code kompilieren, während er arbeitet, um die Leistung zu verbessern.

Zum Kompilieren von Java-Code wird üblicherweise ein Tool wie Javac verwendet. Es konvertiert ein Java-Programm in eine Reihe von Klassendateien mit Bytecodes. Als nächstes führt die JVM Ihren Bytecode aus und sein Interpreter wandelt ihn in Prozessoranweisungen um. Neben dem Interpreter verfügt die JVM auch über einen integrierten Compiler und kann aus Bytecode auch Anweisungen für den Prozessor erstellen. Dies ist die sogenannte Laufzeitkompilierung, die Kompilierung beim Start. Normalerweise wird der Code, der am häufigsten verwendet wird, einer solchen Kompilierung unterzogen – dies verbessert die Leistung.

Der Compiler kann Aktionen auf unterschiedliche Weise ausführen: JIT-Kompilierung (Just-in-Time) – dynamisch, direkt während der Programmausführung, oder AOT-Kompilierung (Ahead-of-Time) – vor der Ausführung.

Der jaotc AOT-Compiler wurde in JDK 9 eingeführt. Derzeit enthält die Hotspot-JVM zwei JIT-Compiler, C1 (für Geschwindigkeit) und C2 (für Optimierung).

JEP 317 stellt das Graal-Forschungsprojekt vor, einen Compiler für das JDK. Dies ist eine gewisse Grundlage, die dazu beitragen wird, Metropolis Wirklichkeit werden zu lassen und es der JVM zu ermöglichen, in der Leistung mit der aktuellen, in C++ geschriebenen Version mitzuhalten (oder sie besser noch zu übertreffen). [319] Stammzertifikate sind der Standardsatz von Standardzertifikaten der Zertifizierungsstelle (CA) im JDK. Kritische Sicherheitskomponenten wie TLS funktionieren jetzt standardmäßig in OpenJDK-Builds. Diese nützliche Ergänzung ist wahrscheinlich Teil dessen, was Oracle unternimmt, um sicherzustellen, dass OpenJDK-Binärdateien und Oracle JDK-Binärdateien funktional identisch sind. [322] Zeitbasierte Release-Versionierung – in Java 10 werden neue Features zu Feature-Releases hinzugefügt und Fehler werden in Update-Releases behoben. Im Wesentlichen haben wir eine neue Möglichkeit, JDK-Versionszeichenfolgenformate festzulegen. Es behebt eine ziemlich seltsame Situation mit JDK 9. Das erste Update war JDK 9.0.1, was ziemlich logisch ist. Das zweite Update ist JDK 9.0.4, was unlogisch ist. Die Logik besteht darin, dass innerhalb des JDK 9-Versionsnummerierungsschemas für den Fall eines Notfalls, eines ungeplanten Updates, Platz zwischen den Aktualisierungen bleibt. Da das Update nicht notwendig war, warum nennen wir es nicht einfach JDK 9.0.2? Und so sieht das neue Java-Versionsformat aus:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Neue APIs

Es gibt 73 Ergänzungen zu den JDK 10-Standardklassenbibliotheken.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): Definiert, welche erweiterte Zusatztaste die entsprechende Zugriffstaste für das Kontextmenü ist.

  • java.awt.geom.Path2D:

    void trimToSize (): Reduziert die Kapazität dieser Instanz Path2Dauf ihre aktuelle Größe. Eine Anwendung kann diesen Vorgang verwenden, um den Pfadspeicher zu minimieren. Die gleiche Methode wurde den inneren Klassen Path2D.Doubleund hinzugefügt Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): überladen toString, wandelt den Inhalt eines Puffers in eine Zeichenfolge um, indem die Bytes mit der angegebenen Kodierung dekodiert werden.

  • java.io.PrintStream und lang.io.PrintWriter:

    Beide Klassen verfügen über drei neue Konstruktoren, die ein zusätzliches Argument akzeptieren charset.

  • java.io.Reader:

    long transferTo (Writer): Liest alle Zeichen von diesem Reader und schreibt die Zeichen in der Reihenfolge, in der sie gelesen werden, an den angegebenen Writer.

  • java.lang.Runtime.Version:

    Vier neue Methoden, die einen ganzzahligen Wert für die neue Version ( JEP 322) von Zeichenfolgenfeldern zurückgeben: feature (), und .interim ()patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • String getDescriptor():

    gibt ein Handle für die durch diesen Stapelrahmen dargestellte Methode zurück, wie in der Java Virtual Machine Specification definiert.

  • String getMethodType():

    return MethodTypestellt die Parametertypen und den Rückgabetyp für die durch den Stapelrahmen dargestellte Methode dar.

  • java.lang.invoke.MethodType:

    Klasse<?> LastParameterType(): Gibt den letzten Parametertyp dieses Methodentyps zurück. Wenn dieser Typ keine Parameter hat, wird stattdessen der Wert zurückgegeben sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid ()pidgibt die laufende Java Virtual Machine zurück .

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int):gibt Thread-Informationen für alle Echtzeit-Threads mit einem Stack-Trace mit der angegebenen maximalen Anzahl von Elementen und Timing-Informationen zurück.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    gibt Thread-Informationen für jeden Thread zurück, dessen Identifikation sich im Eingabearray befindet, mit einem Stack-Trace der angegebenen maximalen Anzahl von Elementen und Synchronisierungsinformationen.

  • java.lang.reflect.MalformedParameterizedTypeException:

    Es wurde ein neuer Konstruktor hinzugefügt, der eine ausführliche Nachricht als Zeichenfolge als Parameter akzeptiert.

  • java.net.URLDecoder und java.net.URLEncoder:

    Beide Klassen verfügen über neue überladene Decodierungs- und Codierungsmethoden, die charsetals zusätzlicher Parameter verwendet werden.

  • java.nio.channels.Channels:

    Zwei neue statische überladene Methoden newReader (ReadByteChannel, Charset)und newWriter (WriteByteChannel, Charset), mit denen Sie charset.

  • java.nio.file.FileStore:

    long getBlockSize (): Gibt die Anzahl der Bytes pro Block in diesem Dateispeicher zurück.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получoder метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / oder часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получoder новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map oder Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если Zustand выполняется, Bedeutung возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получoder три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная Ausführung метода replace, которая принимает три параметра Object и возвращает логическое Bedeutung.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив Byteов с генерируемыми псевдослучайными Byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) oder «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-Datei, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-Dateiми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): Gibt den lokalisierten Namen dafür zurück Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): Gibt den lokalisierten Namen dafür zurück Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator)– Diese vier neuen Methoden geben Collectors zurück, die die Eingabeelemente in einer entsprechenden nicht änderbaren Sammlung sammeln.

  • java.lang.model.SourceVersion:

    Dies ist jetzt ein RELEASE_10-Feld zur Darstellung der JDK 10-Version.

  • java.lang.model.util.TypeKindVisitor6 und javax.lang.model.util.TypeKindVisitor9:

    etwas nicht ganz klar :).

  • R visitNoTypeAsModule(NoType, P):

    Besuche Pseudotyp MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    Dieser Klasse wurden zwei Felder hinzugefügt: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Ratet mal, Swing wird immer noch aktualisiert!

  • ButtonGroup getGroup():

    gibt die Gruppe zurück, zu der die Schaltfläche gehört. Wird normalerweise mit verwendet radio buttons, die sich innerhalb ihrer Gruppe gegenseitig ausschließen.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): Gibt die Mindestgröße der angegebenen Komponente zurück, die für das Erscheinungsbild geeignet ist.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION