您好,登錄后才能下訂單哦!
本篇文章為大家展示了Java10的新特性有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
長(zhǎng)期支持模式
從2017年開始,Oracle&Java社區(qū)宣布將向?yàn)槠?個(gè)月的Java新節(jié)奏轉(zhuǎn)變。它轉(zhuǎn)向了oracle javase產(chǎn)品的長(zhǎng)期支持(LTS)模型。
LTS版本的產(chǎn)品將提供甲骨文卓越和持續(xù)的支持,并將每3年瞄準(zhǔn)一次。
每個(gè)Java發(fā)行版都是以一個(gè)或兩個(gè)主要特性為模型的,這些特性驅(qū)動(dòng)發(fā)行版。任何障礙都會(huì)推遲發(fā)布和推遲上市。Jigsaw項(xiàng)目是Java9的一個(gè)主要特性,它將發(fā)布日期推遲了幾次,發(fā)布時(shí)間推遲了1.5年以上。6個(gè)月的cadence發(fā)布將遵循發(fā)布序列。放行列車每6個(gè)月有一個(gè)時(shí)間表。使切口上車的特征;否則它們等待下一列預(yù)定的火車。
為了對(duì)開發(fā)人員更加友好,Oracle&Java社區(qū)現(xiàn)在將OpenJDK作為主要JDK來推廣。這與早些時(shí)候相比是一個(gè)很大的解脫,當(dāng)時(shí)JDK是適當(dāng)?shù)?,并由Oracle授權(quán),Oracle對(duì)重新分發(fā)有各種限制。不過,Oracle將繼續(xù)生產(chǎn)JDK,但只針對(duì)長(zhǎng)期支持版本。這是朝著更加云和容器友好的方向發(fā)展,因?yàn)殚_放的JDK庫可以作為容器的一部分分發(fā)。
openjdk將每6個(gè)月發(fā)布一次,而Oracle JDK將每3年發(fā)布一次(LTS版本)。
大型組織需要時(shí)間在不同的版本之間移動(dòng);他們會(huì)緊緊抓住版本直到他們能做到為止。行業(yè)對(duì)Java6的采用超過了Java7,然后行業(yè)逐漸轉(zhuǎn)向Java8。在我看來,LTS版本將是最受企業(yè)青睞的。然而,究竟是oraclejdk的LTS版本還是openjdk還不清楚,部分原因是云計(jì)算領(lǐng)域正在進(jìn)行大量工作。
Java9和Java10是非LTS版本。定于2018年9月發(fā)布的Java11將是LTS版本。
讓我們來看看Java10中可用的特性。
隨著基于時(shí)間的發(fā)布周期的采用,Oracle改變了javase平臺(tái)和JDK的版本字符串方案,以及相關(guān)的版本控制信息,用于當(dāng)前和未來基于時(shí)間的發(fā)布模型。
版本號(hào)的新模式是:
$FEATURE.$INTERIM.$UPDATE.$PATCH
$FEATURE:counter
將每6個(gè)月遞增一次,并且將基于功能發(fā)布版本,例如:JDK 10、JDK 11。
$INTERIM: counter
對(duì)于包含兼容的錯(cuò)誤修復(fù)和增強(qiáng)但沒有不兼容更改的非功能版本,計(jì)數(shù)器將增加。通常,這將是零,因?yàn)榱鶄€(gè)月內(nèi)不會(huì)有臨時(shí)發(fā)布。這是為了將來對(duì)發(fā)布模型進(jìn)行修訂而保留的。
$UPDATE:counter
對(duì)于修復(fù)新特性中的安全問題、退化和bug的兼容更新版本將增加。此功能發(fā)布后一個(gè)月更新,以后每3個(gè)月更新一次。2018年4月的版本是JDK10.0.1,7月的版本是JDK10.0.2,以此類推
$PATCH:counter
將在緊急版本中增加,以修復(fù)關(guān)鍵問題。
添加了新的API以編程方式獲取這些計(jì)數(shù)器值。讓我們看看;
Version version = Runtime.version(); version.feature(); version.interim(); version.update(); version.patch();
現(xiàn)在,讓我們看看返回版本信息的Java launcher:
$ java -version java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+46) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
版本號(hào)格式是“10”,因?yàn)槌?之外沒有其他計(jì)數(shù)器。添加發(fā)布日期。18.3可以理解為2018年和第3個(gè)月,版本10+46是版本10的第46個(gè)版本。對(duì)于JDK10.0.1的假設(shè)構(gòu)建93,構(gòu)建將是10.0.1+93
局部變量類型推斷是Java10中為開發(fā)人員提供的最大的新特性。它將類型推斷添加到帶有初始值設(shè)定項(xiàng)的局部變量聲明中。局部類型推斷只能在以下情況下使用:
僅限于具有初始值設(shè)定項(xiàng)的局部變量
增強(qiáng)for循環(huán)的索引
在for循環(huán)中聲明的本地
我們來看看它的用法:
var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList<String> // Index of Enhanced For Loop for (var number : numbers) { System.out.println(number); } // Local variable declared in a loop for (var i = 0; i < numbers.size(); i++) { System.out.println(numbers.get(i)); }
這個(gè)特性使基于Java的JIT編譯器Graal能夠在Linux/x64平臺(tái)上作為一個(gè)實(shí)驗(yàn)性的JIT編譯器使用。到目前為止,這是Java10特性列表中最具未來感的內(nèi)容。
Graal是在java9中引入的。它是我們已經(jīng)習(xí)慣的JIT編譯器的替代品。它是JVM的一個(gè)插件,這意味著JIT編譯器沒有綁定到JVM,它可以動(dòng)態(tài)地插入JVMCI兼容的任何其他插件(Java級(jí)JVM編譯器接口)。它還帶來了java世界中的提前編譯(AOT)。它還支持多語言翻譯。
“一個(gè)用Java編寫的基于Java的實(shí)時(shí)編譯器,用于將Java字節(jié)碼轉(zhuǎn)換為機(jī)器碼?!边@讓人困惑嗎?如果JVM是用Java編寫的,那么您不需要JVM來運(yùn)行JVM嗎?JVM可以通過AOT編譯,然后JIT編譯器可以在jvmit中使用,通過實(shí)時(shí)代碼優(yōu)化來提高性能。
Graal是用Java從頭開始的對(duì)JIT編譯器的完全重寫。以前的JIT編譯器是用c++編寫的。它被認(rèn)為是任何編程語言進(jìn)化的最后階段。
您可以使用以下jvm參數(shù)切換到Graal:
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
此功能有助于改善啟動(dòng)占用空間,擴(kuò)展現(xiàn)有的類數(shù)據(jù)共享(“CDS”)功能,以允許將應(yīng)用程序類放置在共享存檔中。
JVM在啟動(dòng)時(shí)執(zhí)行一些初步步驟,其中一個(gè)步驟是在內(nèi)存中加載類。如果有幾個(gè)jar有多個(gè)類,那么第一個(gè)請(qǐng)求中的延遲就很明顯了。這成為無服務(wù)器體系結(jié)構(gòu)的一個(gè)問題,其中引導(dǎo)時(shí)間至關(guān)重要。為了縮短應(yīng)用程序啟動(dòng)時(shí)間,可以使用應(yīng)用程序類數(shù)據(jù)共享。其思想是通過在不同的Java進(jìn)程之間共享公共類元數(shù)據(jù)來減少占用空間??赏ㄟ^以下3個(gè)步驟實(shí)現(xiàn):
確定要存檔的類:使用java啟動(dòng)器創(chuàng)建要存檔的文件列表,這可以通過以下參數(shù)實(shí)現(xiàn):
$java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld
創(chuàng)建AppCDS存檔:使用java launcher創(chuàng)建要用于應(yīng)用程序cd的文件列表的存檔,這可以通過以下參數(shù)實(shí)現(xiàn):
$java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar
使用AppCDS存檔:使用帶有以下參數(shù)的Java啟動(dòng)器來使用應(yīng)用程序cd。
$java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld
G1垃圾收集器在jdk9中是默認(rèn)的。G1垃圾收集器避免了任何完全的垃圾收集,但是當(dāng)用于收集的并發(fā)線程不能足夠快地恢復(fù)內(nèi)存時(shí),用戶的體驗(yàn)就會(huì)受到影響。
此更改通過使完全GC并行來改善G1最壞情況下的延遲。G1收集器的mark-sweep compact算法作為此更改的一部分被并行化,當(dāng)用于收集的并發(fā)線程不能足夠快地恢復(fù)內(nèi)存時(shí),它將被觸發(fā)。
這個(gè)JEP是未來的變化。它通過引入一個(gè)通用的垃圾收集器接口來改進(jìn)不同垃圾收集器的代碼隔離。
此更改為內(nèi)部GC代碼提供了更好的模塊化。它將有助于將來添加新的GC而不改變現(xiàn)有的代碼基,也有助于刪除或管理以前的GC。
此功能增強(qiáng)了java.util.Locale語言環(huán)境以及相關(guān)的API來實(shí)現(xiàn)BCP 47語言標(biāo)記的額外Unicode擴(kuò)展。從JavaSE9開始,支持的BCP47U語言標(biāo)記擴(kuò)展是“ca”和“nu”。此JEP將添加對(duì)以下附加擴(kuò)展的支持:
cu(貨幣類型)
fw(每周第一天)
rg(區(qū)域覆蓋)
tz(時(shí)區(qū))
為了支持這些附加擴(kuò)展,對(duì)各種api進(jìn)行了更改,以提供基于U或附加擴(kuò)展的信息。
java.text.DateFormat::get*Instance java.text.DateFormatSymbols::getInstance java.text.DecimalFormatSymbols::getInstance java.text.NumberFormat::get*Instance java.time.format.DateTimeFormatter::localizedBy java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern java.time.format.DecimalStyle::of java.time.temporal.WeekFields::of java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek} java.util.Currency::getInstance java.util.Locale::getDisplayName java.util.spi.LocaleNameProvider
為了推廣OpenJDK并使其對(duì)社區(qū)用戶更具吸引力,此功能在JDK中提供了一組默認(rèn)的根證書頒發(fā)機(jī)構(gòu)(CA)證書。這也意味著Oracle和openjdk二進(jìn)制文件在功能上是相同的。
關(guān)鍵的安全組件(如TLS)將在OpenJDK構(gòu)建中默認(rèn)工作。
這是一個(gè)用于提高性能的內(nèi)部JVM特性。
握手操作是在每個(gè)JavaThread處于safepoint狀態(tài)時(shí)對(duì)其執(zhí)行的回調(diào)。回調(diào)要么由線程本身執(zhí)行,要么由VM線程執(zhí)行,同時(shí)保持線程處于阻塞狀態(tài)。
此功能提供了一種在線程上執(zhí)行回調(diào)而不執(zhí)行全局VM safepoint的方法。使停止單個(gè)線程,而不僅僅是停止所有線程或不停止任何線程既可能又便宜。
應(yīng)用程序已經(jīng)變得內(nèi)存匱乏,云本地應(yīng)用程序、內(nèi)存數(shù)據(jù)庫、流式應(yīng)用程序都在增加。為了滿足這些服務(wù),有各種可用的內(nèi)存體系結(jié)構(gòu)。此功能增強(qiáng)了HotSpot VM在用戶指定的備用內(nèi)存設(shè)備(如NV-DIMM)上分配Java對(duì)象堆的能力。
此JEP針對(duì)具有與DRAM相同的語義(包括原子操作的語義)的替代內(nèi)存設(shè)備,因此,可以在不更改現(xiàn)有應(yīng)用程序代碼的情況下代替DRAM用于對(duì)象堆。
這是一個(gè)從JDK中刪除javah工具的內(nèi)務(wù)管理更改。javac中添加的工具功能是jdk8的一部分,它提供了在編譯時(shí)編寫Native-Header文件的能力,從而使javah變得無用。
多年來,在JDK代碼庫中有各種Mercurial存儲(chǔ)庫。不同的存儲(chǔ)庫確實(shí)提供了一些優(yōu)勢(shì),但它們也有不同的操作缺點(diǎn)。作為此更改的一部分,JDK的許多存儲(chǔ)庫被合并到一個(gè)存儲(chǔ)庫中,以簡(jiǎn)化開發(fā)。
Java10已經(jīng)添加和刪除了API(是的,它不是一個(gè)拼寫錯(cuò)誤)。
Java9引入了增強(qiáng)的棄用,其中某些API被標(biāo)記為在將來的版本中刪除。
添加了API:Java10中添加了73個(gè)新API。
讓我們看一些補(bǔ)充:
List
、Map
和Set
接口是通過靜態(tài)copyOf(Collection)
方法添加的。它返回一個(gè)不可修改的列表、映射或集合,其中包含所提供的條目。對(duì)于列表,如果給定的列表隨后被修改,則返回的列表將不會(huì)反映這些修改。
Optional
&它的原語變體獲取一個(gè)方法orelsetrow()
。這與get()
完全相同,但是javadoc聲明它是get()
的首選替代方法
Collectors
類獲取用于收集不可修改集合(Set
、List
、Map
)的各種方法
List<String> actors = new ArrayList<>(); actors.add("Jack Nicholson"); actors.add("Marlon Brando"); System.out.println(actors); // prints [Jack Nicholson, Marlon Brando] // New API added - Creates an UnModifiable List from a List. List<String> copyOfActors = List.copyOf(actors); System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando] // copyOfActors.add("Robert De Niro"); Will generate an // UnsupportedOperationException actors.add("Robert De Niro"); System.out.println(actors);// prints [Jack Nicholson, Marlon Brando, Robert De Niro] System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando] String str = ""; Optional<String> name = Optional.ofNullable(str); // New API added - is preferred option then get() method name.orElseThrow(); // same as name.get() // New API added - Collectors.toUnmodifiableList List<String> collect = actors.stream().collect(Collectors.toUnmodifiableList()); // collect.add("Tom Hanks"); // Will generate an // UnsupportedOperationException
上述內(nèi)容就是Java10的新特性有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。