JavaRush /Java 博客 /Random-ZH /新 Java...再次...认识 Java 10

新 Java...再次...认识 Java 10

已在 Random-ZH 群组中发布
此前,开发人员等待新的 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