1. 程式人生 > >【小家java】java10新特性(簡述十大新特性) 小步迭代

【小家java】java10新特性(簡述十大新特性) 小步迭代

相關閱讀

2018年3月20日,Java 10 正式釋出,這一次沒有跳票

它號稱有109項新特性,包含12個JEP。

需要注意的是,本次Java10並不是Oracle的官方LTS版本,所以咱們可以先了解新特性。然後坐等java11的釋出再考慮在生產中使用吧

特性列表

  • 區域性變數的型別推斷 var關鍵字
  • GC改進和記憶體管理 並行全垃圾回收器 G1
  • 垃圾回收器介面
  • 執行緒-區域性變數管控
  • 合併 JDK 多個程式碼倉庫到一個單獨的儲存庫中
  • 新增API:ByteArrayOutputStream
  • 新增API:List、Map、Set
  • 新增API:java.util.Properties
  • 新增API: Collectors收集器
  • 其它特性

1、區域性變數的型別推斷 var關鍵字

這個新功能將為Java增加一些語法糖 - 簡化它並改善開發者體驗。新的語法將減少與編寫Java相關的冗長度,同時保持對靜態型別安全性的承諾。

這可能是Java10給開發者帶來的最大的一個新特性。下面主要看例子:

  public static void main(String[] args) {
        var list = new ArrayList<String>();
        list.add("hello,world!");
        System.out.println(list);
    }

這是最平常的使用。注意賦值語句右邊,最好寫上泛型型別,否則會有如下情況:

 public static void main(String[] args) {
        var list = new ArrayList<>();
        list.add("hello,world!");
        list.add(1);
        list.add(1.01);
        System.out.println(list);
    }

list什麼都可以裝,非常的不安全了。和js等語言不同的是,畢竟Java還是強型別的語言,所以下面語句是編譯報錯的:

public static void main(String[] args)
{ var list = new ArrayList<String>(); list.add("hello,world!"); System.out.println(list); list = new ArrayList<Integer>(); //編譯報錯 }

**注意:注意:注意:**下面幾點使用限制

  1. 區域性變數初始化
  2. for迴圈內部索引變數
  3. 傳統的for迴圈宣告變數
public static void main(String[] args) {
        //區域性變數初始化
        var list = new ArrayList<String>();
        //for迴圈內部索引變數
        for (var s : list) {
            System.out.println(s);
        }
        //傳統的for迴圈宣告變數
        for (var i = 0; i < list.size(); i++) {
            System.out.println(i);
        }
    }

下面這幾種情況,都是不能使用var的

方法引數
全域性變數

public static var list = new ArrayList<String>(); //編譯報錯
    public static List<String> list = new ArrayList<>(); //正常編譯通過

建構函式引數
方法返回型別
欄位
捕獲表示式(或任何其他型別的變數宣告)

2、GC改進和記憶體管理 並行全垃圾回收器 G1

JDK 10中有2個JEP專門用於改進當前的垃圾收集元素。
Java 10的第二個JEP是針對G1的並行完全GC(JEP 307),其重點在於通過完全GC並行來改善G1最壞情況的等待時間。G1是Java 9中的預設GC,並且此JEP的目標是使G1平行。

3、垃圾回收器介面

這不是讓開發者用來控制垃圾回收的介面;而是一個在 JVM 原始碼中的允許另外的垃圾回收器快速方便的整合的介面。

4、執行緒-區域性變數管控

這是在 JVM 內部相當低級別的更改,現在將允許在不執行全域性虛擬機器安全點的情況下實現執行緒回撥。這將使得停止單個執行緒變得可能和便宜,而不是隻能啟用或停止所有執行緒。

5、合併 JDK 多個程式碼倉庫到一個單獨的儲存庫中

在 JDK9 中,有 8 個倉庫: root、corba、hotspot、jaxp、jaxws、jdk、langtools 和 nashorn 。在 JDK10 中這些將被合併為一個,使得跨相互依賴的變更集的儲存庫執行 atomic commit (原子提交)成為可能。

6、新增API:ByteArrayOutputStream

String toString(Charset): 過載 toString(),通過使用指定的字符集解碼位元組,將緩衝區的內容轉換為字串。

7、新增API:List、Map、Set

這3個介面都增加了一個新的靜態方法,copyOf(Collection)。這些函式按照其迭代順序返回一個不可修改的列表、對映或包含給定集合的元素的集合。

8、新增API:java.util.Properties

增加了一個新的建構函式,它接受一個 int 引數。這將建立一個沒有預設值的空屬性列表,並且指定初始大小以容納指定的元素數量,而無需動態調整大小。還有一個新的過載的 replace 方法,接受三個 Object 引數並返回一個布林值。只有在當前對映到指定值時,才會替換指定鍵的條目。

9、新增API: Collectors收集器

toUnmodifiableList():
toUnmodifiableSet():
toUnmodifiableMap(Function, Function):
toUnmodifiableMap(Function, Function, BinaryOperator):
這四個新方法都返回 Collectors ,將輸入元素聚集到適當的不可修改的集合中。

10、其它特性

執行緒本地握手(JEP 312)
其他Unicode語言 - 標記擴充套件(JEP 314)
基於Java的實驗性JIT編譯器
根證書頒發認證(CA)
刪除工具javah(JEP 313)

從JDK中移除了javah工具,這個很簡單並且很重要。

最後

JDK10的升級幅度其實主要還是以優化為主,並沒有帶來太多對使用者驚喜的特性。所以建議廣大開發者還是坐等Java11吧,預計2018年9月份就會到來,最重要的是它是LTS版本哦,所以是可以運用在生產上的。