Java 10 新特性

2022-01-25 16:01 更新

Java10它號(hào)稱(chēng)有109項(xiàng)新特性,包含12個(gè)JEP。

需要注意的是,本次Java10并不是Oracle的官方LTS版本,所以咱們可以先了解新特性。然后坐等java11的發(fā)布再考慮在生產(chǎn)中使用吧。

特性列表

局部變量的類(lèi)型推斷 var關(guān)鍵字

GC改進(jìn)和內(nèi)存管理 并行全垃圾回收器 G1

垃圾回收器接口

線(xiàn)程-局部變量管控

合并 JDK 多個(gè)代碼倉(cāng)庫(kù)到一個(gè)單獨(dú)的儲(chǔ)存庫(kù)中

新增API:ByteArrayOutputStream

新增API:List、Map、Set

新增API:java.util.Properties

新增API: Collectors收集器

其它特性

1、局部變量的類(lèi)型推斷 var關(guān)鍵字

這個(gè)新功能將為Java增加一些語(yǔ)法糖 - 簡(jiǎn)化它并改善開(kāi)發(fā)者體驗(yàn)。新的語(yǔ)法將減少與編寫(xiě)Java相關(guān)的冗長(zhǎng)度,同時(shí)保持對(duì)靜態(tài)類(lèi)型安全性的承諾。

這可能是Java10給開(kāi)發(fā)者帶來(lái)的最大的一個(gè)新特性。下面主要看例子:

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

這是最平常的使用。注意賦值語(yǔ)句右邊,最好寫(xiě)上泛型類(lèi)型,否則會(huì)有如下情況:

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);
    }

么都可以裝,非常的不安全了。和js等語(yǔ)言不同的是,畢竟Java還是強(qiáng)類(lèi)型的語(yǔ)言,所以下面語(yǔ)句是編譯報(bào)錯(cuò)的:

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

注意:注意:注意:下面幾點(diǎn)使用限制

局部變量初始化

for循環(huán)內(nèi)部索引變量

傳統(tǒng)的for循環(huán)聲明變量

public static void main(String[] args) {
        //局部變量初始化
        var list = new ArrayList<String>();
        //for循環(huán)內(nèi)部索引變量
        for (var s : list) {
            System.out.println(s);
        }
        //傳統(tǒng)的for循環(huán)聲明變量
        for (var i = 0; i < list.size(); i++) {
            System.out.println(i);
        }
    }

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

方法參數(shù)

全局變量


public static var list = new ArrayList<String>(); //編譯報(bào)錯(cuò)
    public static List<String> list = new ArrayList<>(); //正常編譯通過(guò)

構(gòu)造函數(shù)參數(shù)

方法返回類(lèi)型

字段

捕獲表達(dá)式(或任何其他類(lèi)型的變量聲明)

2、GC改進(jìn)和內(nèi)存管理 并行全垃圾回收器 G1

JDK 10中有2個(gè)JEP專(zhuān)門(mén)用于改進(jìn)當(dāng)前的垃圾收集元素。

Java 10的第二個(gè)JEP是針對(duì)G1的并行完全GC(JEP 307),其重點(diǎn)在于通過(guò)完全GC并行來(lái)改善G1最壞情況的等待時(shí)間。G1是Java 9中的默認(rèn)GC,并且此JEP的目標(biāo)是使G1平行。

3、垃圾回收器接口

這不是讓開(kāi)發(fā)者用來(lái)控制垃圾回收的接口;而是一個(gè)在 JVM 源代碼中的允許另外的垃圾回收器快速方便的集成的接口。

4、線(xiàn)程-局部變量管控

這是在 JVM 內(nèi)部相當(dāng)?shù)图?jí)別的更改,現(xiàn)在將允許在不運(yùn)行全局虛擬機(jī)安全點(diǎn)的情況下實(shí)現(xiàn)線(xiàn)程回調(diào)。這將使得停止單個(gè)線(xiàn)程變得可能和便宜,而不是只能啟用或停止所有線(xiàn)程。

5、合并 JDK 多個(gè)代碼倉(cāng)庫(kù)到一個(gè)單獨(dú)的儲(chǔ)存庫(kù)中

在 JDK9 中,有 8 個(gè)倉(cāng)庫(kù): root、corba、hotspot、jaxp、jaxws、jdk、langtools 和 nashorn 。在 JDK10 中這些將被合并為一個(gè),使得跨相互依賴(lài)的變更集的存儲(chǔ)庫(kù)運(yùn)行 atomic commit (原子提交)成為可能。

6、新增API:ByteArrayOutputStream

String toString(Charset): 重載 toString(),通過(guò)使用指定的字符集解碼字節(jié),將緩沖區(qū)的內(nèi)容轉(zhuǎn)換為字符串。

7、新增API:List、Map、Set

這3個(gè)接口都增加了一個(gè)新的靜態(tài)方法,copyOf(Collection)。這些函數(shù)按照其迭代順序返回一個(gè)不可修改的列表、映射或包含給定集合的元素的集合。

8、新增API:java.util.Properties

增加了一個(gè)新的構(gòu)造函數(shù),它接受一個(gè) int 參數(shù)。這將創(chuàng)建一個(gè)沒(méi)有默認(rèn)值的空屬性列表,并且指定初始大小以容納指定的元素?cái)?shù)量,而無(wú)需動(dòng)態(tài)調(diào)整大小。還有一個(gè)新的重載的 replace 方法,接受三個(gè) Object 參數(shù)并返回一個(gè)布爾值。只有在當(dāng)前映射到指定值時(shí),才會(huì)替換指定鍵的條目。

9、新增API: Collectors收集器

toUnmodifiableList():

toUnmodifiableSet():

toUnmodifiableMap(Function, Function):

toUnmodifiableMap(Function, Function, BinaryOperator):

這四個(gè)新方法都返回 Collectors ,將輸入元素聚集到適當(dāng)?shù)牟豢尚薷牡募现小?/p>

10、其它特性

線(xiàn)程本地握手(JEP 312)

其他Unicode語(yǔ)言 - 標(biāo)記擴(kuò)展(JEP 314)

基于Java的實(shí)驗(yàn)性JIT編譯器

根證書(shū)頒發(fā)認(rèn)證(CA)

刪除工具javah(JEP 313)

從JDK中移除了javah工具,這個(gè)很簡(jiǎn)單并且很重要。

最后

JDK10的升級(jí)幅度其實(shí)主要還是以?xún)?yōu)化為主,并沒(méi)有帶來(lái)太多對(duì)使用者驚喜的特性。所以建議廣大開(kāi)發(fā)者還是研究一下2018年9月份到來(lái)Java11吧,最重要的是它是LTS版本哦,所以是可以運(yùn)用在生產(chǎn)上的。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)