JavaSE5.0-14.0新特性變化歷史回顧

摘要:Java是一門面向對象的編程語言,自1995年5月23日問世以來,已有十數版更新發布。只有瞭解Java歷史,纔可能瞭解Java的前世今生,把握Java的未來。作爲一名初學者,有必要系統瞭解Java各個版本的發佈歷史及其新的不同特性,本文系統研究回顧了Java標準版本JavaSE ( Java Standard Edition, JavaSE)從5.0至14.0各個版本相比上一版本的新特性變化。報告內容可以作爲JavaSE初學者的系統性學習資料,報告內容也已發佈在個人CSDN上,與同爲初學者的用戶共同學習,以期大家對Java的發展歷史擁有比較全面的瞭解。

關鍵詞:JavaSE歷史版本;新特性;初學者

1引言

       正如Java白皮書所寫,Java是一門簡單的、面向對象的、分佈式、解釋、健壯、安全、結構中立、可移植、高效能、多線程、動態的語言[1]。NASA的科學家們正是通過一個名爲Maestro的Java程序來控制勇氣號,這個過程像玩遊戲一樣簡單,這也足以說明Java程序使用的廣泛性和簡單性[2]。

       Java自1995年5月23日發佈以來,歷經十數版本,每次更新都會帶來一些新特性,然而在其不斷更新的過程中,Java的用戶越來越多,依然在各大網站評比某年最流行的編程語言的的排行中位數前列,這些背後依賴的便是Java語言的基本特性。具體來說,簡單性就是指Java剔除了C++中很少使用、易於混淆、難以理解的特性,例如頭文件、指針、結構、聯合、操作符重載等,所開發軟件均能在小型機器上運行。面向對象是指Java面向數據和目標對象本身,而非實現操作的“工具”。分佈式是指Java程序本身有豐富的例程庫,能夠通過URL打開和訪問網絡上的對象。健壯性指Java能夠在運行前就能檢查出許多其他編程語言在運行後才能發現的bug,進行早期問題檢測,節約時間。安全性是指Java能夠防範各種病毒和試圖篡改的代碼的攻擊。結構中立指編譯器生成一個體繫結構中立的目標文件格式,這是一種編譯過的代碼,只要有Java 運行時系統,這些編譯後的代碼可以在許多處理器上運行。可移植性指Java基本數據類型和大小都有明確規定,擁有可移植的接口。高性能指在運行時字節碼能夠動態翻譯成特定CPU的機器碼。此外,Java可以多線程工作,Java庫中可以動態自由修改添加新方法,對客戶端沒有影響[3]。正是由於上述特性,Java以其獨特的風格獲得了衆多程序員的青睞。

       大量的應用軟件和Web節點由Java開發或者用到Java,可以說,從遊戲控制檯到科學超級計算機,從手機到互聯網,Java 無處不在[4]!而不斷更新發布的JavaSE版本也爲這些應用的開發增添新色,作爲一名初學者,有必要詳細瞭解一下各版本JavaSE之間的區別,對於後續學習也能起到開門見山、奠定基礎的作用!

2 JavaSE各版本發佈及其新特性變化

       自誕生以來,Java歷經十數版而存活,並且被廣泛使用至今。關於Java,一個比較有趣的事情就是Java自身的命名方式的變化。從1996年1月23日至1999年4月8日,Java從JDK1.0更新至JDK1.1.8,在1998年12月8日JAVA2企業版J2EE發佈,1999年6月,SUN公司發佈Java三個版本:標準版、企業版和微型版(J2SE、J2EE、J2ME),從1998年12月4日至2003年6月26日,JavaSE經歷了J2SE1.2至J2SE1.4.2的版本變化。2004年9月30日,J2SE1.5發佈,具有里程碑意義,爲顯示這個版本的重要性,將要發佈的J2SE1.5更名爲J2SE5.0,從而也正式結束了“1”的時代。2005年6月,Java取消各種版本號中的數字“2”,曾經的J2EE更名爲Java EE, J2SE更名爲Java SE,J2ME更名爲Java ME,同時SUN公司公開JavaSE6.0,J2SE1.5也變爲JavaSE5.0,這種命名方式持續下去,一直到2019年JavaSE14.0.

       JavaSE從JavaSE5.0開始,至JavaSE14.0,因此對於初學者我們有必要從5.0開始詳細瞭解一下每次發佈新版本時,其與以前發佈版本相比的新特性,包括其新增或改進方面的特性。

