1. 首页
  2. IT资讯

重磅!Java 10 正式发布,它将影响你的代码!

“u003Cdivu003Eu003Cpu003E去年 9 月,Oracle 将 Java 大版本周期从原来的 2-3 年,调整成每半年发布一个大的版本。u003Cu002Fpu003Eu003Cpu003E3 月 21 日,Java 新版本如期而至,Oracle 官方宣布 Java 10 正式发布,引发了业内的关注。u003Cu002Fpu003Eu003Cpu003E这意味着,作为一个Java开发,你使用的编程语言,每半年都会有一个新的版本出来,这无疑是一件好事儿。u003Cu002Fpu003Eu003Cpu003E随着新技术的不断退出,对于开发者的挑战也就越来越大,而最大的挑战就是如何保证自己了解最新的技术。u003Cu002Fpu003Eu003Cpu003E所以今天我们就来了解一下Java 10 这个新版本。u003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F15222911990680f0921f468″ img_width=”640″ img_height=”331″ alt=”重磅!Java 10 正式发布,它将影响你的代码!” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E u003Cstrongu003E java 10 的12项关键新特性u003Cu002Fstrongu003Eu003Cbru003Eu003Cu002Fpu003Eu003Cpu003EJava 10 是采用新发布周期的第一个版本,提供了 109 项新特性,其中最受关注的莫过于包括局部变量的类型推断所在内的 12 项关键新特性。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 286:局部变量类型推断u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E对于开发者来说,这是 JDK 10 唯一的真正特性。它向 Java 中引入在其他语言中很常见的 var,比如 JavaScript 。只要编译器可以推断此种类型,你就不再需要专门声明一个局部变量的类型。一个简单的例子是:u003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F152229033781790132521f9″ img_width=”635″ img_height=”36″ alt=”重磅!Java 10 正式发布,它将影响你的代码!” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E这就消除了我们之前必须执行的 ArrayList<String> 类型定义的重复。我鼓励你们去读 JEP ,因为上面有一些关于这个句法是否能用的规则。u003Cu002Fpu003Eu003Cpu003E有趣的是,需要注意 var 不能成为一个关键字,而是一个保留字。这意味着你仍然可以使用 var 作为一个变量、方法或包名,但是现在不能再调用类。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 310:应用类数据共享(CDS)u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003ECDS 在 JDK 5 时被引进以改善 JVM 启动的表现,同时减少当多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。u003Cu002Fpu003Eu003Cpu003EJDK 10 将扩展 CDS 到允许内部系统的类加载器、内部平台的类加载器和自定义类加载器来加载获得的类。之前,CDS 的使用仅仅限制在了 bootstrap 的类加载器。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 314:额外的 Unicode 语言标签扩展u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E这将改善 java.util.Locale 类和相关的 API 以实现额外 BCP 47 语言标签的 Unicode 扩展。尤其是货币类型,区域覆盖和时区等标签现在将被支持。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 322:基于时间的版本控制u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003EJDK 版本字符串格式几乎与 JDK 版本一样多。有幸的是,这是最后需要使用到的,我们可以坚持用它。这种格式使用起来很像 JDK 9 中介绍的提供一个更加语义的形式。但其中包含了一个 INTERIM 元素,正如 JEP 提议中所说的“永远是 0”。好吧,如果永远是 0,那它有什么意义呢?他们说这是为未来使用做保留,但我仍不是很赞同。我认为,这有些冗余繁杂。u003Cu002Fpu003Eu003Cpu003E这也消除了在 JDK 9 中有过的相当奇怪的情形。第一次更新是 JDK 9.0.1 , 非常符合逻辑。第二次更新是 JDK 9.0.4 ,不合逻辑。原因是,在 JDK 9 的版本计数模式下,需要留下空白以便应急或不在预期安排的更新使用。但既然没有更新是必须的,为什么不简单称之为 JDK 9.0.2 呢?u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 319:根证书u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E在 JDK 中将提供一套默认的 CA 根证书。关键的安全部件,如 TLS ,在 OpenJDK 构建中将默认有效。Oracle 正在努力确保 OpenJDK 二进制和 Oracle JDK 二进制功能一致,这是一项有用的补充内容。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 307:并行全垃圾回收器 G1u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003EG1 是设计来作为一种低延时的垃圾回收器(但是如果它跟不上旧的堆碎片产生的提升速率的话,将仍然采用完整压缩集合)。在 JDK 9 之前,默认的收集器是并行、吞吐、收集器。为了减少在使用默认的收集器的应用性能配置文件的差异,G1 现在有一个并行完整收集机制。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 313:移除 Native-Header 自动生成工具u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003EJava 9 开始了一些对 JDK 的家务管理,这项特性是对它的延续。当编译 JNI 代码时,已不再需要单独的工具来生成头文件,可以通过 javac 完成。在未来的某一时刻,JNI 将被 Panama 项目的结果取代。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 304:垃圾回收器接口u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E这不是让开发者用来控制垃圾回收的接口,而是一个在 JVM 源代码中的允许另外的垃圾回收器快速方便的集成的接口。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 312:线程—局部变量管控u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E这是在 JVM 内部相当低级别的更改,现在将允许在不运行全局虚拟机安全点的情况下实现线程回调。这将使得停止单个线程变得可能和便宜,而不是只能启用或停止所有线程。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 316:在备用存储装置上的堆分配u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E硬件技术在持续进化,现在可以使用与传统 DRAM 具有相同接口和类似性能特点的非易失性 RAM 。这项 JEP 将使得 JVM 能够使用适用于不同类型的存储机制的堆。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 317:试验性的基于 Java 的 JIT 编译器u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E最近宣布的 Metropolis 项目提议用 Java 重写大部分 JVM,乍一看觉得很奇怪。如果 JVM 是用 Java 编写的,那么是否需要一个 JVM 来运行 JVM ? 相应的,这导致了一个很好的镜像类比。现实情况是,使用 Java 编写 JVM 并不意味着必须将其编译为字节码,你可以使用 AOT 编译,然后在运行时编译代码以提高性能。u003Cu002Fpu003Eu003Cpu003E这项 JEP 将 Graal 编译器研究项目引入到 JDK 中,并让 Metropolis 项目成为现实,使 JVM 性能与当前 C++ 所写版本的匹敌提供了基础。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003EJEP 296:合并 JDK 多个代码仓库到一个单独的储存库中u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E在 JDK 9 中,有 8 个仓库: root、corba、hotspot、jaxp、jaxws、jdk、langtools 和 nashorn 。在 JDK 10 中这些将被合并为一个,使得跨相互依赖的变更集的存储库运行 atomic commit (原子提交)成为可能。u003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F1522291855132f9d9bec4c0″ img_width=”591″ img_height=”275″ alt=”重磅!Java 10 正式发布,它将影响你的代码!” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E u003Cstrongu003EJava 10 将如何影响你的代码?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E当一个新特性来临的时候,我们首先要问自己一个问题:这将如何影响我的代码? u003Cu002Fpu003Eu003Cpu003EJava 10 发布后,咱们云和数据JAVA班的学员们纷纷咨询这个问题,下面我们就来看下这一特性可以使用在哪些场景中,以及在哪些场景中不能使用。u003Cu002Fpu003Eu003Cpu003E适用范围:u003Cu002Fpu003Eu003Cpu003E初始化局部变量u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E一定是初始化的时候,只是定义是不可以的。如var foo;不可以,但是var foo = “Foo”;可以。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E增强for循环的索引u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E如for (var nr : numbers)u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E传统for循环的局部变量定义u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E如 for (var i = 0; i < numbers.size(); i++)u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E不适用范围:u003Cu002Fpu003Eu003Cpu003E 1.方法的参数u003Cu002Fpu003Eu003Cpu003E 2.构造函数的参数u003Cu002Fpu003Eu003Cpu003E 3.方法的返回值类型u003Cu002Fpu003Eu003Cpu003E 4.对象的成员变量u003Cu002Fpu003Eu003Cpu003E 5.只是定义定义而不初始化u003Cu002Fpu003Eu003Cpu003E u003Cstrongu003E 总 结u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E在Java 10之后你在声明局部变量类型的时候可以使用var来告知编译器进行类型推断。这仅仅发生在变量初始化的阶段,就像 var s = “”;这样。 此外,也可以是用在普通for循环和增强for循环中。u003Cu002Fpu003Eu003Cpu003E除了局部变量之外,另外在属性和方法返回值类型中,不能使用var。 这样做是为了避免引起一些无法预知的错误。u003Cu002Fpu003Eu003Cpu003E尽管引入var变量会使代码可读性变得更糟,但此次的新特性为开发者提供了一种在编写复杂表达式的时候寻求了一个新的契机。u003Cu002Fpu003Eu003Cpu003E总之,Java 10是 Java 大版本周期变化后的第一个正式发布版本,因此非常值得关注,如果你需要使用,可以打开以下地址即刻下载:u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003Ehttp:u002Fu002Fwww.oracle.comu002Ftechnetworku002Fjavau002Fjavaseu002Fdownloadsu002Findex.htmlu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F15222918425990cdde92db1″ img_width=”595″ img_height=”395″ alt=”重磅!Java 10 正式发布,它将影响你的代码!” inline=”0″u003Eu003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:重磅!Java 10 正式发布,它将影响你的代码!

主题测试文章,只做测试使用。发布者:熱鬧獨處,转转请注明出处:http://www.cxybcw.com/26554.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code