JDK各版本區別整理(1.5-1.10)
本文主要整理自己覺得相對比較重要的一些版本區別。
jdk1.5新特性
1.自動裝箱與拆箱:原始型別與對應的包裝類不用顯式轉換
ArrayList list=new ArrayList()----------->ArrayList<Integer>list=new ArrayList<Integer>();
2.靜態匯入:通過使用 import static,就可以不用指定 Constants 類名而直接使用靜態成員,包括靜態方法。
Math.sqrt();----------->sqrt();
3.For-Each迴圈:For-Each迴圈得加入簡化了集合的遍歷。
for (i=0;i<a.length;i++){......}----------->for(int i:a){......}
4.泛型:可以指定集合的元素型別。
ArrayList list=new ArrayList()----------->ArrayList<Integer>list=new ArrayList<Integer>();
5.變長引數:有任意個引數,看作陣列。
int sum(int ...intlist)
jdk1.6新特性
1.使用Compiler API
2.輕量級Http Server API
jdk1.7新特性
1.switch中可以使用字串
String s = ... switch(s) { case "quux": processQuux(s); // fall-through case "foo": case "bar": processFooOrBar(s); break; case "baz": processBaz(s); // fall-through default: processDefault(s); break; }
- 對集合類的語言支援:Java將包含對建立集合類的第一類語言支援。這意味著集合類的建立可以像Ruby和Perl那樣了(下面的這些集合是不可變的)。
原本需要這樣: List<String> list = new ArrayList<String>(); list.add("item"); String item = list.get(0); Set<String> set = new HashSet<String>(); set.add("item"); Map<String, Integer> map = new HashMap<String, Integer>(); map.put("key", 1); int value = map.get("key"); 現在你可以這樣: List<String> list = ["item"]; String item = list[0]; Set<String> set = {"item"}; Map<String, Integer> map = {"key" : 1}; int value = map["key"];
jdk1.8新特性
1.HashMap中的紅黑樹:HashMap中鏈長度大於8時採取紅黑樹的結構儲存。
紅黑樹,除了新增的情況外,其他時候效率高於連結串列結構。
2.ConcurrentHashMap:底層採用node陣列+連結串列+紅黑樹的儲存結構,通過CAS演算法(樂觀鎖機制)+synchronized來保證併發安全的實現。
put()方法過程:
1) 根據key的hash值陣列中相應位置的Node還未初始化,則通過CAS插入相應的資料;
2) 如果相應位置的Node不為空,且當前該節點不處於移動狀態,則對該節點加synchronized鎖,如果該節點的hash不小於0,則遍歷連結串列更新節點或插入新節點;
3) 如果該節點是TreeBin型別的節點,說明是紅黑樹結構,則通過putTreeVal方法往紅黑樹中插入節點;
3.介面中可以有預設方法與靜態方法,也就是介面中可以有實現方法
預設方法中的default不可省略,子類重寫時候,必須去掉default修飾符
4.Lambda表示式:lambda表示式的使用簡化了程式碼。
jdk1.9新特性
1.在1.8的基礎上又增加了私有方法和私有靜態方法(1.8首次計劃實現介面的私有方法,卻是在1.9中實現)。
2.模組化系統:模組化是一個很通用的概念。在軟體中,模組化可以運用到編寫和實現一個程式和計算系統,他們都是作為獨立的模組,而不是作為一個單一的和完整的設計。
3.JShell–Java 9 REPL:REPL是一種快速執行語句的命令列工具。
4.集合工廠方法:1.9引入了一些有用的工廠方法來建立不可修改的集合。
5.G1是Java 9中的預設GC
jdk1.10新特性
因為JAVA 10較新,所以從網上摘錄了較全的一些新特性,前兩個重點記憶。
1.區域性變數型別推斷:區域性變數型別推斷將引入"var"關鍵字,也就是你可以隨意定義變數而不必指定變數的型別.
原本需要這樣:
List <String> list = new ArrayList <String>();
Stream <String> stream = getStream();
現在你可以這樣:
var list = new ArrayList <String>();
var stream = getStream();
說到型別推斷,從JDK 5引進泛型,到JDK 7的"<>"操作符允許不繫結型別而初始化List,再到JDK 8的Lambda表示式,再到現在JDK 10的區域性變數型別推斷,Java型別推斷正大刀闊斧的向前發展。
2.GC改進和記憶體管理
JDK 10中有2個JEP專門用於改進當前的垃圾收集元素。
第一個垃圾收集器介面是(JEP 304),它將引入一個純淨的垃圾收集器介面,以幫助改進不同垃圾收集器的原始碼隔離。
預定用於Java 10的第二個JEP是針對G1的並行完全GC(JEP 307),其重點在於通過完全GC並行來改善G1最壞情況的等待時間。G1是Java 9中的預設GC,並且此JEP的目標是使G1平行。
3.執行緒本地握手(JEP 312)
JDK 10將引入一種線上程上執行回撥的新方法,因此這將會很方便能停止單個執行緒而不是停止全部執行緒或者一個都不停。
4.備用記憶體裝置上的堆分配(JEP 316)
允許HotSpot VM在備用記憶體裝置上分配Java物件堆記憶體,該記憶體裝置將由使用者指定。
5.其他Unicode語言 - 標記擴充套件(JEP 314)
目標是增強java.util.Locale及其相關的API,以便實現語言標記語法的其他Unicode擴充套件(BCP 47)。
6.基於Java的實驗性JIT編譯器
Oracle希望將其Java JIT編譯器Graal用作Linux / x64平臺上的實驗性JIT編譯器。
7.根證書(JEP 319)
這個的目標是在Oracle的Java SE中開源根證書。
8.根證書頒發認證(CA)
這將使OpenJDK對開發人員更具吸引力,它還旨在減少OpenJDK和Oracle JDK構建之間的差異。
9.將JDK生態整合單個儲存庫(JEP 296)
此JEP的主要目標是執行一些記憶體管理,並將JDK生態的眾多儲存庫組合到一個儲存庫中。
10.刪除工具javah(JEP 313)
從JDK中移除了javah工具,這個很簡單並且很重要。