2.1JavaSE5.0發佈時間及其新特性

       2004年9月30日發佈。

主要新特性體現在以下幾個方面:

(1)自動裝箱與拆箱。自動裝箱指需要一種類型對象時,該基本類型就會自動封裝到與它相同類型的包裝中。自動拆箱指每需要一個值時,被裝箱對象中值就會被自動提取出來,而不需去調intValue()和doubleValue()方法。(2)枚舉。提取集合中的對象元素。枚舉類型使代碼更具可讀性,理解清晰,易於維護。枚舉類型是強類型的,從而保證了系統安全性。而以類的靜態字段實現的類似替代模型,不具有枚舉的簡單性和類型安全性。枚舉有簡單用法和內置複雜用法(Java內置)。(3)靜態導入。通過使用 import static,可不用指定Constants類名而直接使用靜態成員,包括靜態方法。import xxxx 和 import static xxxx的區別是前者一般導入的是類文件如import Java.util.Scanner;後者一般是導入靜態的方法,import static Java.lang.System.out。(4)可變參數(Varargs)。可變參數的簡單語法格式:methodName([argumentList],dataType... argumentName)。(5)內省(Introspector)。內省是Java語言對Bean類屬性、事件的一種缺省處理方法。通過類Introspector來獲取某個對象的BeanInfo信息,接着通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應的getter/setter方法,最後可通過反射機制來調用這些方法。(6)泛型(Generic)。C++ 通過模板技術可以指定集合的元素類型,而Java在1.5之前一直沒有相對應的功能。一個集合可以放任何類型的對象,從該集合裏面拿對象的時候我們也不得不對他們進行強制類型轉換操作。而JavaSE5.0新增了泛型,它允許指定集合裏元素的類型,這樣方便了編譯時類型檢查。(7)For-Each循環。For-Each循環的加入簡化了集合的遍歷過程。(8) 輸入控制檯。在Java.lang.Scanner類,可以實現從控制檯直接讀取數據。(9)格式化輸出、Unicode編碼、構建字符串的新方法StringBuilder。

2.2 JavaSE6.0發佈及其新特性

       2006年12月11日發佈。

       主要新特性體現在以下幾個方面:

(1)存取權限控制方法。JavaSE5.0中提供的存取權限直接用於存取對象時可能導致File類方法失敗,JavaSE6.0提供了6種新方法以便修改路徑名的存取權限,具體包括public boolean setExecutable(Boolean executable,Boolean ownerOnly)、public oolean setReadable( oolean readable, oolean ownerOnly)等。(2)桌面集成。三個新特徵是:Splash屏幕支持(它讓應用程序在啓動過程中顯示Splash屏幕),系統托盤支持(它讓應用程序把圖標,提示窗信息和彈出菜單添加到系統托盤),和一組新的桌面API。詳細方法查找官方資料。(3)支持腳本語言。JavaSE6.0加入了對Script(JSR223)的支持。這是一個腳本框架,提供了讓腳本語言來訪問Java內部的方法。可以在運行的時候找到腳本引擎,然後調用這個引擎去執行腳本。這個腳本API允許爲腳本語言提供Java支持。另外,Web Scripting Framework允許腳本代碼在任何的Servlet容器(例如Tomcat)中生成Web內容。(4)JDBC4.0. 藉助Mustang中包含的Java SE Service Provider機制,Java開發人員不再需要使用像Class.forName()這樣的代碼顯式地加載JDBC驅動程序,就能註冊JDBC驅動程序。通過在調用DriverManager.getConnection()方法時自動定位合適的驅動程序,DriverManager類可以做到這一點。這個功能是向後兼容的,所以無需修改現有的JDBC代碼。在訪問關係數據庫的Java應用程序中,通過最小化我們需要編寫的“模板”代碼,JDBC 4.0還改善了開發人員體驗。它還提供實用程序類,以改進JDBC驅動程序的註冊和卸載機制,以及管理數據源和連接對象。(5)Java Compiler API。可以用JDK6 的Compiler API(JSR 199)去動態編譯Java源文件,Compiler API結合反射功能就可以實現動態的產生Java代碼並編譯執行這些代碼,有點動態語言的特徵。這個特性對於某些需要用到動態編譯的應用程序相當有用。(6)可插拔註解。(7) 增加對Native PKI(Public Key Infrastructure), Java GSS(Generic Security Service),Kerberos和LDAP(Lightweight Directory Access Protocol)支持。(8)集成web services。

