您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~
自從Java在2009年被Oracle收購之后,就不再開源,除了Oracle官方發布的版本之外,還有OpenJDK版本,這兩者的區別可以自行找某度去搞明白,對于沒有幾千萬用戶的應用來說,OpenJDK已經足夠了,即使是一些大廠,內部系統用OpenJDK也足夠了,
從Java 8開始,整個JDK就一直在致力于不斷改進,不斷融合新的開發特性,Java目前始終保持前向兼容,所以如果有新的穩定版JDK出來,就可以立即使用新的JDK,嘗試一些新特性,而不必擔心不兼容的問題(可能個別地方有改動,但對個人及小型開發來說可以忽略不計),
先做一些名詞解釋:
1、JEP:Java Enhancement Proposals,Java增強提案,
2、JSR:Java Specification Requests的縮寫,意思是Java規范提案,是指向JCP(Java Community Process)提出新增一個標準化技術規范的正式請求,
3、CSR:是Compatibility & Specification Review的縮寫,也就是兼容性和特征檢視,
4、?標記:是那些未在官方JEP中列出,但明確在該版本Java API中具有,而前一版本API沒有的特性,
先來看看Java9增加一些特性:

Java9主要的改進包括模塊系統(261)、JShell(222)、日志集成(264)、棄用GC組合(214)、統一JVM日志(158)、統一GC日志(271)、集合工廠方法(269)、G1作為默認GC(248)、廢棄CMS GC(291)、Http 2 Client(110)、私有介面方法(?)、Stream API(?)、Flow API(?)等,
其中,模塊系統、JShell完全是雞肋,可以忽略;
日志集成基本上也不會用Java自帶的,跳過;
關于GC的后面會說,這里跳過;
Http 2 Client在后續Java10及更高版本中又有改進,Java9中的語法基本被廢棄,所以可以先不看;
Flow API其實也是雞肋,在外部MQ如此強大的情況下,沒有人會用Java自帶的Pub-Sub,
所以總結說起來,Java9真正比較有用的就是集合工廠方法、私有介面方法和Stream API了,
在Java9以前創建集合的時候,是這么干的:
/**
* 以前的集合創建方法
*/
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set = Collections.unmodifiableSet(set);
System.out.println(set);
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list = Collections.unmodifiableList(list);
System.out.println(list);
Map<String, String> map = new HashMap<>();
map.put("A", "Apple");
map.put("B", "Boy");
map.put("C", "Cat");
map = Collections.unmodifiableMap(map);
System.out.println(map);
而Java9就開始偷懶了:
/**
* 新的集合工廠方法
*/
Set<String> set2 = Set.of("A", "B", "C");
System.out.println(set2);
List<String> list2 = List.of("A", "B", "C");
System.out.println(list2);
Map<String, String> map2 = Map.of("A", "Apple", "B", "Boy", "C", "Cat");
System.out.println(map2);
Map<String, String> map3 = Map.ofEntries(
new AbstractMap.SimpleEntry<>("A", "Apple"),
new AbstractMap.SimpleEntry<>("B", "Boy"),
new AbstractMap.SimpleEntry<>("C", "Cat"));
System.out.println(map3);
Java8一個介面中能定義如下幾種變數/方法:
1、常量
2、抽象方法
3、默認方法
4、靜態方法
Java9又增加了兩種:
1、私有方法
2、私有靜態方法
可以敲代碼試試看:
/**
* Java9的新介面方法
*
* @author 湘王
*/
public interface NewInterface {
// 私有方法
private void method1() {
System.out.println("from private method");
}
// 私有靜態方法
private static void method2() {
System.out.println("from private static method2");
}
default void general() {
method1();
method2();
}
}
基于Java8的流式編程,Java9又增加了幾個方法:takeWhile、dropWhile、iterate和ofNullable,來看看代碼:
// Stream API
// 遇見空值停止輸出
Stream.of("a","b","c","","e","f").takeWhile(s-> !s.isEmpty())
.forEach(System.out::println);
// 遇見空值才開始輸出
Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
.forEach(System.out::println);
// 函式式迭代,使用初始種子值創建順序(可能是無限)流
IntStream.iterate(3, x -> x < 10, x -> x + 3)
.forEach(System.out::println);
// 預防NullPointerExceptions例外, 可以通過檢查流來避免null值
long count = Stream.ofNullable(null).count();
System.out.println(count);
相比較于Java 9,Java10的特性少了很多:

比較有意思的就是增加了一個叫做var的關鍵字(向Javascript學習嗎?Java也想長個script的尾巴?)
// var關鍵字
// 不建議這樣,非常不安全
var set = Set.of("A", 1, "C");
System.out.println(set);
var list = List.of("A", 2, "C");
System.out.println(list);
var map = Map.of("A", 1, "B", "Boy", "C", "Cat");
System.out.println(map);
for (var s : list) {
System.out.println(s);
}
// 應該這樣使用
var list2 = new ArrayList<String>();
list2.add("1");
list2.add("2");
list2.add("3");
// 屬性欄位不能用var
private var list = new ArrayList<String>();
// 方法引數不能用var
public void test(var list) {
System.out.println("123");
}
雖然多了var這個關鍵字,但我想真正習慣這種用法的人畢竟還是少數吧,而且對于大多數碼農來說,如果在接手的系統中看到這種「新式」代碼,可能會有點懵,至于其他新增的特性,基本都是雞肋,
感謝您的大駕光臨!咨詢技術、產品、運營和管理相關問題,請關注后留言,歡迎騷擾,不勝榮幸~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535962.html
標籤:Java
上一篇:在線客服系統原始碼開發實戰總結:Golang實作CMS內容管理增刪查改功能
下一篇:第2-3-4章 上傳附件的介面開發-檔案存盤服務系統-nginx/fastDFS/minio/阿里云oss/七牛云oss
