進入2010年,Java 7有哪些新的進展?這些新的特性更新對我們有哪些好處?該如何使用?Java 7的效能如何?本文將給你答案。
這裡的內容主要包括其最新更新、一些程式碼例項、跟以前版本的Java進行效能比較需要參考的一些基準、以及什麼時候它才會釋出等資訊。
首先,讓我們來看最重要的事情。為了確定JDK 7中有哪些語言方面的微小變化,有關人員建立了一個名叫Project Coin的專案。描述了最終的五個變化(比五個多一點)。
Java 7更新內容如下所示:
◆允許在switch中使用字串
◆自動資源管理
◆通用例項建立來改進型別推斷(diamond)
◆簡化的Varargs方法呼叫
◆更好的整型文字綜合性建議
◆Collections集合的語言支援
◆JSR292的語言支援
在the OpenJDK 7特性頁面中,你還可以看到其他的功能。
這些功能分為不同的種類:
◆虛擬機器(VM)
◆壓縮的64位物件指標
◆G1垃圾回收器GC(G1)
◆JSR 292:非Java語言的虛擬機器支援(動態呼叫,InvokeDynamic)
語言方面(lang)
◆SR 294:模組化程式設計的語言以及虛擬機器支援
◆JSR 308:Java型別註釋
◆語言微小增強(我所談論的Project Coin)
◆JSR TBD: Project Lambda
核心(core)
◆模組化(Jigsaw專案)
◆對類載入器的結構進行升級
◆關閉URLClassLoader的方法
◆Unicode 5.1標準
◆並行以及集合的升級(jsr166y)
◆JSR 203:Java平臺(NIO.2)的更多新型I/O API
◆SCTP (流控制傳輸協議,Stream Control Transmission Protocol)
◆SDP (套接字直接協議,Sockets Direct Protocol)
◆橢圓曲線加密技術(ECC)
客戶端(client)
◆Java 2D的XRender管道
◆轉發埠6u10部署特性
◆為6u10圖形功能建立新的平臺API
◆Swing的Nimbus外觀和感覺
◆Swing的JLayer元件
網路(web)
◆更新XML的棧
就像你所看到的,這涉及了很多東西。幾個月前,我親自嘗試了新的Garbage Collector (GC),其效能表現給我留下了非常深刻的印象。不幸的是,JVM幾個小時就會崩潰一次,所以這個產品不能使用JVM。雖然在Java 1.6中也可以使用這個GC,但也會出現同樣的問題,經常會出現崩潰。
我想,這就是Java1.7增加新特性的原因。那麼,現在我們最好去看一些程式碼例項。
Java 7新特性的程式碼例項
下面列出的大多數例子都是來源於Joe Wright部落格中(Java7中的新語言特性)的高水平文章。
集合的語言支援
在這裡我們主要講的是,當建立一個List、Set或者Map的時候,你怎樣儘量少寫程式碼。你不必先例項化Object,然後再給Collection新增元素。你現在只需1行程式碼就可以完成。
1.List list = ["item"];
2.String item = list[0];
3.
4.Set set = {"item"};
5.
6.Map map = {"key" : 1};
7.int value = map["key"];
自動資源管理
由於try / catch語句的原因,冗長的程式碼令人非常頭痛。你或許會喜歡這個全新的特性。
實際上,下面這些程式碼:
8.BufferedReader br = new BufferedReader(new FileReader(path));
9.try {
10. return br.readLine();
11.} finally {
12. br.close();
13.}
轉變成了如下這種形式:
14.try (BufferedReader br = new BufferedReader(new FileReader(path)) {
15. return br.readLine();
16.}
通用例項建立來改進型別推斷(diamond)
當你把物件的介面申明指定成範型後,你在物件例項化時不得不再指定一次。現在,你不必如此了,因為你可以這樣:
17.Map> map = new HashMap<>();
數值文字的加強
我不敢肯定這個對大多數人都有用。你可以這樣做:
18.int billion = 1_000_000_000;
允許在switch中使用字串
這個無需解釋,其意思很明確。
19.String availability = "available";
20.switch(availability) {
21. case "available":
22. //code
23. break;
24.
25. case "unavailable":
26. //code
27. break;
28.
29. case "merged":
30. //code
31.
32. default:
33. //code
34. break;
35.}
二進位制文字
你可以使用字首0b建立二進位制文字
36.int binary = 0b1001_1001;
以上這些就是Java1.7的程式碼例項。如果有人能給我指出還有哪些沒有包含進去,那就更好了。我敢肯定,已經有其他的開發人員對此進行了關注。
Java 1.7的效能表現
Java 7的效能有多大的提升?這裡我們來針對Java 7做一個測試,內容如下。在一臺裝有ArchLinux系統的Macbook Pro電腦上(因特爾Duo CPU T7700,主頻2.40GHz,有兩年的使用時間)執行了這些測試。記憶體是2Gb的,把Heap Size設定成了728m(-Xms728m -Xmx728m)。
◆測試1 為一個List新增100萬個字串值(String字串是一個UUID,是用UUID.randomUUID()產生的)。
◆測試2 帶有100萬鍵、值對的HashMap。每個鍵、值對通過並行執行緒進行計算。鍵是一個UUID,值int是用Math.random()產生的。
◆測試3 把100萬個ArrayList條目列印到一定數量的檔案(1000個)中。把條目寫進恰巧並行的不同檔案中。
我只比較了Java1.6 (1.6.0_19) 和 Java 1.7 (b87)。後來根據評論的要求,我把Java1.5也新增了進來,但是並沒有新增Java1.4,因為它的時間太久遠了。
結果如下所示:
Java 1.5
Java 1.6
Java 1.7
Test 1
10,698 秒
9,481秒
9,328秒
Test 2
69,827秒
37,935秒
36,636秒
Test 3
26,931秒
30,868秒
27,383秒
顯然,不同版本之間的效能差異並不是特別大。