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(用于优化)。 |
[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.Double
和Path2D.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
orSet
, содержащие элементы данной коллекции, в своем порядке итерации. -
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)
: возвращает минимальный размер указанного компонента, подходящий для внешнего вида.
What еще почитать? |
---|
GO TO FULL VERSION