java 各版本新特性
Java 5,6,7,8,9,10,11新特性吐血總結
lkd_whh關注贊賞支持
12018.04.01 14:09:15字數 1,948閱讀 10,615
作者:拔劍少年
簡書地址:https://www.jianshu.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。
參考鏈接:
JDK Release Notes
What's New in JDK 8
What’s New in JDK 9
JDK 10 Release Notes
JDK 11 Release Notes
總結
以上是生活随笔為你收集整理的java 各版本新特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何分辨iphone 的冷屏与暖屏
- 下一篇: O365(世纪互联)SharePoint