再探Java 7:最新特性更新、代碼示例及性能測試
原創【51CTO獨家特稿】如果說今年Java開發平臺有什么大事兒,那就要數將于年底發布的Java 7了。之前51CTO曾報道過Java 7已經完成的七大新功能,包括新增的垃圾回收器G1、JVM動態語言支持以及模塊化等等(更多關于Java 7的報道可以參考51CTO專題:Java 7,下一代Java開發技術詳解)。進入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增加新特性的原因。那么,現在我們***去看一些代碼實例。#p#
Java 7新特性的代碼實例
下面列出的大多數例子都是來源于Joe Wright博客中(Java7中的新語言特性)的高水平文章。
集合的語言支持
在這里我們主要講的是,當創建一個List、Set或者Map的時候,你怎樣盡量少寫代碼。你不必先實例化Object,然后再給Collection添加元素。你現在只需1行代碼就可以完成。
- List
list = ["item"]; - String item = list[0];
- Set
set = {"item"}; - Map map = {"key" : 1};
- int value = map["key"];
自動資源管理
由于try / catch語句的原因,冗長的代碼令人非常頭痛。你或許會喜歡這個全新的特性。
實際上,下面這些代碼:
- BufferedReader br = new BufferedReader(new FileReader(path));
- try {
- return br.readLine();
- } finally {
- br.close();
- }
轉變成了如下這種形式:
- try (BufferedReader br = new BufferedReader(new FileReader(path)) {
- return br.readLine();
- }
通用實例創建來改進類型推斷(diamond)
當你把對象的接口申明指定成范型后,你在對象實例化時不得不再指定一次。現在,你不必如此了,因為你可以這樣:
- Map> map = new HashMap<>();
數值文字的加強
我不敢肯定這個對大多數人都有用。你可以這樣做:
- int billion = 1_000_000_000;
允許在switch中使用字符串
這個無需解釋,其意思很明確。
- String availability = "available";
- switch(availability) {
- case "available":
- //code
- break;
- case "unavailable":
- //code
- break;
- case "merged":
- //code
- default:
- //code
- break;
- }
二進制文字
你可以使用前綴0b創建二進制文字
- 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秒 |
顯然,不同版本之間的性能差異并不是特別大。更多關于Java 7性能方面的測試可以參考51CTO之前的報道《Java1.7性能測試比較》
Java 7的發布日期
在2009年11月的時候,Java1.7計劃是在2010年9月發布,到那時還將發布3個里程碑版本。其中,里程碑6在build 84版中已經完成,里程碑7的***個測試版B85也計劃在2010年3月4日完成,而本文使用的B87版本已在2010年3月25日發布。這樣看起來,Java 1.7很有可能在2010年9月發布。讓我們等待吧。
【編輯推薦】
原文:Java 1.7 - What's new? Release date, code examples and performance 作者:inebium