再探Java 7:最新特性更新、代碼示例及性能測(cè)試
原創(chuàng)【51CTO獨(dú)家特稿】如果說(shuō)今年Java開(kāi)發(fā)平臺(tái)有什么大事兒,那就要數(shù)將于年底發(fā)布的Java 7了。之前51CTO曾報(bào)道過(guò)Java 7已經(jīng)完成的七大新功能,包括新增的垃圾回收器G1、JVM動(dòng)態(tài)語(yǔ)言支持以及模塊化等等(更多關(guān)于Java 7的報(bào)道可以參考51CTO專(zhuān)題:Java 7,下一代Java開(kāi)發(fā)技術(shù)詳解)。進(jìn)入2010年,Java 7有哪些新的進(jìn)展?這些新的特性更新對(duì)我們有哪些好處?該如何使用?Java 7的性能如何?本文將給你答案。
這里的內(nèi)容主要包括其***更新、一些代碼實(shí)例、跟以前版本的Java進(jìn)行性能比較需要參考的一些基準(zhǔn)、以及什么時(shí)候它才會(huì)發(fā)布等信息。
首先,讓我們來(lái)看最重要的事情。為了確定JDK 7中有哪些語(yǔ)言方面的微小變化,有關(guān)人員建立了一個(gè)名叫Project Coin的項(xiàng)目。描述了最終的五個(gè)變化(比五個(gè)多一點(diǎn))。
Java 7更新內(nèi)容如下所示:
◆允許在switch中使用字符串
◆自動(dòng)資源管理
◆通用實(shí)例創(chuàng)建來(lái)改進(jìn)類(lèi)型推斷(diamond)
◆簡(jiǎn)化的Varargs方法調(diào)用
◆更好的整型文字綜合性建議
◆Collections集合的語(yǔ)言支持
◆JSR292的語(yǔ)言支持
在the OpenJDK 7特性頁(yè)面中,你還可以看到其他的功能。
這些功能分為不同的種類(lèi):
◆虛擬機(jī)(VM)
◆壓縮的64位對(duì)象指針
◆G1垃圾回收器GC(G1)
◆JSR 292:非Java語(yǔ)言的虛擬機(jī)支持(動(dòng)態(tài)調(diào)用,InvokeDynamic)
語(yǔ)言方面(lang)
◆SR 294:模塊化編程的語(yǔ)言以及虛擬機(jī)支持
◆JSR 308:Java類(lèi)型注釋
◆語(yǔ)言微小增強(qiáng)(我所談?wù)摰腜roject Coin)
◆JSR TBD: Project Lambda
內(nèi)核(core)
◆模塊化(Jigsaw項(xiàng)目)
◆對(duì)類(lèi)加載器的結(jié)構(gòu)進(jìn)行升級(jí)
◆關(guān)閉URLClassLoader的方法
◆Unicode 5.1標(biāo)準(zhǔn)
◆并行以及集合的升級(jí)(jsr166y)
◆JSR 203:Java平臺(tái)(NIO.2)的更多新型I/O API
◆SCTP (流控制傳輸協(xié)議,Stream Control Transmission Protocol)
◆SDP (套接字直接協(xié)議,Sockets Direct Protocol)
◆橢圓曲線(xiàn)加密技術(shù)(ECC)
客戶(hù)端(client)
◆Java 2D的XRender管道
◆轉(zhuǎn)發(fā)端口6u10部署特性
◆為6u10圖形功能創(chuàng)建新的平臺(tái)API
◆Swing的Nimbus外觀和感覺(jué)
◆Swing的JLayer元件
網(wǎng)絡(luò)(web)
◆更新XML的棧
就像你所看到的,這涉及了很多東西。幾個(gè)月前,我親自嘗試了新的Garbage Collector (GC),其性能表現(xiàn)給我留下了非常深刻的印象。不幸的是,JVM幾個(gè)小時(shí)就會(huì)崩潰一次,所以這個(gè)產(chǎn)品不能使用JVM。雖然在Java 1.6中也可以使用這個(gè)GC,但也會(huì)出現(xiàn)同樣的問(wèn)題,經(jīng)常會(huì)出現(xiàn)崩潰。
我想,這就是Java1.7增加新特性的原因。那么,現(xiàn)在我們***去看一些代碼實(shí)例。#p#
Java 7新特性的代碼實(shí)例
下面列出的大多數(shù)例子都是來(lái)源于Joe Wright博客中(Java7中的新語(yǔ)言特性)的高水平文章。
集合的語(yǔ)言支持
在這里我們主要講的是,當(dāng)創(chuàng)建一個(gè)List、Set或者M(jìn)ap的時(shí)候,你怎樣盡量少寫(xiě)代碼。你不必先實(shí)例化Object,然后再給Collection添加元素。你現(xiàn)在只需1行代碼就可以完成。
- List
list = ["item"]; - String item = list[0];
- Set
set = {"item"}; - Map map = {"key" : 1};
- int value = map["key"];
自動(dòng)資源管理
由于try / catch語(yǔ)句的原因,冗長(zhǎng)的代碼令人非常頭痛。你或許會(huì)喜歡這個(gè)全新的特性。
實(shí)際上,下面這些代碼:
- BufferedReader br = new BufferedReader(new FileReader(path));
- try {
- return br.readLine();
- } finally {
- br.close();
- }
轉(zhuǎn)變成了如下這種形式:
- try (BufferedReader br = new BufferedReader(new FileReader(path)) {
- return br.readLine();
- }
通用實(shí)例創(chuàng)建來(lái)改進(jìn)類(lèi)型推斷(diamond)
當(dāng)你把對(duì)象的接口申明指定成范型后,你在對(duì)象實(shí)例化時(shí)不得不再指定一次。現(xiàn)在,你不必如此了,因?yàn)槟憧梢赃@樣:
- Map> map = new HashMap<>();
數(shù)值文字的加強(qiáng)
我不敢肯定這個(gè)對(duì)大多數(shù)人都有用。你可以這樣做:
- int billion = 1_000_000_000;
允許在switch中使用字符串
這個(gè)無(wú)需解釋?zhuān)湟馑己苊鞔_。
- String availability = "available";
- switch(availability) {
- case "available":
- //code
- break;
- case "unavailable":
- //code
- break;
- case "merged":
- //code
- default:
- //code
- break;
- }
二進(jìn)制文字
你可以使用前綴0b創(chuàng)建二進(jìn)制文字
- int binary = 0b1001_1001;
以上這些就是Java1.7的代碼實(shí)例。如果有人能給我指出還有哪些沒(méi)有包含進(jìn)去,那就更好了。我敢肯定,已經(jīng)有其他的開(kāi)發(fā)人員對(duì)此進(jìn)行了關(guān)注。
Java 1.7的性能表現(xiàn)
Java 7的性能有多大的提升?這里我們來(lái)針對(duì)Java 7做一個(gè)測(cè)試,內(nèi)容如下。在一臺(tái)裝有ArchLinux系統(tǒng)的Macbook Pro電腦上(因特爾Duo CPU T7700,主頻2.40GHz,有兩年的使用時(shí)間)運(yùn)行了這些測(cè)試。內(nèi)存是2Gb的,把Heap Size設(shè)置成了728m(-Xms728m -Xmx728m)。
◆測(cè)試1 為一個(gè)List添加100萬(wàn)個(gè)字符串值(String字符串是一個(gè)UUID,是用UUID.randomUUID()產(chǎn)生的)。
◆測(cè)試2 帶有100萬(wàn)鍵、值對(duì)的HashMap。每個(gè)鍵、值對(duì)通過(guò)并行線(xiàn)程進(jìn)行計(jì)算。鍵是一個(gè)UUID,值int是用Math.random()產(chǎn)生的。
◆測(cè)試3 把100萬(wàn)個(gè)ArrayList條目打印到一定數(shù)量的文件(1000個(gè))中。把條目寫(xiě)進(jìn)恰巧并行的不同文件中。
我只比較了Java1.6 (1.6.0_19) 和 Java 1.7 (b87)。后來(lái)根據(jù)評(píng)論的要求,我把Java1.5也添加了進(jìn)來(lái),但是并沒(méi)有添加Java1.4,因?yàn)樗臅r(shí)間太久遠(yuǎn)了。
結(jié)果如下所示:
|
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秒 |
顯然,不同版本之間的性能差異并不是特別大。更多關(guān)于Java 7性能方面的測(cè)試可以參考51CTO之前的報(bào)道《Java1.7性能測(cè)試比較》
Java 7的發(fā)布日期
在2009年11月的時(shí)候,Java1.7計(jì)劃是在2010年9月發(fā)布,到那時(shí)還將發(fā)布3個(gè)里程碑版本。其中,里程碑6在build 84版中已經(jīng)完成,里程碑7的***個(gè)測(cè)試版B85也計(jì)劃在2010年3月4日完成,而本文使用的B87版本已在2010年3月25日發(fā)布。這樣看起來(lái),Java 1.7很有可能在2010年9月發(fā)布。讓我們等待吧。
【編輯推薦】
- 走進(jìn)Java 7中的模塊系統(tǒng)
- Java 7的***類(lèi)函數(shù):學(xué)習(xí)閉包的使用
- Java 7新功能代碼范例
- 專(zhuān)題:JVM詳解 Java虛擬機(jī)原理與優(yōu)化
原文:Java 1.7 - What's new? Release date, code examples and performance 作者:inebium