就在前段時(shí)間,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布荚虚,可在生產(chǎn)環(huán)境中使用! 這無疑對(duì)我們來說是一大好的消息薛夜。作為一名java開發(fā)者來說,雖然又要去學(xué)習(xí)和了解java11版述,但內(nèi)心還是欣慰的梯澜。我想至少你和我一樣的心情:Java在手,天下我有渴析!
今天我們來看一下Java 11到底是什么晚伙、他有什么特別的、到底要不要升級(jí)到Java 11俭茧。
Java 11有什么特別的
在Oracle官網(wǎng)中咆疗,進(jìn)入下載頁面,第一個(gè)可供下載的JDK版本已經(jīng)提換成了Java SE 11 (LTS)恢恼,這里的LTS表示Long-Term-Support民傻。
本次發(fā)布的Java 11和2017年9月份發(fā)布的Java 9以及 2018年3月份發(fā)布的Java 10相比,其最大的區(qū)別就是:在長期支持(Long-Term-Support)方面,Oracle表示會(huì)對(duì)Java 11提供大力支持漓踢,這一支持將會(huì)持續(xù)至2026年9月牵署。這是據(jù) Java 8 以后支持的首個(gè)長期版本。
為什么說是長期版本喧半,看下面的官方發(fā)布的支持路線圖表奴迅。
上圖是一張Oracle 公布的對(duì)于各個(gè)版本的JDK的Support Roadmap。途中列舉了Java 6 - Java 12的正式發(fā)布時(shí)間以及支持計(jì)劃挺据。
從中可以看出取具,在Java 11之前,Java 9和Java 10是不提供長期支持的扁耐,而上一個(gè)提供長期支持的版本是Java 8暇检,其將會(huì)支持到2025年3月。
長期支持婉称,表示Oracle會(huì)對(duì)其做長期的補(bǔ)丁块仆、安全等擴(kuò)展支持等。
下一個(gè)提供長期支持的版本將會(huì)是Java 17王暗,其將于2021年發(fā)布悔据。
現(xiàn)在大部分都在用 Java 8,Java 9 和 10 目前很少有人在用俗壹,至少我沒有發(fā)現(xiàn)有公司在生產(chǎn)環(huán)境應(yīng)用的科汗,那就是找死。
現(xiàn)在 Java 11 長期支持绷雏,也已經(jīng)包含了 9 和 10 的全部功能头滔,9 和 10 自然就活到頭了。之众。
那么我們來看下 從 Java 9 - 11 都有哪些重要的新特性呢拙毫?
新特性
1依许、本地變量類型推斷
什么是局部變量類型推斷棺禾?
var javastack = "javastack";
System.out.println(javastack);
大家看出來了,局部變量類型推斷就是左邊的類型直接使用 var 定義峭跳,而不用寫具體的類型膘婶,編譯器能根據(jù)右邊的表達(dá)式自動(dòng)推斷類型,如上面的 String 蛀醉。
var javastack = "javastack";
就等于:
String javastack = "javastack";
2悬襟、字符串加強(qiáng)
Java 11 增加了一系列的字符串處理方法,如以下所示拯刁。
// 判斷字符串是否為空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 復(fù)制字符串
"Java".repeat(3); // "JavaJavaJava"
// 行數(shù)統(tǒng)計(jì)
"A\nB\nC".lines().count(); // 3
3脊岳、集合加強(qiáng)
自 Java 9 開始,Jdk 里面為集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它們兩個(gè)都用來創(chuàng)建不可變的集合割捅,來看下它們的使用和區(qū)別奶躯。
示例1:
var list = List.of("Java", "Python", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
示例2:
var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy); // false
示例1和2代碼差不多,為什么一個(gè)為true,一個(gè)為false?
來看下它們的源碼:
static <E> List<E> of(E... elements) {
switch (elements.length) { // implicit null check of elements
case 0:
return ImmutableCollections.emptyList();
case 1:
return new ImmutableCollections.List12<>(elements[0]);
case 2:
return new ImmutableCollections.List12<>(elements[0], elements[1]);
default:
return new ImmutableCollections.ListN<>(elements);
}
}
static <E> List<E> copyOf(Collection<? extends E> coll) {
return ImmutableCollections.listCopy(coll);
}
static <E> List<E> listCopy(Collection<? extends E> coll) {
if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
return (List<E>)coll;
} else {
return (List<E>)List.of(coll.toArray());
}
}
可以看出 copyOf 方法會(huì)先判斷來源集合是不是 AbstractImmutableList 類型的亿驾,如果是嘹黔,就直接返回,如果不是莫瞬,則調(diào)用 of 創(chuàng)建一個(gè)新的集合儡蔓。
示例2因?yàn)橛玫?new 創(chuàng)建的集合,不屬于不可變 AbstractImmutableList 類的子類疼邀,所以 copyOf 方法又創(chuàng)建了一個(gè)新的實(shí)例喂江,所以為false.
注意:使用 of 和 copyOf 創(chuàng)建的集合為不可變集合,不能進(jìn)行添加旁振、刪除开呐、替換、排序等操作规求,不然會(huì)報(bào) java.lang.UnsupportedOperationException 異常筐付。
上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有阻肿。
4瓦戚、Stream 加強(qiáng)
Stream 是 Java 8 中的新特性,Java 9 開始對(duì) Stream 增加了以下 4 個(gè)新方法丛塌。
- 增加單個(gè)參數(shù)構(gòu)造方法较解,可為null
Stream.ofNullable(null).count(); // 0
- 增加 takeWhile 和 dropWhile 方法
Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]
從開始計(jì)算,當(dāng) n < 3 時(shí)就截止赴邻。
Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1]
這個(gè)和上面的相反印衔,一旦 n < 3 不成立就開始計(jì)算。
3)iterate重載
這個(gè) iterate 方法的新重載方法姥敛,可以讓你提供一個(gè) Predicate (判斷條件)來指定什么時(shí)候結(jié)束迭代奸焙。
如果你對(duì) JDK 8 中的 Stream 還不熟悉,可以看之前分享的這一系列教程彤敛。
5与帆、Optional 加強(qiáng)
Opthonal 也增加了幾個(gè)非常酷的方法墨榄,現(xiàn)在可以很方便的將一個(gè) Optional 轉(zhuǎn)換成一個(gè) Stream, 或者當(dāng)一個(gè)空 Optional 時(shí)給它一個(gè)替代的玄糟。
Optional.of("javastack").orElseThrow(); // javastack
Optional.of("javastack").stream().count(); // 1
Optional.ofNullable(null)
.or(() -> Optional.of("javastack"))
.get(); // javastack
6、InputStream 加強(qiáng)
InputStream 終于有了一個(gè)非常有用的方法:transferTo袄秩,可以用來將數(shù)據(jù)直接傳輸?shù)?OutputStream阵翎,這是在處理原始數(shù)據(jù)流時(shí)非常常見的一種用法逢并,如下示例。
var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("javastack.txt");
var javastack = File.createTempFile("javastack2", "txt");
try (var outputStream = new FileOutputStream(javastack)) {
inputStream.transferTo(outputStream);
}
7郭卫、HTTP Client API
這是 Java 9 開始引入的一個(gè)處理 HTTP 請(qǐng)求的的孵化 HTTP Client API筒狠,該 API 支持同步和異步,而在 Java 11 中已經(jīng)為正式可用狀態(tài)箱沦,你可以在 java.net 包中找到這個(gè) API辩恼。
來看一下 HTTP Client 的用法:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://javastack.cn"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 異步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
上面的 .GET() 可以省略,默認(rèn)請(qǐng)求方式為 Get谓形!
更多使用示例可以看這個(gè) API灶伊,后續(xù)有機(jī)會(huì)再做演示。
現(xiàn)在 Java 自帶了這個(gè) HTTP Client API寒跳,我們以后還有必要用 Apache 的 HttpClient 工具包嗎莲蜘?
8拘领、化繁為簡叉信,一個(gè)命令編譯運(yùn)行源代碼
看下面的代碼栓始。
// 編譯
javac Javastack.java
// 運(yùn)行
java Javastack
在我們的認(rèn)知里面,要運(yùn)行一個(gè) Java 源代碼必須先編譯书释,再運(yùn)行翘贮,兩步執(zhí)行動(dòng)作。而在未來的 Java 11 版本中爆惧,通過一個(gè) java 命令就直接搞定了狸页,如以下所示。
java Javastack.java
更多新特性
新發(fā)布的Java 11在新特性方面扯再,提供了17個(gè)JEP(JDK Enhancement Proposal 特性增強(qiáng)提議)
上圖是Oracle公布的Java 11包含的所有新特性芍耘,其中幾個(gè)重點(diǎn)的新特性為:
ZGC:可擴(kuò)展的低延遲垃圾收集器
ZGC是一款號(hào)稱可以保證每次GC的停頓時(shí)間不超過10MS的垃圾回收器,并且和當(dāng)前的默認(rèn)垃圾回收起G1相比熄阻,吞吐量下降不超過15%斋竞。
Epsilon:什么事也不做的垃圾回收器
Java 11還加入了一個(gè)比較特殊的垃圾回收器——Epsilon,該垃圾收集器被稱為“no-op”收集器秃殉,將處理內(nèi)存分配而不實(shí)施任何實(shí)際的內(nèi)存回收機(jī)制坝初。 也就是說,這是一款不做垃圾回收的垃圾回收器复濒。這個(gè)垃圾回收器看起來并沒什么用脖卖,主要可以用來進(jìn)行性能測(cè)試、內(nèi)存壓力測(cè)試等巧颈,Epsilon GC可以作為度量其他垃圾回收器性能的對(duì)照組。大神Martijn說袖扛,Epsilon GC至少能夠幫助理解GC的接口砸泛,有助于成就一個(gè)更加模塊化的JVM十籍。
增強(qiáng)var用法
Java 10中增加了本地變量類型推斷的特性,可以使用var來定義局部變量唇礁。盡管這一特性被很多人詬病勾栗,但是并不影響Java繼續(xù)增強(qiáng)他的用法,在Java 11中盏筐,var可以用來作為Lambda表達(dá)式的局部變量聲明围俘。
移除Java EE和CORBA模塊
早在發(fā)布Java SE 9的時(shí)候,Java就表示過琢融,會(huì)在未來版本中將Java EE和CORBA模塊移除界牡,而這樣舉動(dòng)終于在Java 11中實(shí)施。終于去除了Java EE和CORBA模塊漾抬。
HTTP客戶端進(jìn)一步升級(jí)
JDK 9 中就已對(duì) HTTP Client API 進(jìn)行標(biāo)準(zhǔn)化宿亡,然后通過JEP 110,在 JDK 10 中進(jìn)行了更新纳令。在本次的Java 11的更新列表中挽荠,由以JEP 321進(jìn)行進(jìn)一步升級(jí)。該API通過CompleteableFutures提供非阻塞請(qǐng)求和響應(yīng)語義平绩,可以聯(lián)合使用以觸發(fā)相應(yīng)的動(dòng)作圈匆。 JDK 11完全重寫了該功能。現(xiàn)在捏雌,在用戶層請(qǐng)求發(fā)布者和響應(yīng)發(fā)布者與底層套接字之間追蹤數(shù)據(jù)流更容易了臭脓,這降低了復(fù)雜性,并最大程度上提高了HTTP / 1和HTTP / 2之間的重用的可能性腹忽。
到底要不要升級(jí)
2017年8月来累,JCP執(zhí)行委員會(huì)提出將Java的發(fā)布頻率改為每六個(gè)月一次。
- 2017年9月窘奏,Java 9發(fā)布嘹锁。
- 2018年3月,Java 10發(fā)布着裹。
- 2018年9月领猾,Java 11發(fā)布。
大部分人使用的JDK版本還是Java 8及以下版本骇扇,甚至某些公司的生產(chǎn)環(huán)境使用的還是JDK 1.6摔竿。
那么,對(duì)于公司和開發(fā)者來說少孝,到底要不要在生產(chǎn)及開發(fā)環(huán)境中升級(jí)和學(xué)習(xí)Java 11呢?
對(duì)于企業(yè)來說
對(duì)于企業(yè)來說继低,生產(chǎn)環(huán)境中的JDK版本升級(jí)到Java 11還是有必要的。主要有兩個(gè)原因:
1稍走、Oracle會(huì)對(duì)Java 11提供長期支持袁翁,企業(yè)可以放心使用這一版本柴底。并且下一個(gè)長期支持的版本會(huì)在三年后發(fā)布,時(shí)間比較久遠(yuǎn)粱胜。
2柄驻、Java 11確實(shí)提供了一些比較不錯(cuò)的特性,尤其重要的是提供了ZGC焙压,這是一款具有劃時(shí)代意義的垃圾回收器鸿脓。優(yōu)點(diǎn)不再贅述。有了ZGC涯曲,JVM的性能瓶頸可以被突破野哭。
對(duì)于開發(fā)者來說
在編碼方面,Java 11并沒有像Java 8那樣變化巨大掀抹,畢竟Java 8提供了函數(shù)式編程的能力虐拓,這也是很多開發(fā)者學(xué)習(xí)Java 8的一個(gè)重要原因。
但是傲武,Java 11也并不是完全沒有提升蓉驹,至少在新版本中,Java開發(fā)者終于可以擺脫老舊的HttpURLConnection了揪利。新的HTTP API提供了對(duì)HTTOP/2等業(yè)界前沿標(biāo)準(zhǔn)的支持态兴,提供了精簡而又友好的API接口。
所以疟位,綜上所述瞻润,無論是對(duì)于企業(yè)還是開發(fā)者來說,升級(jí)Java 11都是有必要的甜刻,至少比Java 9和Java 10的必要性要大很多绍撞。至于這個(gè)必要性到底有多大呢,作者給一個(gè)簡單的說明:
- 如果你現(xiàn)在時(shí)候用的JDK/Java版本低于Java 8得院,先升級(jí)到Java 8傻铣。
- 如果你現(xiàn)在時(shí)候用的JDK/Java版本高于Java 7,那么可以考慮升級(jí)到Java 11了祥绞。
當(dāng)然非洲,你可以直接從Java 6跳躍到Java 11。
最后
現(xiàn)在許多人還在使用 Java 8 或者 7蜕径,不過 8 在 2019 年初就會(huì)結(jié)束免費(fèi)更新×教ぃ現(xiàn)在 11 是長期支持版本,正是學(xué)習(xí)和上手 11 的好時(shí)機(jī)兜喻,寫這篇文章希望能對(duì)你有所啟發(fā)梦染。
閱讀更多
MongoDB虹统、Hbase弓坞、Redis等NoSQL優(yōu)劣勢(shì)隧甚、應(yīng)用場(chǎng)景
31道Android面試題 车荔,牢固你的基礎(chǔ)渡冻!
相信自己,沒有做不到的忧便,只有想不到的
在這里獲得的不僅僅是技術(shù)族吻!