JavaRush /Java Blog /Random-TW /新 Java...再...認識 Java 10

新 Java...再...認識 Java 10

在 Random-TW 群組發布
先前,開發人員等待新的 Java 已經有好幾年了,有的充滿恐懼,有的充滿希望。時代已經改變了,每六個月就會有新版本的 JDK 令我們高興。如果您還不清楚這會導致什麼,請查看專家的意見,在這裡我們將列出 Java 10(我們最喜歡的語言的最新版本)的主要變更。 新 Java...再...認識 Java 10 - 1新「功能」之前的方括號中標明了 JEP 編號,即「JDK 增強提案」。JEP 是一項改進 OpenJDK 的提案,可能會被批准、延遲或拒絕。也就是說,本質上,JEP 的集合是 OpenJDK 的一種開發策略。

Java 10 的重要特性

[286] 局部變數類型推斷- 提議將 var 關鍵字引入 Java,從而無需明確指定局部變數的類型。也就是說,現在你不能指定初始化變數的型別,而是寫類似:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
這消除了我們之前必須使用的 ArrayList<String> 類型定義的重複。有趣的是,var 並沒有成為關鍵字,而是保留類型。也就是說,您可以使用 var 作為變數、方法或套件的名稱。但你不能那樣命名類別(真是損失啊!)。 [296] 將 JDK 林合併到單一儲存庫。JDK 9 有八個儲存庫 - root、corba、hotspot、jaxp、jaxws、jdk、langtools、nashorn。在 Java 10 中,整個森林將合併到一個儲存庫中,以便可以跨相互依賴的變更集的儲存庫執行原子提交。 [304]垃圾收集器介面不是開發者可以用來控制垃圾收集的介面。相反,我們在 JVM 原始程式碼中獲得了一個乾淨的垃圾收集器接口,使您可以快速輕鬆地整合替代收集器。那些夢想將自己的垃圾收集器添加到 JVM 的人將會對這項改進感到非常滿意。 [307] G1 垃圾收集器的平行完整 GC。在 JDK 9 中,G1 成為預設的垃圾收集器,而先前預設的垃圾收集器是並行 GC,它可以跨多個執行緒收集垃圾。現在 G1 也可以做到這一點;以前它是在一個線程中完成的,這有時會造成困難。順便說一句,開發人員將能夠使用 - XX:ParallelGCThreads. [310] 應用程式類別資料共享參數來配置線程數- Java 10 中採用的這一開發提供了改進的加載和跟踪,擴展了現有的類別共享(CDS)功能允許應用程式類別位於通用存檔中。 類別資料共享(簡稱 CDS)適用於帶有 *class 副檔名的檔案。此功能可讓您選擇類別的某個子集,處理它們並將它們壓縮到特殊的檔案中。所有這些都是為了節省內存。通常,JVM 的不同實例會載入標準庫中包含的相同類別。CDS 允許所有這些 JVM 實例共用一個包含放置在其中的類別的存檔。這減少了程式載入時間和記憶體使用量。事實上,從版本 5 開始,當多個 JVM 在同一實體或虛擬機器上運行時,CDS 可以提高 JVM 啟動效能並減少資源佔用。但早期 CDS 的使用僅限於引導程式。現在,一個名為 Application CDS 的擴充版本可讓您載入帶有其他載入器類別的特殊檔案。 [312] 執行緒本地握手是 JVM 內部相當低階的更改,它將允許跨執行緒執行回調,而無需執行全域 VM 安全點。這將允許您無成本地停止單個線程,而不是一次停止所有線程(或根本不停止)。 [313]刪除本機標頭產生工具 (javah)。早在 Java 9 中,語言開發人員就開始積極刪除不必要的工具,JEP 313 繼續了這項出色的工作。如果程式碼中有本機方法,javah 工具會產生 JNI 標頭。健康?當然可以,但從 JDK 8 開始,本機 javac 編譯器本身就可以產生 JNI 標頭。所以現在他們決定擺脫javah。順便說一句,巴拿馬計畫目前正在開發中,特別是可以取代JNI。 [314] 其他 Unicode 語言標籤擴充功能此變更旨在改善 java.util.Locale 類別和相關 API,以實現 BCP 47 語言標籤的其他 Unicode 擴充。特別是貨幣類型 (cu) 的標籤,第一天現在支援週(fw)、地區(rg) 和時區(tz) 覆蓋。 [316] 替代記憶體裝置上的堆分配這項創新將幫助那些使用 DRAM 以外的記憶體類型的使用者。由於技術不斷變化,使用具有與 DRAM 相同的介面和效能特徵的非揮發性記憶體已成為當今的客觀現實。因此,JEP 316 允許 JVM 將堆放置在其他類型的記憶體中。 [317] 實驗性基於 Java 的 JIT 編譯器。最近宣布了 Metropolis 項目,該項目提議用 Java 重寫大部分 JVM。如果您不知道,目前版本是用 C++ 編寫的。好吧,如果您已經了解情況,那麼一開始您可能會覺得這樣的想法很奇怪。既然JVM是用Java寫的,那麼執行JVM就不需要JVM了嗎?這就是遞歸,讓人想起彼此相對的鏡子。然而,現實情況有些不同:僅僅因為 JVM 是用 Java 編寫的,並不意味著您必須將其編譯為字節碼。實際上,您可以使用 AOT 編譯,然後 JIT 編譯程式碼,以提高效能。

