「是時候升級Java11了」 JDK11優勢和JDK選擇


Java8 商用收費

從2019年1月份開始,Oracle JDK 開始對 Java SE 8 之后的版本開始進行商用收費,確切的說是 8u201/202 之后的版本。如果你用 Java 開發的功能如果是用作商業用途的,如果還不想花錢購買的話,能免費使用的最新版本是 8u201/202。當然如果是個人客戶端或者個人開發者可以免費試用 Oracle JDK 所有的版本。

Java11 的性能提升

僅通過切換到 Java 11 就有 16% 的改進,這種改進可能是因為 Java 10 中引入了 JEP 307: Parallel Full GC for G1。

詳情請見Java 11 究竟比 8 快了多少?看看這個基准測試

從java 8到java 11變化一覽

說明:這里面我們不會介紹全部特性,只會列舉部分作為開發者最關心的變化。

緊湊型的字符串

從Java 9開始 String 數據承載由 char[] 改為 byte[] 緊湊的字符串,在很多時候只包含Latin-1里的字符,這些字符可節省一半內存。

增強api

1.字符串增強 @since 11

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

2.集合增強

從Java 9 開始,jdk里面就為集合(List、Set、Map)增加了of和copyOf方法。它們用來創建不可變集合。

  • of() @since 9
  • copyOf() @since 10

示例一:

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

示例二:

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

示例三:

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

注意:使用 of 和 copyOf 創建的集合為不可變集合,不能進行添加、刪除、替換、排序等操作,不然會報java.lang.UnsupportedOperationException異常,使用Set.of()不能出現重復元素、Map.of()不能出現重復key,否則回報java.lang.IllegalArgumentException。。

3.Stream增強 @since 9

Stream是Java 8 中的特性,在Java 9 中為其新增了4個方法:

3.1 ofNullable(T t)

此方法可以接收null來創建一個空流

// 以前Stream.of(null); //報錯// 現在Stream.ofNullable(null);

3.2 takeWhile(Predicate<? super T> predicate)

此方法根據Predicate接口來判斷如果為true就 取出 來生成一個新的流,只要碰到false就終止,不管后邊的元素是否符合條件。

Stream<Integer> integerStream = Stream.of(6, 10, 11, 15, 20);Stream<Integer> takeWhile = integerStream.takeWhile(t -> t % 2 == 0);takeWhile.forEach(System.out::println); // 6,10

3.3 dropWhile(Predicate<? super T> predicate)

此方法根據Predicate接口來判斷如果為true就 丟棄 來生成一個新的流,只要碰到false就終止,不管后邊的元素是否符合條件。

Stream<Integer> integerStream = Stream.of(6, 10, 11, 15, 20);Stream<Integer> takeWhile = integerStream.dropWhile(t -> t % 2 == 0);takeWhile.forEach(System.out::println); //11,15,20

3.4 iterate重載

以前使用iterate方法生成無限流需要配合limit進行截斷

Stream<Integer> limit = Stream.iterate(1, i -> i + 1).limit(5);limit.forEach(System.out::println); //1,2,3,4,5

現在重載后這個方法增加了個判斷參數

Stream<Integer> iterate = Stream.iterate(1, i -> i <= 5, i -> i + 1);iterate.forEach(System.out::println); //1,2,3,4,5

4.Optional增強 @since 9

4.1 stream()

如果為空返回一個空流,如果不為空將Optional的值轉成一個流。

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

4.2 ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

個人感覺這個方法就是結合isPresent()對Else的增強,ifPresentOrElse 方法的用途是,如果一個 Optional 包含值,則對其包含的值調用函數 action,即 action.accept(value),這與 ifPresent 一致;與 ifPresent 方法的區別在於,ifPresentOrElse 還有第二個參數 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便會調用 emptyAction,即 emptyAction.run()。

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

4.3 or(Supplier<? extends Optional<? extends T>> supplier)

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

5.InputStream增強 @since 9

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

HTTP Client API

改api支持同步和異步兩種方式,下面是兩種方式的示例:

 

「是時候升級Java11了」 JDK11優勢和JDK選擇

 

 

移除內容

  • com.sun.awt.AWTUtilities。
  • sun.misc.Unsafe.defineClass 使用java.lang.invoke.MethodHandles.Lookup.defineClass來替代。
  • Thread.destroy() 以及 Thread.stop(Throwable) 方法。
  • sun.nio.ch.disableSystemWideOverlappingFileLockCheck 屬性。
  • sun.locale.formatasdefault 屬性。
  • jdk snmp 模塊。
  • javafx,openjdk 是從java10版本就移除了,oracle java10還尚未移除javafx ,而java11版本將javafx也移除了。
  • Java Mission Control,從JDK中移除之后,需要自己單獨下載。
  • Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom。
  • 在java11中將java9標記廢棄的Java EE及CORBA模塊移除掉。

完全支持Linux容器(包括docker)

許多運行在Java虛擬機中的應用程序(包括Apache Spark和Kafka等數據服務以及傳統的企業應用程序)都可以在Docker容器中運行。但是在Docker容器中運行Java應用程序一直存在一個問題,那就是在容器中運行JVM程序在設置內存大小和CPU使用率后,會導致應用程序的性能下降。這是因為Java應用程序沒有意識到它正在容器中運行。隨着Java 10的發布,這個問題總算得以解決,JVM現在可以識別由容器控制組(cgroups)設置的約束。可以在容器中使用內存和CPU約束來直接管理Java應用程序,其中包括:

  • 遵守容器中設置的內存限制
  • 在容器中設置可用的CPU
  • 在容器中設置CPU約束

JDK推薦

由於 Java 11 開始,Oracle 提供的是付費支持的商業版本。筆者在這更加推薦使用亞馬遜的 Corretto,Corretto 采用 GPL 協議。

Corretto的長期支持(LTS)包括Corretto 8的性能增強和安全更新,至少在2023年6月之前免費提供。 更新計划每季度發布一次。

亞馬遜將為Corretto 11提供LTS的季度更新,至少持續到2024年8月。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM