Java 7:最新特性更新、程式碼示例及效能測試(轉)

langgufu314發表於2012-07-03

進入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秒
 


  顯然,不同版本之間的效能差異並不是特別大。

 

相關文章