javac 等工具通常用於編譯 Java 程式碼。它將 Java 程式轉換為一組帶有字節碼的類別檔案。接下來,JVM 運行字節碼,其解釋器將它們轉換為處理器指令。除了解釋器之外,JVM 還具有內建編譯器,它還可以從字節碼為處理器建立指令。這就是所謂的運行時編譯,啟動時編譯。通常最常用的程式碼都會經過這樣的編譯——這會提高效能。

編譯器可以以不同的方式執行操作:JIT 編譯(即時)- 動態,在程式執行期間​​,或 AOT 編譯(提前)- 在執行之前。

jaotc AOT編譯器是在JDK 9中引入的。目前,Hotspot JVM包含兩個JIT編譯器,C1(用於速度)和C2(用於最佳化)。

JEP 317 引入了 Graal 研究項目,這是 JDK 的編譯器。這是一個一定的基礎,將有助於使 Metropolis 成為現實,並使 JVM 在效能上能夠匹配(甚至超越)目前用 C++ 編寫的版本。 [319] 根憑證是 JDK 中預設的憑證授權單位 (CA) 憑證集。TLS 等關鍵安全元件現在預設在 OpenJDK 版本中運作。這項有用的補充可能是 Oracle 為確保 OpenJDK 二進位檔案和 Oracle JDK 二進位檔案在功能上相同而採取的措施的一部分。 [322] 基於時間的發布版本控制- 在 Java 10 中,新功能將添加到功能版本中,錯誤將在更新版本中修復。本質上,我們有一種新的方法來設定 JDK 版本字串格式。它修復了 JDK 9 中一個相當奇怪的情況。第一個更新是 JDK 9.0.1,這是非常合乎邏輯的。第二次更新是JDK 9.0.4,這是不合邏輯的。其邏輯是,在 JDK 9 版本編號方案中,更新之間會留有空間,以防發生緊急、計劃外更新。既然沒有必要更新,為什麼不直接稱之為 JDK 9.0.2呢?新的 Java 版本格式如下圖所示:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

新 API

JDK 10 標準類別庫新增了 73 個。
  • java.awt.工具包

    int getMenuShortcutKeyMaskEx ():定義哪個擴充修改鍵是快捷選單對應的加速鍵。

  • java.awt.geom.Path2D:

    void trimToSize ():將此實例的容量削減Path2D至目前大小。應用程式可以使用此操作來最小化路徑儲存。相同的方法已新增至內部類別Path2D.DoublePath2D.Float

  • java.io.ByteArrayOutputStream:

    String toString (Charset):重載toString,透過使用指定的編碼解碼字節,將緩衝區的內容轉換為字串。

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

    這兩個類別都有三個帶有附加參數的新建構函數charset

  • java.io.Reader:

    long transferTo (Writer):從此讀取器讀取所有字符,並按照讀取順序將字符寫入給定寫入器。

  • java.lang.Runtime.版本:

    為新版本 (JEP 322) 字串欄位傳回整數值的四個新方法:feature ()interim ()和。patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • 字串 getDescriptor():

    傳回此堆疊幀表示的方法的句柄,如 Java 虛擬機器規格所定義。

  • 字串 getMethodType():

    returns MethodType,表示堆疊幀所表示的方法的參數類型和傳回類型。

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

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

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

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

  • java.time.format.DateTimeFormatter:

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

  • java.util:

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

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

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

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

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

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

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

  • java.util.Properties:

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

  • java.SplittableRandom:

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

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «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-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

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

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

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

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

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