2.3 JavaSE7.0發佈及其新特性

       2011年7月8日發佈。

       主要新特性體現在以下幾個方面:

(1)switch語句塊中允許以字符串作爲分支條件。(2)在創建泛型對象時應用類型推斷。(3)在一個語句塊中捕獲多種異常。(4)支持動態語言。(5)支持try-with-resources(在一個語句塊中捕獲多種異常)(6)引入Java NIO.2開發包。(7)數值類型可以用二進制字符串表示,並且可以在字符串表示中添加下劃線。(8)鑽石型語法(在創建泛型對象時應用類型推斷)(9)null值自動處理。

2.4 JavaSE8.0發佈及其新特性

       2014年3月 18日發佈。

主要新特性體現在以下幾個方面:

(1)Lambda 表達式。Lambda允許把函數作爲一個方法的參數(函數作爲參數傳遞到方法中)。(2)方法引用。方法引用提供了非常有用的語法,可以直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗餘代碼。(3)默認方法。默認方法就是一個在接口裏面有了一個實現的方法。(4)新工具。新的編譯工具,如:Nashorn引擎 jjs、類依賴分析器jdeps。(5)Stream API 。新添加的Stream API(Java.util.stream)把真正的函數式編程風格引入到Java中。(6)Date Time API 。加強對日期與時間的處理。(7)Optional類 。Optional 類已經成爲Java8類庫的一部分,用來解決空指針異常。(8)Nashorn, JavaScript 引擎。Java 8提供了一個新的Nashorn Javascript引擎,它允許我們在JVM上運行特定的Javascript應用。

2.5 JavaSE9.0發佈及其新特性

       2017年9月22日發佈。

       主要新特性體現在以下幾個方面:

(1)模塊系統。模塊是一個包的容器,Java 9 最大的變化之一是引入了模塊系統(Jigsaw 項目)。(2)REPL (JShell)。交互式編程環境。(3)HTTP 2 客戶端。HTTP/2標準是HTTP協議的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服務器推送特性。(4)改進的 Javadoc。Javadoc 現在支持在 API 文檔中的進行搜索。另外,Javadoc 的輸出現在符合兼容 HTML5 標準。(5)多版本兼容 JAR 包。多版本兼容 JAR 功能能讓你創建僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本。(6)集合工廠方法。List,Set 和 Map 接口中,新的靜態工廠方法可以創建這些集合的不可變實例。(7)私有接口方法。在接口中使用private私有方法。我們可以使用 private 訪問修飾符在接口中編寫私有方法。(8)進程 API。改進的 API 來控制和管理操作系統進程。引進 Java.lang.ProcessHandle 及其嵌套接口 Info 來讓開發者逃離時常因爲要獲取一個本地進程的 PID 而不得不使用本地代碼的窘境。(9)改進的 Stream API。改進的 Stream API 添加了一些便利的方法,使流處理更容易,並使用收集器編寫複雜的查詢。(10)改進 try-with-resources。如果你已經有一個資源是 final 或等效於 final 變量,您可以在 try-with-resources 語句中使用該變量,而無需在 try-with-resources 語句中聲明一個新變量。(11)改進的棄用註解@Deprecated。註解@Deprecated可以標記Java API狀態,可以表示被標記的API將會被移除,或者已經破壞。(12)改進鑽石操作符(Diamond Operator) 。匿名類可以使用鑽石操作符(Diamond Operator)。(13)改進 Optional 類。Java.util.Optional 添加了很多新的有用方法,Optional 可以直接轉爲 stream。(14)多分辨率圖像 API。定義多分辨率圖像API,開發者可以很容易的操作和展示不同分辨率的圖像了。(15)改進的 CompletableFuture API。CompletableFuture 類的異步機制可以在ProcessHandle.onExit方法退出時執行操作。(16)輕量級的JSON API。內置了一個輕量級的JSON API。(17)響應式流(Reactive Streams) API。Java 9中引入了新的響應式流 API 來支持 Java 9 中的響應式編程。

