1.J2SE:懷胎
Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領導的綠色計劃(Green Project)開始著力發(fā)展一種分布式系統(tǒng)結構,使其能夠在各種消費性電子產(chǎn)品上運行,他們使用了C/C++/Oak語言。由于電子產(chǎn)品種類繁多,運行環(huán)境各不相同,使得用這些語言進行開發(fā)的軟件必須為不同的電子產(chǎn)品而專門設計,所以項目組疲于奔命,消費性電子產(chǎn)品軟件環(huán)境的發(fā)展無法達到預期的目標,綠色計劃也陷于停滯狀態(tài)。
直至 1994年下半年,由于Internet的迅猛發(fā)展和環(huán)球信息網(wǎng) WWW的快速增長,第一個全球信息網(wǎng)絡瀏覽器Mosaic誕生了;此時,工業(yè)界對適合在網(wǎng)絡異構環(huán)境下使用的語言有一種非常急迫的需求;Games Gosling決定改變綠色計劃的發(fā)展方向,他們對Oak進行了小規(guī)模的改造,就這樣,Java在1995年的3月23日誕生了!Java的誕生標志著互聯(lián)網(wǎng)時代的開始,它能夠被應用在全球信息網(wǎng)絡的平臺上編寫互動性及強的Applet程序,而1995年的Applet無疑能給人們無窮的視覺和腦力震蕩。
但沒有相應的開發(fā)庫而只靠Java語言來進行開發(fā)肯定是困難重重,所以Sun公司在1996年的1月23日發(fā)布了JDK1.0來幫助開發(fā)人員的開發(fā)。JDK包括兩大部分:運行環(huán)境和開發(fā)工具。而運行環(huán)境包括五大部分:核心API,集成API,用戶界面API,發(fā)布技術,Java虛擬機(JVM)。Java能夠在信息網(wǎng)絡時代快速發(fā)展,得益于它獨特的組成結構,它并不直接被編譯成所在平臺的機器語言然后執(zhí)行,而是先被編譯成字節(jié)碼,然后才到裝有JVM的硬件上運行,所以它能夠跨平臺運行;而且,不是一定要使用Java語言來寫程序才能編譯成Java字節(jié)碼,我們用C/C++/Javascript等語言來寫程序也可以編譯出JVM要求的字節(jié)碼文件。在這個時期,人們使用最多的 Java API 無疑地就是 AWT,因為 JDK 1.0 時只有 AWT 稱得上是一組完整的 framework,其它 Java API 都比較偏向個別的 class。
緊跟著,Sun公司在1997年2月18日發(fā)布了JDK1.1。JDK1.1相對于舊版本最大的改進,是推出了JIT(Just-In-Time)編譯器。傳統(tǒng)的JVM收到一道字節(jié)碼指令后,解釋成機器碼,馬上執(zhí)行該機器碼,然后丟掉該機器碼,再接收下一道字節(jié)碼指令……即便是以前執(zhí)行過的字節(jié)碼指令,依然需要重新解釋成機器碼才能執(zhí)行。而JIT編譯器會把常執(zhí)行的部分先解釋好放在內(nèi)存,以后再次執(zhí)行該指令時,不用再解釋,直接從內(nèi)存中取出機器碼就可以執(zhí)行了,這樣提高了不少的效率。
在JDK1.1時代,Java平臺分為PersonalJava與EmbeddedJava,前者比較適用于運算資源和內(nèi)存豐富的設備,而資源有限者適用于后者。這樣的分類明顯不符合時代發(fā)展的潮流,所以,Java平臺處處蘊藏著新的翻天覆地的革命……
2.J2SE1.2:誕生
JDK1.2在1998年12月4日的隆重發(fā)布,標志著Java2平臺的誕生。Java2的J2SE1.2時代是一個大變革時代,它進行了如下的三大革命:
* 市場推廣革命
在Java1.0或者1.1中,稱API庫為JDK,但為了方便市場推廣,Sun公司在Java1.2版以后將JDK1.2改名為J2SDK,將Java改名為Java 2。在99年Sun公司還將Java2平臺分為三大塊:J2SE,J2EE,J2ME。這次市場推廣革命順應了網(wǎng)絡急速發(fā)展的潮流,對Java2平臺的發(fā)展起到了很好的催化劑的作用。
* API供應標準革命
而隨著供應商的不同,Java的API分為三大類:
Java Core API:由Sun公司制定的基本的API,所有的Java平臺都應該提供。這就是我們平常所說的Java核心類庫。
Java Optional API:由Sun公司制定的擴充API,Java平臺可以有選擇地提供。比如, JFC以前是Sun對JDK的功能擴展,不是Java的公共規(guī)范。Java2平臺則包含了JFC技術,不需要再擴展了。
特殊API:由特殊廠商或者組織提供的API。比如,美國法律對出口中國的加解密算法的安全強度有一定的限制,Java平臺中不能包括一些安全強度較高的加密解密算法,所以部分其它國家的公司,如加拿大的BouncyCastle公司等,可以提供一些自己的安全API。
* API制定過程的革命
如果你有需求不能通過遵循標準的API來實現(xiàn),可以向 www.jcp.org 提出制定新的API的請求,經(jīng)過審核,你的請求可能被通過或者駁回;如果是被通過,則開始進入制定該API的程序。
J2SE1.2時代進行的這些革命形成的制度一直沿用到現(xiàn)在,對Java技術的發(fā)展形成了深遠的影響。
除了上述的三大革命,Java2 還支持并新增了許多新特性,最受追捧的當屬Swing庫。Swing 是輕量級 的 API,它不但有各式各樣先進的組件,而且連組件風格都可抽換。Swing 出現(xiàn)之后,大家很快地就不太使用 AWT 了。但請不要以為 Swing 是用來取代 AWT 的,其實 Swing 是架構在 AWT 之上的, Swing 的出現(xiàn)只是減少程序員直接使用 AWT 的機會,而不會讓 AWT 消失。Java2 還廢棄了一些API,最重要的莫過于Thread類中對suspend(),resume()和stop()等方法的廢棄。由于JDK1.1的集合類庫中的Vector類和HashTable類都考慮了同步,在平常的使用中影響效率,所以Java2專門添加了對應的非同步類,并完善了集合類庫。
Java2平臺能夠得到廣泛的應用,還應歸功于這個時期的一些優(yōu)秀書籍,比如著名的<<Core Java2>>(卷一和卷二),該書隨著JDK版本的變化已經(jīng)出到第六版。
3. J2SE1.3:拓廣
Java2平臺推出后,得到了市場的強烈反響,所以,在2000年5月8日推出的J2SE1.3對J2SE1.2的改進,主要是對各種已有API的加強和對新API的拓展。
數(shù)字運算: 加入了java.lang.StrictMath,方便我們的一般的數(shù)字運算。
新的Timer API:相信大家對其中的java.util.Timer和java.util.TimerTask一定不陌生。
Collections包:??加入了一些新的API,方便我們的使用。
虛擬機停止鉤子:J2SE1.3還加入了一個強大的功能,那就是虛擬機停止鉤子(Virtual Machine Shutdown Hooks),這個功能使得我們能夠在虛擬機停止時完成我們自己的操作,比如關閉網(wǎng)絡連接或者保存會話狀態(tài)或者清除臨時文件等等。
DNS服務:在JNDI接口方面,加入了一個DNS服務的實現(xiàn)。
Jini實現(xiàn):J2SE1.3包含了一個Jini實現(xiàn),這使得我們可以方便地把諸如打印機、攝像機和磁盤驅(qū)動設備插入現(xiàn)有網(wǎng)絡中,并且能自動搜索已在網(wǎng)上的設備可以提供的服務并享用這些服務。
XML支持:由于計算機網(wǎng)絡和XML技術的快速發(fā)展, J2SE1.3在Optional API中引入了Java API for XML包。
HotSpot虛擬機:J2SE1.3引入了HotSpot虛擬機。在solaris版的JDK1.3中,已經(jīng)不支持傳統(tǒng)的虛擬機,而windows版的JDK1.3同時支持傳統(tǒng)虛擬機和HotSpot虛擬機。
從上面的分析可以看出,J2SE1.3主要是對J2SE1.2查漏補缺和拓展新的API。從應用領域方面考慮,J2SE1.3已經(jīng)涵蓋了數(shù)據(jù)庫、WEB、多媒體、網(wǎng)絡、電話、影像、加解密、圖形等等大部分的信息技術領域。
在這個時期Java2還有一個重要活動就是推出SCSL(Sun社區(qū)源代碼許可)許可協(xié)議。Sun公司開放源代碼項目的“女1號”Danese Cooper在1999年加入公司,負責Sun(包括Java)和開放源代碼社區(qū)之間的協(xié)調(diào)工作。Sun一直盡可能在贏利和開放源代碼之間尋求更好的平衡。
在J2SE1.3時代,Java2平臺得到了充分的發(fā)展,各大應用服務器在這個時代漸漸成熟并被廣泛采納,而Java2相關的培訓和書籍更是如火如荼,《Thinking in Java》當屬不得不推薦的一本。
4. J2SE1.4:快速
J2SE1.4平臺的推出發(fā)生在2002年2月13日,由于此前在Java平臺和.Net平臺間發(fā)生了規(guī)模浩大的孰優(yōu)孰劣的論戰(zhàn),而論戰(zhàn)中,Java平臺最大的缺點就是性能問題,所以J2SE1.4平臺把性能的改善放在了最重要的位置。
HotSpot虛擬機: HotSpot虛擬機能夠很大程度上提高性能,所以J2SE1.4已經(jīng)不支持傳統(tǒng)的虛擬機。現(xiàn)在,啟動應用程序應該通過-client或者-server選項來啟動,如果你還是通過-classic選項來啟動,會收到這樣的錯誤提示:”Error: Classic VM no longer supported。”
鎖機制: 由于舊版的HotSpot虛擬機的鎖機制會導制嚴重的性能和功能問題,J2SE1.4已經(jīng)改寫了該鎖機制。
安全API: Java Cryptography Extension(JCE),Java Secure Socket Extension(JSSE)和Java Authentication and Authorization(JAAS)這三大安全API從optional API移到了core API中。這樣,J2SE1.4的安全域(SecureRandom)實現(xiàn)可以利用操作系統(tǒng)提供的安全機制,以便縮短應用程序的啟動時間。同時從optional API移到core API的功能還有XML處理API和JDBC2.0 API。
RandomAccess標記接口: 加入了RandomAccess標記接口,如果一個List實現(xiàn)了該接口,則表示它支持快速的隨機訪問,這樣可以提高List訪問的速度。
LinkedHashMap: 加入了LinkedHashMap,這是一個插入排序的Map實現(xiàn),但它的運行速度和HashMap一樣快。
反射: 很多產(chǎn)品中都要使用反射(Reflection)機制,但大家知道,反射是相當耗時的,所以,J2SE1.4中重寫了java.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()和Class.newInstance()等方法,使得我們利用反射也能寫出高性能的應用程序。
64位計算: J2SE1.4支持64位計算。64位支持使J2SE1.4可以使用超過幾百GB的內(nèi)存,而以前的版本僅可以使用4G以內(nèi)的內(nèi)存。內(nèi)存使用的擴大可以提高程序的運行效率。
新的I/O API: J2SE1.4在API層面最大的變動,就是它更新了原有的java.io包,以及加入了一組更有效率更多功能的新的I/O API。舊的I/O處理是以串流(stream)的方式來存取的,以字節(jié)為單位,而新的I/O處理是以塊(block)的方式來存取的。一個塊可能包含了512字節(jié),而磁盤的存取本就是一個塊一個塊來進行的,所以新的I/O處理方式對于底層底數(shù)據(jù)存取更自然更有效率。
斷言和日志處理: J2SE1.4版本在Java語言層面上加入了斷言(assert關鍵字),在API層面上加入日志處理API,這些為程序的調(diào)試提供了強有力的支持 。
從上面的分析可以看出,Java 2平臺在經(jīng)過數(shù)年的發(fā)展后,已經(jīng)比較成熟穩(wěn)定,J2SE1.4主要是對平臺的性能進行較多的考慮和修改。在分布式程序方面,1.4版比1.3版的運行效率提高了一半以上;而在客戶端程序方面,1.4版比1.3版的效率提高了1/3。當然,除了考慮運行效率,J2SE1.4還有其它方面的改進,如推出了一個全新的運行Java應用程序的方法Java Web Start,該方法克服了Java Applet的安全性限制的問題和Java Application的軟件發(fā)布難的問題,并結合了上面兩種方法的好處,為Java軟件客戶提供了非常友好的使用體驗。
J2SE1.4版是J2SE第一個參與了 Java共同體過程(JCP)的J2SE版本。 象Borland、Compaq、Fujitsu、 SAS、 Symbian、 IBM這樣的公司,和Sun一起定義并發(fā)展了J2SE 1.4規(guī)范。在開放、良好的文檔編撰與管理的過程中,形成了一個高質(zhì)量的、代表了Java共同體的多樣性的規(guī)范。J2SE1.4的Specification Lead是Doug Kramer。Doug Kramer是優(yōu)秀的Java開發(fā)人員和著名的教育培訓專家,他同時還是J2SE1.4.2的Specification Lead 和J2SE1.5的JVM的Specification Lead。
5. J2SE5.0:易用
在2004年十月J2SE5.0發(fā)布的時候,SUN公司這樣解釋這次版本名稱不是J2SE1.5而是J2SE5.0的原因:“從Java誕生至今已有9年時間,而從有J2SE算起也有5個年頭了;在這樣的背境下,將該版本號從1.5改為5.0可以更好的反映出新版的J2SE的成熟度、穩(wěn)定性、可伸縮性、安全性。”
J2SE的這次變更之重大和意義之深遠,的確也值得我們?yōu)橹寻姹咎栕儞Q到J2SE5.0。我們再看看Sun公司網(wǎng)站對J2SE5.0的features描述:“通過增強Java平臺的力量,允許開發(fā)者更容易地使用,Java編程語言的這些改進將吸引大量各種Java開發(fā)者”,這是“Java技術發(fā)展歷程的一個重要里程碑” 。從這個描述我們可以看出,J2SE5.0最大的目標是通過提供易用性而吸引各種開發(fā)者(當然包括以前的C/C++開發(fā)者) ,而它對以前版本的修改并不僅僅是API的升級,而且包括對Java語言層面的改進。
訪問環(huán)境變量: 最初的Java語言有一個訪問環(huán)境變量的方法System.getenv(),但因為Java宣稱的”Write Once,Run AnyWhere”特性,所以在JDK1.0中去掉了這個能夠訪問平臺專有信息的方法。在J2SE5.0中,它又來了,并有所擴充。由此可見J2SE5.0對編程方便性的重視程度。
泛型 J2SE5.0提供了強大的泛型機制,讓程序員可以減少代碼重復,這個變化應該可以吸引小部分的C#開發(fā)人員吧。
增強的for循環(huán) 為了克服普通for循環(huán)的代碼臃腫特點,J2SE5.0提供了增強的for循環(huán),我們現(xiàn)在可以這樣寫一個for循環(huán):
public void printAll(Collection<String> coll)
{
for(String str : coll)
{
System.out.println(str);
}
}
怎么樣?是不是簡單了很多?
自動的裝箱/拆箱 我們以前手工的做裝箱(Boxing)/拆箱(unBoxing)操作時,是不是很煩?放心,J2SE5.0提供了自動的裝箱/拆箱操作,我們現(xiàn)在可以寫如下的代碼:
public void boxing(int i)
{
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(0,i);
System.out.println(“i的值是”+list.get(0));
}
可變參數(shù)數(shù)目 J2SE5.0 開始支持Varargs(不固定自變量個數(shù)),J2SE5.0中還加入了以前拋棄的枚舉和C風格的格式化輸出,這應該是為了吸引以前的C開發(fā)者吧。畢竟,在C開發(fā)中枚舉和格式化輸出用的是太多了。
并發(fā) J2SE5.0中加入了java.util.concurrent包,并向集合框架中加入了Queue接口,J2SE5.0還為各種集合提供了并發(fā)情況下的實現(xiàn)。
Properties類增強 由于XML的普及性應用,J2SE5.0為java.util.Properties類加入了從XML文件中裝載屬性和把屬性值存儲到XML文件中的方法。
Annotation功能 J2SE5.0提供了注解(annotation)/元數(shù)據(jù)(metadata)功能,相信以后的大部分應用產(chǎn)品都將充分利用它的注解而實現(xiàn)產(chǎn)品的各種特性。
其它 J2SE5.0還在多線程(并發(fā)機制)、安全、國際化、UI等方面進行了大規(guī)模的變更,使得我們能夠更方便地進行Java開發(fā)。
其實,上面的這些變更,并不是我們程序員非要不可的內(nèi)容。我們完全可以通過自己的辦法來達到這些變更實現(xiàn)的功能。但J2SE5.0的目標就是讓我們程序員能夠更加方便地進行開發(fā),所以,我們在基于J2SE5.0開發(fā)時,應該能夠明顯的體會到它的易用性。
6.展望
時至今日,J2SE已經(jīng)發(fā)展為一個覆蓋面廣、效率高、易用性強的技術平臺,但Java并沒有停止前進的腳步。Mustang版本的J2SE正在緊鑼密鼓的開發(fā)當中,按以前的慣例,每兩年會發(fā)布一個全新的J2SE版本,所以Mustang開發(fā)版對應的J2SE6.0發(fā)布版將在2006年完成。
J2SE6.0的Specification Lead是Sun公司老資格的開發(fā)者Mark Reinhold,我們在J2SE1.2中就能看到他的影子。Mark Reinhold曾經(jīng)是NIO(新的I/O處理) API的Specification Lead,現(xiàn)在是Sun的J2SE架構師與總工程師。Mark Reinhold透露說,J2SE6.0將更易于管理,可以給外部的管理軟件提供更多信息。它可以讓調(diào)試軟件在程序運行的時候進行檢查,而不是在運行之前,這樣更容易找到問題所在。他說,J2SE6.0 將會更好地和圖形用戶界面集成,包括微軟即將發(fā)布的Windows 版本Longhorn。
2005年3月23日是Java技術十周年慶典日,在這十年的發(fā)展中,Java平臺吸引了四百萬開發(fā)者,在網(wǎng)絡計算遍及全球的今天,更是有17.5億臺設備使用了Java技術。作為Java技術的基礎,J2SE的功績不可掩沒,我們期望J2SE伴隨Java平臺一路走好!