作者:拔劍少年
簡書地址:http://www.lxweimin.com/u/dad4d9675892
博客地址:https://it18monkey.github.io
轉載請注明出處
java5
-
泛型 (Generics)
List<Integer> list=new ArrayList<Integer>();
-
增強循環(Enhanced for Loop)
int[] array = {1, 2, 3, 4, 5}; for (int i : array) { System.out.println(i); }
自動封箱拆箱(Autoboxing/Unboxing )。八大基本類型和它們的包裝類能夠自動的相互轉換。
-
枚舉(Typesafe Enums)。
ps:枚舉是一種實現線程安全的單例模式的好方式。
enum TestEnum{ one, two; TestEnum() { } }
-
可變參數 (Varargs)
語法:
(type... arguments)
可變參數本質仍然是用一個數組存儲參數,只是java隱藏了這一過程。需要注意的是如果一個方法聲明中含有可變參數,那必須放在最后一個位置。
/** * 可變參數測試 * * @param args */ public static void testVarargs(String... args) { //本質就是個數組 System.out.println(args[1]); for (String arg : args) { System.out.println(arg); } }
-
靜態導入(Static Import)。通過import類來使用類里的靜態變量或方法(直接通過名字,不需要加上
類名.
),簡化了代碼的書寫。//單個導入 import static java.lang.Math.PI; //批量導入 import static java.lang.Math.*;
ps:過去的版本中只能通過繼承類或實現接口才能使用。
-
注解(Annotations)。關鍵字
@interface
。//注釋注解的注解又叫做元注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotations { //注解內可以添加方法,也可以不添加 //注解方法的返回值只能是基本類型,String,Class類,枚舉,注解,可以有默認值。 int id(); String name() default "whh"; Class classType(); TestEnum enumType(); }
新的線程模型和并發庫(
java.util.concurrent
)。
java6
- 集合框架增強。
- 為了更好的支持雙向訪問集合。添加了許多新的類和接口。
- 新的數組拷貝方法。
Arrays.copyOf
和Arrays.copyOfRange
//以下為添加的新接口和類
Deque,BlockingDeque,NavigableSet,NavigableMap,ConcurrentNavigableMap,ArrayDeque, ConcurrentSkipListSet ,ConcurrentSkipListMap,ConcurrentSkipListMap ,AbstractMap.SimpleEntry ,AbstractMap.SimpleImmutableEntry
- Scripting. 可以讓其他語言在java平臺上運行。 java6包含了一個基于Mozilla Rhino實現的javascript腳本引擎。
- 支持JDBC4.0規范。
java7
-
二進制前綴
0b
或者0B
。整型(byte, short, int, long)可以直接用二進制表示。//二進制字面值前綴0b 或0B int i = 0b010;//10進制值為2 int j = 0B010;
字面常量數字的下劃線。用下劃線連接整數提升其可讀性,自身無含義,不可用在數字的起始和末尾。
//數字間的下劃線不影響實際值
int k = 1_1;//值為11
- switch 支持String類型。
-
泛型實例化類型自動推斷。
Map<String, List<String>> myMap = new HashMap<String, List<String>>(); // 之前 Map<String, List<String>> myMap = new HashMap<>(); // 現在
try-with-resources語句。
/*
* 聲明在try括號中的對象稱為資源,在方法執行完畢后會被自動關閉,相對與之前必須在finally關閉資源,這一特性大大提高了代碼的簡潔性。
* 所有實現java.lang.AutoCloseable接口的類都作為資源被自動關閉。
*/
try (BufferedReader reader=new BufferedReader(new FileReader("d:1.txt"))){
return reader.readLine();
}
- 單個catch中捕獲多個異常類型(用
|
分割)并通過改進的類型檢查重新拋出異常。
java8
- lambada表達式(Lambda Expressions)。Lambda允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。
- 方法引用(Method references)。方法引用提供了非常有用的語法,可以直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,可以使語言的構造更緊湊簡潔,減少冗余代碼。
- 默認方法(Default methods)。默認方法允許將新功能添加到庫的接口中,并確保兼容實現老版本接口的舊有代碼。
- 重復注解(Repeating Annotations)。重復注解提供了在同一聲明或類型中多次應用相同注解類型的能力。
- 類型注解(Type Annotation)。在任何地方都能使用注解,而不是在聲明的地方。
- 類型推斷增強。
- 方法參數反射(Method Parameter Reflection)。
- Stream API 。新添加的Stream API(java.util.stream) 把真正的函數式編程風格引入到Java中。Stream API集成到了Collections API里。
- HashMap改進,在鍵值哈希沖突時能有更好表現。
- Date Time API。加強對日期和時間的處理。
- java.util 包下的改進,提供了幾個實用的工具類。
- 并行數組排序。
- 標準的Base64編解碼。
- 支持無符號運算。
- java.util.concurrent 包下增加了新的類和方法。
-
java.util.concurrent.ConcurrentHashMap
類添加了新的方法以支持新的StreamApi和lambada表達式。 -
java.util.concurrent.atomic
包下新增了類以支持可伸縮可更新的變量。 -
java.util.concurrent.ForkJoinPool
類新增了方法以支持 common pool。 - 新增了
java.util.concurrent.locks.StampedLock
類,為控制讀/寫訪問提供了一個基于性能的鎖,且有三種模式可供選擇。
-
- HotSpot
- 刪除了 永久代(PermGen).
- 方法調用的字節碼指令支持默認方法。
java9
- java模塊系統 (Java Platform Module System)。
- 新的版本號格式。
$MAJOR.$MINOR.$SECURITY.$PATCH
- java shell,交互式命令行控制臺。
- 在
private instance methods
方法上可以使用@SafeVarargs
注解。 - diamond語法與匿名內部類結合使用。
- 下劃線
_
不能單獨作為變量名使用。 - 支持私有接口方法(您可以使用diamond語法與匿名內部類結合使用)。
- Javadoc
- 簡化Doclet API。
- 支持生成HTML5格式。
- 加入了搜索框,使用這個搜索框可以查詢程序元素、標記的單詞和文檔中的短語。
- 支持新的模塊系統。
- JVM
- 增強了
Garbage-First(G1)
并用它替代Parallel GC
成為默認的垃圾收集器。 - 統一了JVM 日志,為所有組件引入了同一個日志系統。
- 刪除了JDK 8中棄用的GC組合。(DefNew + CMS,ParNew + SerialOld,Incremental CMS)。
- 增強了
- properties文件支持
UTF-8
編碼,之前只支持ISO-8859-1
。 - 支持
Unicode 8.0
,在JDK8中是Unicode 6.2
。
java10
-
局部變量類型推斷(Local-Variable Type Inference)
//之前的代碼格式 URL url = new URL("http://www.oracle.com/"); URLConnection conn = url.openConnection(); Reader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())) //java10中用var來聲明變量 var url = new URL("http://www.oracle.com/"); var conn = url.openConnection(); var reader = new BufferedReader( new InputStreamReader(conn.getInputStream()));
var
是一個保留類型名稱,而不是關鍵字。所以之前使用var
作為變量、方法名、包名的都沒問題,但是如果作為類或接口名,那么這個類和接口就必須重命名了。var
的使用場景主要有以下四種:- 本地變量初始化。
- 增強for循環中。
- 傳統for循環中聲明的索引變量。
- Try-with-resources 變量。?
Optional
類添加了新的方法orElseThrow
(無參數版)。相比于已經存在的get方法,這個方法更推薦使用。
java11
- 支持
Unicode 10.0
,在jdk10中是8.0。 - 標準化HTTP Client
- 編譯器線程的延遲分配。添加了新的命令
-XX:+UseDynamicNumberOfCompilerThreads
動態控制編譯器線程的數量。 - 新的垃圾收集器—ZGC。一種可伸縮的低延遲垃圾收集器(實驗性)。
- Epsilon。一款新的實驗性無操作垃圾收集器。Epsilon GC 只負責內存分配,不實現任何內存回收機制。這對于性能測試非常有用,可用于與其他GC對比成本和收益。
- Lambda參數的局部變量語法。java10中引入的var字段得到了增強,現在可以用在lambda表達式的聲明中。如果lambda表達式的其中一個形式參數使用了var,那所有的參數都必須使用var。