2.6 JavaSE10.0發佈及其新特性

       2018年3月21日發佈。

       主要新特性體現在以下幾個方面:

(1)var局部變量類型推斷。(2)將原來用Mercurial管理的衆多 JDK倉庫代碼,合併到一個倉庫中,簡化開發和管理過程。(3)統一的垃圾回收接口。(4) G1垃圾回收器的並行完整垃圾回收,實現並行性來改善最壞情況下的延遲。(5)應用程序類數據 (AppCDS) 共享,通過跨進程共享通用類元數據來減少內存佔用空間,和減少啓動時間。(6) ThreadLocal握手交互。在不進入到全局 JVM 安全點 (Safepoint) 的情況下,對線程執行回調。優化可以只停止單個線程,而不是停全部線程或一個都不停。(7)移除 JDK 中附帶Javah工具。可以使用 Javac -h 代替。(8)使用附加的 Unicode 語言標記擴展。(9)能將堆內存佔用分配給用戶指定的備用內存設備。(10)使用Graal基於Java的編譯器,可以預先把Java代碼編譯成本地代碼來提升效能。(11)在OpenJDK中提供一組默認的根證書頒發機構證書。開源目前 Oracle 提供的的 Java SE 的根證書,這樣 OpenJDK 對開發人員使用起來更方便。(12)基於時間定義的發佈版本,即上述提到的發佈週期。版本號爲\$FEATURE.\$INTERIM.\$UPDATE.\$PATCH,分別是大版本,中間版本,升級包和補丁版本。

2.7 JavaSE11.0發佈及其新特性

       2018年9月25日發佈。

(1)Nest-Based訪問控制。(2)動態類文件常量。(3)改善Aarch64 intrinsic。(4)無操作垃圾收集器。(5)消除Java EE和CORBA模塊。(6)HTTP客戶端(標準)。(7)局部變量的語法λ參數。(8)Curve25519和Curve448關鍵協議。(9)Unicode 10。(10)飛行記錄器。(11)ChaCha20和Poly1305加密算法。(12)發射一列縱隊源代碼程序。(13)低開銷堆分析。(14)傳輸層安全性(Transport Layer Security,TLS)1.3。(15)動作:一個可伸縮的低延遲垃圾收集器 (實驗)。(16)反對Nashorn JavaScript引擎。(17)反對Pack200工具和API

2.8 JavaSE12.0發佈及其新特性

       2019年3月發佈。

       主要新特性體現在以下幾個方面:

(1)JDK 12版本包含對Unicode 11.0.0的支持。684個新字符、11個新塊、7個新腳本。(2)在Linux上的posix_spawn選項。作爲在Linux上啓動進程的另一種方法,jdk.lang.Process.launchMechanism可以將該屬性設置爲POSIX_SPAWN。POSIX_SPAWN減輕了產生子進程時的罕見病理情況,但尚未經過充分測試。(3)JVM常量API。新軟件包Java.lang.invoke.constant引入了一個API,用於對類文件和運行時工件的名義描述進行建模,特別是可以從常量池中加載的常量。(4)支持緊湊型數字格式。NumberFormat增加了對以緊湊格式格式化數字的支持。緊湊的數字格式是指數字的簡短形式或易於理解的形式。(5) ZGC併發類卸載。Z垃圾收集器現在支持類卸載。通過卸載未使用的類,可以釋放與這些類相關的數據結構,從而減少應用程序的總體佔地面積。(6)Java堆的老一代對備用內存設備分配。G1和Parallel GC中的這一實驗性功能允許他們在替代存儲設備(例如NV-DIMM內存)上分配舊版Java堆。(7)禁止並允許Java.security.manager系統屬性的選項 。新的“ disallow”和“ allow”令牌選項已添加到Java.security.manager系統屬性。在JDK實現中,如果Java虛擬機以系統屬性Java.security.manager設置爲“ disallow”開始,則該System.setSecurityManager方法不能用於設置安全管理器,並且會拋出UnsupportedOperationException。“禁止”選項可以提高從未設置安全管理器的應用程序的運行時性能。(8)groupname選項添加到在keytool密鑰對生成。(9)新的Java Flight RecorderJFR)安全事件。(10)自定義PKCS12密鑰庫生成、ChaCha20Poly1305 TLS密碼套件、支持krb5.confdns_canonicalize_hostname(11)jdeps -print-模塊的DEP報告傳遞的依賴性、開關表達式(預覽) 

