各位老铁们,大家好,今天由我来为大家分享家务管理网站源码分享下载,以及家务管理1+x的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
Java10是采用新发布周期的第一个版本,提供了109项新特性,其中最备受关注的莫过于局部变量的类型推断。
Java10的12项关键新特性:
JEP286:局部变量的类型推断。该特性在社区讨论了很久并做了调查,可查看JEP286调查结果
JEP296:将JDK的多个代码仓库合并到一个储存库中
JEP304:垃圾收集器接口。通过引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性。
JEP307:向G1引入并行FullGC
JEP310:应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展,以允许应用类放置在共享存档中
JEP312:线程局部管控。允许停止单个线程,而不是只能启用或停止所有线程
JEP313:移除Native-HeaderGenerationTool(javah)
JEP314:额外的Unicode语言标签扩展。包括:cu(货币类型)、fw(每周第一天为星期几)、rg(区域覆盖)、tz(时区)等
JEP316:在备用内存设备上分配堆内存。允许HotSpot虚拟机在备用内存设备上分配Java对象堆
JEP317:基于Java的JIT编译器(试验版本)
JEP319:根证书。开源JavaSERootCA程序中的根证书
JEP322:基于时间的版本发布模式。“Featurereleases”版本将包含新特性,“Updatereleases”版本仅修复Bug
Java10的109项新特性一出,社区就有热心用户翻译成了中文版,在此感谢他们的努力,下面我们来看看这109项新特性都有哪些?
原文:109NewFeaturesInJDK10
链接:https://www.azul.com/109-new-features-in-jdk-10/
译文:https://www.oschina.net/translate/109-new-features-in-jdk-10
译者:雪落无痕xdj,dreamanzhao,Tocy,machogyb,虚拟现实首席幻想师,rever4433
JDK10的109项新特性
突然然感觉JDK9发布才仅仅几周的时间,然而,随着新的OpenJDK的发布节奏,JDK10已经到达发布候选里程碑阶段。
我看过各种关于JDK10新特性的博客,但是它们都倾向于关注通过JEPS定义的大方面。这篇博文,我将看看是否可以罗列出JDK10中已经发生变化的方方面面(包括新增的和剔除的)。
有时候,我会做一些关于JavaSE的报告会。之前我在“JDK9的55个新特性”的报告会上曾开玩笑说:下次我将做的恐怕是“JDK10的5个新特性”。然而事实证明,即使仅有六个多月的开发时间,JDK10依然超乎想象。
即便我不再为Oracle工作,我也在此先做一个“安全港声明”,以便消除误会。这个列表是由下面这些公开可用的信息整理编辑的:JDKEnhancementProposals(JEPs)、theOpenJDKbugdatabase和JavaSE10publicreviewspecification(JSR383)。当然,尽管我已尽可能的研究以保证信息准确,但在JDK10最终发布之前仍可能会发生变化。
大事记
JDK10包含12个JEP(改善提议):
【286】局部变量类型推断:对于开发者来说,这是JDK10唯一的真正特性。它向Java中引入在其他语言中很常见的var,比如JavaScript。只要编译器可以推断此种类型,你不再需要专门声明一个局部变量的类型。一个简单的例子是:
varx=newArrayList<String>();
这就消除了我们之前必须执行的ArrayList<String>类型定义的重复。我鼓励你们去读JEP,因为上面有一些关于这个句法是否能用的规则。
有趣的是,需要注意var不能成为一个关键字,而是一个保留字。这意味着你仍然可以使用var作为一个变量,方法或包名,但是现在(尽管我确定你绝不会)你不能再有一个类被调用。
[310]应用类数据共享(CDS):CDS在JDK5时被引进以改善JVM启动的表现,同时减少当多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。
JDK10将扩展CDS到允许内部系统的类加载器、内部平台的类加载器和自定义类加载器来加载获得的类。之前,CDS的使用仅仅限制在了bootstrap的类加载器。
[314]额外的Unicode语言标签扩展:这将改善java.util.Locale类和相关的API以实现额外BCP47语言标签的Unicode扩展。尤其是,货币类型,一周的第一天,区域覆盖和时区等标签现在将被支持。
[322]基于时间的版本控制:正如我在之前的博客中所讨论的,我们的JDK版本字符串格式几乎与JDK版本一样多。有幸的是,这是最后需要使用到的,我们可以坚持用它。这种格式使用起来很像JDK9中介绍的提供一个更加语义的形式。有一件困扰我的事是包含了一个INTERIM元素,正如JEP提议中所说,“永远是0”。好吧,如果永远是0,那它有什么意义呢?他们说这是为未来使用做保留,但我仍不是很赞同。我认为,这有些冗余繁杂。
这也消除了在JDK9中有过的相当奇怪的情形。第一次更新是JDK9.0.1,非常符合逻辑。第二次更新是JDK9.0.4,不合逻辑。原因是,在JDK9的版本计数模式下,需要留下空白以便应急或不在预期安排的更新使用。但既然没有更新是必须的,为什么不简单称之为JDK9.0.2呢?
[319]根证书:在JDK中将提供一套默认的CA根证书。关键的安全部件,如TLS,在OpenJDK构建中将默认有效。这是Oracle正在努力确保OpenJDK二进制和OracleJDK二进制功能上一样的工作的一部分,是一项有用的补充内容。
[307]并行全垃圾回收器G1:G1是设计来作为一种低延时的垃圾回收器(但是如果它跟不上旧的堆碎片产生的提升速率的话,将仍然采用完整压缩集合)。在JDK9之前,默认的收集器是并行,吞吐,收集器。为了减少在使用默认的收集器的应用性能配置文件的差异,G1现在有一个并行完整收集机制。
[313]移除Native-Header自动生成工具:Java9开始了一些对JDK的家务管理,这项特性是对它的延续。当编译JNI代码时,已不再需要单独的工具来生成头文件,因为这可以通过javac完成。在未来的某一时刻,JNI将会被Panama项目的结果取代,但是何时发生还不清楚。
[304]垃圾回收器接口:这不是让开发者用来控制垃圾回收的接口;而是一个在JVM源代码中的允许另外的垃圾回收器快速方便的集成的接口。
[312]线程-局部变量管控:这是在JVM内部相当低级别的更改,现在将允许在不运行全局虚拟机安全点的情况下实现线程回调。这将使得停止单个线程变得可能和便宜,而不是只能启用或停止所有线程。
[316]在备用存储装置上的堆分配:硬件技术在持续进化,现在可以使用与传统DRAM具有相同接口和类似性能特点的非易失性RAM。这项JEP将使得JVM能够使用适用于不同类型的存储机制的堆。
[317]试验性的基于Java的JIT编译器:最近宣布的Metropolis项目,提议用Java重写大部分JVM。乍一想,觉得很奇怪。如果JVM是用Java编写的,那么是否需要一个JVM来运行JVM?相应的,这导致了一个很好的镜像类比。现实情况是,使用Java编写JVM并不意味着必须将其编译为字节码,你可以使用AOT编译,然后在运行时编译代码以提高性能。
这项JEP将Graal编译器研究项目引入到JDK中。并给将Metropolis项目成为现实,使JVM性能与当前C++所写版本匹敌(或有幸超越)提供基础。
[296]:合并JDK多个代码仓库到一个单独的储存库中:在JDK9中,有8个仓库:root、corba、hotspot、jaxp、jaxws、jdk、langtools和nashorn。在JDK10中这些将被合并为一个,使得跨相互依赖的变更集的存储库运行atomiccommit(原子提交)成为可能。
新API
有73项新增内容添加到了标准类库中。
java.awt.Toolkit
intgetMenuShortcutKeyMaskEx():确定哪个扩展修饰符键是菜单快捷键的适当加速键。
java.awt.geom.Path2D:
voidtrimToSize():将此Path2D实例的容量计算到它当前的大小。应用可使用此操作将路径的存储空间最小化。这个方法也被添加到Path2D.Double和Path2D.Float类。
java.io.ByteArrayOutputStream:
StringtoString(Charset):重载toString(),通过使用指定的字符集解码字节,将缓冲区的内容转换为字符串。
java.io.PrintStream:
lang.io.PrintWriter:
这两个类都有三个新的构造函数,它们需要额外的Charset参数。
java.io.Reader:
longtransferTo(Writer):从这个Reader中读取所有字符,并按照所读的顺序将字符写入给定的Writer。
java.lang.Runtime.Version:
有四种新方法返回新(JEP322)版本字符串字段的整数值:feature()、interim()、patch()和update()。
java.lang.StackWalker.StackFrame:
StringgetDescriptor():按照JVM标准返回此堆栈帧所代表的方法的描述符。
StringgetMethodType():返回此堆栈帧所代表的方法类型,描述参数类型和返回值类型。
java.lang.invoke.MethodType:
Class<?>lastParameterType():返回这个方法类型的最后一个参数类型。如果这个方法类型没有参数,则返回空类型作为岗哨值(SentinelValue)。
java.lang.management.RuntimeMXBean:
longgetPid():R返回正在运行的JVM的进程ID。
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:
这两个类都有新的重载的解码和编码方法,将charset作为附加参数。
java.nio.channels.Channels:
两个新的静态重载方法,允许使用Charset的newReader(ReadByteChannel,Charset)和newWriter(WriteByteChannel,Charset)。
java.nio.file.FileStore:
longgetBlockSize():在这个文件存储中返回每个块的字节数。
java.time.chrono:这个包里有三个类,HijrahEra、MiinguoEra和ThaiBuddhistEra,都有同样的方法。
StringgetDisplayName(TextStyle,Locale):这将返回用于识别era的文本名称,适合于向用户展示。
java.time.format.DateTimeFormatter:
localizedBy(Locale):返回指定格式器的一个副本,其中包含地区、日历、区域、小数和/或时区的本地化值,这将取代该格式器中的值。
java.util:DoubleSummaryStatistics、IntSummaryStatistics和LongSummaryStatistics都有一个新的构造函数,它包含4个数值。它使用指定的计数、最小值、最大值和总和构造一个非空实例。
java.util.List:
java.util.Map:
java.util.Set:这些接口中的每一个都增加了一个新的静态方法,copyOf(Collection)。这些函数按照其迭代顺序返回一个不可修改的列表、映射或包含给定集合的元素的集合。
java.util.Optional:
java.util.OptionalDouble:
java.util.OptionalInt:
java.util.OptionalLong:每一个类都有一个新的方法,orElseThrow(),它本质上和get()一样,也就是说,如果Optional有值则返回。否则,将抛出NoSuchElementException。
java.util.Formatter:
java.util.Scanner:
这两个类都有三个新的构造函数,除了其他参数之外,它们都带有一个charset参数。
java.util.Properties:这有一个新的构造函数,它接受一个int参数。这将创建一个没有默认值的空属性列表,并且指定初始大小以容纳指定的元素数量,而无需动态调整大小。还有一个新的重载的replace方法,接受三个Object参数并返回一个布尔值。只有在当前映射到指定值时,才会替换指定键的条目。
java.SplittableRandom:
voidnextBytes(byte[]):用生成的伪随机字节填充一个用户提供的字节数组。
java.util.concurrent.FutureTask:添加了toString()方法,该方法返回一个标识FutureTask的字符串,以及它的完成状态。在括号中,状态包含如下字符串中的一个,“CompletedNormally”、“CompletedExceptionally”、“Cancelled”或者“Notcompleted”。
java.util.concurrent.locks.StampedLock:
booleanisLockStamp(long):返回一个标记戳表示是否持有一个锁。
booleanisOptimisticReadStamp(long):返回一个标记戳代表是否成功的进行了乐观读(optimisticread)。
booleanisReadLockStamp(long):返回一个标记戳表示是否持有一个非独占锁(即readlock)。
booleanisWriteLockStamp(long):返回一个标记戳表示是否持有一个独占锁(即writelock)。
java.jar.JarEntry:
StringgetRealName():返回这个JarEntry的真实名称。如果这个JarEntry是一个多版本jar文件的入口,它被配置为这样处理,这个方法返回的名字是JarEntry所代表的版本条目的入口,而不是ZipEntry.getName()返回的基本条目的路径名。如果JarEntry不代表一个多版本jar文件的版本化条目或者jar文件没有被配置为作为一个多版本jar文件进行处理,这个方法将返回与ZipEntry.getName()返回的相同名称。
java.util.jar.JarFile:
Stream<JarEntry>versionedStream():返回jar文件中指定版本的入口对应Stream。与JarEntry的getRealName方法类似,这与多版本jar文件有关。
java.util.spi.LocaleNameProvider:
getDisplayUnicodeExtensionKey(String,Locale):为给定的Unicode扩展键返回一个本地化名称。
getDisplayUnicodeExtensionType(String,String,Locale):为给定的Unicode扩展键返回一个本地化名称。
java.util.stream.Collectors:
toUnmodifiableList():
toUnmodifiableSet():
toUnmodifiableMap(Function,Function):
toUnmodifiableMap(Function,Function,BinaryOperator):这四个新方法都返回Collectors,将输入元素聚集到适当的不可修改的集合中。
java.lang.model.SourceVersion:现在有了一个字段,它代表了JDK10的版本。
java.lang.model.util.TypeKindVisitor6:
javax.lang.model.util.TypeKindVisitor9:
(我必须承认,我从来没听说过这些类)
RvisitNoTypeAsModule(NoType,P):访问一个MODULE的pseudo-type。我不确定为什么只有这两个类得到这个方法,因为还有Visitor7和Visitor8变量。
javax.remote.management.rmi.RMIConnectorServer:
这个类已经添加了两个字段:CREDENTIALS_FILTER_PATTERN和SERIAL_FILTER_PATTERN。
javax.ButtonModel:看,Swing还在更新!
ButtonGroupgetGroup():返回按钮所属的组。通常用于单选按钮,它们在组中是互斥的。
javax.plaf.basic.BasicMenuUI:
DimensiongetMinimumSize(JComponent):返回指定组件适合观感的最小大小。
JVM规范改动
这些改动相当小:
4.6节:类文件格式(第99页)。在方法访问标志方面有小的改动。
4.7节:模块属性(第169页)。如果模块不是java.base,则JDK10不再允许设置ACC_TRANSITIVE或ACC_STATIC_PHASE。
4.10节:类文件的校验(第252页)。dup2指令已改变了typesafeform1的定义,颠倒了canSafleyPushList一节中类型的顺序(你需要仔细查看才能发现它)。
5.2节:Java虚拟机启动(第350页)。该描述添加了在创建初始类或接口时可使用用户定义的类加载器(bootstrap类加载器除外)。
对Java语言规范的更改
这里还有一些更改,但主要是为了支持局部变量类型推断。
第3.8节:标识符(第23页)。在忽略了可忽略的字符之后,标识符的等价性现在被考虑了。这似乎是合乎逻辑的。
(第24页)一个新的Token,TypeIdentifier,它支持对局部变量类型推断的新用法,而var的使用不是关键字,而是一个具有特殊含义的标识符,作为局部变量声明的类型。
第4.10.5节:类型预测(第76页)。这是一个相当复杂的部分,它涉及到捕获变量、嵌套类以及如何使用局部变量类型推断。我建议你阅读规范中的这一部分,而不是试图解释它。
第6.1节:声明(第134页)。一个反映使用TypeIdentifier来支持局部变量类型的推断的小改动。
第6.5节:确定名字的含义(第153页,第158页和第159页)。根据类型标识符的使用而更改类类型。
第6.5.4.1:简单的PackageOrTypeNames(第160页)
第6.5.4.2节:合规的PackageOrTypeNames(第160页)。这两种方式都与使用TypeIdentifier有细微的变化。
第7.5.3:单静态导入声明(第191页)。这改变了导入具有相同名称的静态类型的规则。除非类型是相同的,否则这将成为一个错误,在这种情况下,重复被忽略。
第7.7.1:依赖(第198页)。如果你明确声明一个模块需要java.base,那在必要的关键字之后,你就不能再使用修饰符(例如静态)了。
第8部分:正式参数(第244页)。接收者参数可能只出现在一个实例方法的formalparameters列表,或者是一个内部类的构造函数中,其中内部类没有在静态上下文中声明。
第9.7.4节:注释可能出现的地方(第335页)。有一个与局部变量类型推断相关的变更。
第14.4部分:局部变量声明语句(第433页)。实现局部变量类型推断所需的大量更改。
第14节:增强的for语句(第455页)。这个结构已经更新,包括对局部变量类型推断的支持。
第14.20.3节:try-with-resources(474页)。这个结构已经更新,包括对局部变量类型推断的支持。
最后,第19章有多处语法更新,反映了应更多使用TypeIdentifier类型标识符,而不仅仅是Identifier标识符,以支持局部变量类型推断。
杂项
如果Kerberos的配置文件krb5.conf包含一个INCLUDEDIR选项,那么在INCLUDEDIR这个目录下所有以.conf结尾的文件都会被默认加载进来。
以前版本中已经过期的Java的启动选项-d32和–d64在当前版本已经被移除。如果你在新的版本里仍然使用了这两个选项,JVM将无法正常启动。
JDK10支持JDK9中的新版本Doclet,JDK6、JDK7、JDK8中的Doclet版本都不再支持。
JDK10重新启用了在JDK9中被不当过时的newFactory()方法。
JDK10引入了一个新的Javadoc标签:{@summary…},解决了以前版本无法生成API摘要的问题。
JDK10去掉了BiasedLockingStartupDelay的4秒启动延时。
以下在com.sun.security.auth包中的过时的类在新版本中都已经被移除:
PolicyFile
SolarisNumericGroupPrincipal
SolarisNumericUserPrincipal
X500Principal
SolarisLoginModule
SolarisSystem
在java.lang.SecurityManager类中的以下属性和方法(从JDK1.2就已经过时)终于被移除了:
inCheck(属性)
getInCheck
classDepth
classLoaderDepth
currentClassLoader
currentLoadedClass
inClass
inClassLoader
以下java.lang.Runtime类中已经被废弃的国际化方法在新版本被移除:
getLocalizedInputStream
getLocalizedOutputStream
以下废弃的Hotspot–X选项在新版本中被移除:-Xoss,-Xsqnopause,-Xoptimize,-Xboundthreadsand–Xusealtsigs.
policytool在新版本中被移除。
javadoc工具在新版本中可以通过–add-stylesheets命令选项支持多个stylesheets。
新版本的JVM能够根据系统分配给当前Docker容器的CPU数和内存来配置线程池和GC机制,而不再是直接使用系统的CPU和内存。并且增加了三个更强大的命令选项:-XX:InitialRAMPercentage、-XX:MaxRAMPercentage和-XX:MinRAMPercentage。
新版本增加了一个新的系统属性:jdk.disableLastUsageTracking。这个新增的属性就像它的名字一样,会禁用JRE的上一次使用跟踪。
如上所述,尽管距离JDK9发布仅有六个月的时间,但JDK10实际上有相当多的变化。当然,它们中的一些是非常小的变更,但我认为这表明目前每6个月发布一次的节奏,将在Java平台快速迭代改进方面起到作用。
同时也让我们期待JDK11将带来些什么…
相关链接
JDK10安装指南:
http://docs.oracle.com/javase/10/docs/technotes/guides/install/install_overview.html
JDK10发布说明:
http://www.oracle.com/technetwork/java/javase/documentation/10u-relnotes-4108739.html
新特性:
http://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html#NewFeature
ReadMe:
http://www.oracle.com/technetwork/java/javase/documentation/jdk10-readme-4419830.html
如果你还想了解更多这方面的信息,记得收藏关注本站。