2.9 JavaSE13.0發佈及其新特性

       2019年9月發佈。

主要新特性體現在以下幾個方面:

       (1) 添加了FileSystems.newFileSystemPathMap <String,?>)方法 (2) 新的Java.nio.ByteBuffer批量獲取/放置方法無需考慮緩衝區位置即可傳輸字節 (3) 支持Unicode 12.1 。此版本將Unicode支持升級到12.1。(4) ZGC取消提交未使用的存儲器。(5) 添加了XXSoftMaxHeapSize標誌 (6) ZGC最大堆大小增加到16TB 。ZGC支持的最大堆大小從4TB增加到16TB。(7) 擴展了應用程序類數據共享(AppCDS),以允許在Java應用程序退出時動態歸檔類。通過消除用戶進行試運行來爲每個應用程序創建類列表的需求,它還提高了AppCDS的可用性。(8) CRL的可配置讀取超時。該com.sun.security.crl.readtimeout系統屬性集的最大讀取超時CRL檢索,單位爲秒。如果尚未設置該屬性,或者該屬性的值爲負,則將其設置爲默認值15秒。值爲0表示無限超時。(9) 新的keytool -showinfo -tls命令用於顯示TLS配置信息。(10) 支持下一代MS密碼學(CNG (11) SunPKCS11提供升級,支持PKCS11 V2.40 (12) 支持在TLS X25519X448 (13)沒有服務器端狀態的會話恢復。(14) 允許限制SASL機制。(15) 用於Canonical XML 1.1 URI的新字符串常量。(16) 改進的Javadoc搜索、文本塊。

2.10 JavaSE14.0發佈及其新特性

       2020年3月發佈。

       主要新特性體現在以下幾個方面:

       (1)會計貨幣格式支持。可以通過NumberFormat.getCurrencyInstance(Locale)使用“ u-cf-account” Unicode區域設置擴展名來獲得具有記帳樣式的貨幣格式實例,其中在某些區域設置中用括號將金額格式化。例如在中Locale.US,它將格式化爲“ ($3.27)”而不是“ -$3.27”。(2)在JDK 14中,“ 記錄(JEP 359)”預覽功能添加了一個新類Java.lang.Record。該Java.lang軟件包是按需隱式導入的import Java.lang.*。如果現有源文件中的代碼按需導入某些其他程序包,例如,import com.myapp.*;並且該其他程序包聲明瞭一個名爲的類型Record,則引用該類型的現有源文件中的代碼將不進行更改而不會編譯。(3)闡明ReadableByteChannel.read()的規範和相關方法。(4)ZGCWindows MacOS上的變化。(5)並行GC改進。並行GC已採用與其他收集器相同的任務管理機制來調度並行任務,這可能會顯着提高性能。(5)NUMA感知內存分配。G1垃圾收集器現在嘗試跨垃圾收集在年輕一代的同一NUMA節點上分配並保留對象。這類似於並行GC NUMA意識。(6)JFR事件流。(7)Santuario庫已更新至版本2.1.4(8)允許默認情況下調用可發現的Javac插件。現在,如果未Javac在從命令行傳遞的選項或optionsAPI調用的參數中顯式啓動Javac“ plugins”,則默認情況下可以選擇啓動它。通過實現Plugin.isDefault()return 方法可以啓用此行爲true。(9)SAX ContentHandler的用於處理XML聲明的新方法。declaration添加了一個新方法SAX ContentHandler來接收XML聲明的通知。通過實現此方法,應用程序可以完全按照輸入文檔中的聲明接收版本,編碼和獨立屬性的值。

       通過總結JavaSE5.0至JavaSE14.0的變化,可以看出,每一版發佈都有其亮點,增加新的功能,增強上一版的功能,或者刪除部分過時功能,都是新版發佈的主要內容。作爲初學者,通過總結以上內容,可以體會整個JavaSE發展的過程,更好地理解今後編程可能涉及到的上述內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章