java jdk1.9新特性_JDK1.9-新特性

1. Java平臺級模塊系統

該特性使Java9最大的一個特性,Java提供該功能的主要的動機在于,減少內存的開銷,JVM啟動的時候,至少會有30~60MB的內存加載,主要原因是JVM需要加載rt.jar,不管其中的類是否被classloader加載,第一步整個jar都會被JVM加載到內存當中去,模塊化可以根據模塊的需要加載程序運行需要的class,那么JVM是如何知道需要加載哪些class的呢。具體請參考:【JDK9-模塊化系統】

2. Linking

當你使用具有顯式依賴關系的模塊和模塊化的JDK時,新的可能性出現了。你的應用程序模塊現在講聲明其對其他應用程序模塊的依賴以及對其所使用的JDK模塊的依賴。為什么不實用這些信息創建一個最小的運行時環境,其中只包含運行應用程序所需的那些模塊呢?這可以通過Java9中的新的jlink工具實現。你可以創建針對應用程序進行優化的最小運行時映像而不需要使用完全加載JDK按照版本。

3. JShell:交互式Java REPL

許多語言已經具有交互式編程環境,Java現在加入了,可以從控制臺啟動jshell,并直接啟動輸入和執行Java代碼。

d5fe4bca49d8ff2fc080110f0b50d184.png

交互式shell還可以提供良好的學習環境以及提高生產力。

4. 改進的Javadoc

Javadoc現在支持在API文檔中的進行搜索,另外Javadoc的輸出現在符合兼容HTML5標準,此外每個Javadoc頁面都包含有關JDK模塊類或接口來源的信息。

實例,對Welcome類生成javadoc文檔:

381c6a3fe52cc4ae324297d598f13200.png

52817491fefdc877a133963d29e93998.png

5. 集合工廠方法

通常,希望在代碼中創建一個集合(如:List,Set等),并直接用一些元素填充它。實例化集合,幾個“add”調用,使得代碼重復,Java9添加了幾種集合工廠方法:

package com.jdk9.m;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;

public class TestFactoryMethods {

public static void main(String[] args) {

Set set = Set.of(1, 2, 3);

Set mySet = new HashSet(set);

mySet.add(4);

System.out.println(mySet);

System.out.println(set.getClass() + ", " + set);

List list = List.of("a", "b");

System.out.println(list.getClass() + ", " + list);

Map map = Map.of("k1", "v1", "k2", "v2");

System.out.println(map.getClass() + ", " + map);

}

}

運行截圖:

991530af37e42c5503548fae1356f3e3.png

除了更短和更好閱讀之外,這些方法也可以避免你選擇特定的集合實現,事實上,從工廠方法返回已放入數個元素的集合實現是高度優化的,因為它們時不可變的:在創建后,繼續添加元素到這些集合會導致“UnsupportedOperationException”。

6. 改進的Stream API

Java9中,Stream接口中添加了4個新的方法:dropWhile,takeWhile,ofNullable。還有一個iterate方法的新重載方法,可以讓你提供一個Predicate來指定什么時候結束迭代:

package com.jdk9.m;

import java.util.stream.IntStream;

public class TestStream {

public static void main(String[] args) {

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

}

}

除了對Stream本身的擴展,OPtional和Stream之間的結合也得到了改進,可以通過OPtional的新方法stream將一個Optional對象轉換為一個Stream對象:

Stream s = Optional.of(1).stream();

7. 私有接口方法

Java8帶來了接口的默認方法,接口現在也可以包含行為,而不僅僅是方法簽名,但是如果在接口上幾個默認方法,代碼幾乎相同,通常將重構這些方法,調用一個可復用的私有方法,但默認方法不能是私有的。將復用代碼創建為一個默認方法不是一個解決方案。Java9可以向接口添加私有輔助方法來解決此問題:

package com.jdk9.m;

public interface TestPrivate {

void im();

default void m1() {

init();

}

default void m2() {

init();

}

private void init() {

System.out.println("Initializing");

}

}

如果使用默認方法開發API,那么私有接口方法可能有助于構建其實現。

8. HTTP/2

JDK9之前,JDK提供的HTTP訪問功能,幾乎都需要依賴HttpURLConnection,但是這個類大家在寫代碼的時候很少使用,我們一般都會選擇Apache的HttpClient,此處在Java9的版本中引入了一個新的HTTP相關模塊,里面提供了堆HTTP訪問很好的支持,不僅支持HTTP1.1而且還支持HTTP2,以及WebSocket,但是目前這個模塊還在孵化階段,因此這套API不能保證100%正確。

1a957c619eef33e5de45e21551fa02db.png

實例:

package com.jdk9.m;

import java.io.IOException;

import java.net.URI;

import java.net.URISyntaxException;

import jdk.incubator.http.HttpClient;

import jdk.incubator.http.HttpRequest;

import jdk.incubator.http.HttpResponse;

public class TestHttpClient {

public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).GET().build();

HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString());

System.out.println(response.statusCode());

}

}

運行截圖:

649fceca23f8a957ee10cd716fff3dee.png

注意:JDK9的Java工程默認只可以訪問java.base模塊里面的包,但是HttpClient類是在模塊jdk.incubator.httpclient里面,所以如果要訪問HttpClient必須要創建模塊化文件module-info.java并且在里面顯式聲明引入jdk.incubator.httpclient,否則無法訪問HttpClient

module com.jdk9.m {

requires jdk.incubator.httpclient;

}

9. 多版本兼容JAR

當一個新版本的Java出現的時候,你的庫用戶要花費數年時間才會切換到這個新的版本,這就意味著庫得去向后兼容你想要支持的最老的Java版本。這實際上意味著未來的很長一段時間,你都不能在庫中運行Java9鎖提供的新特性。多版本兼容JAR功能讓你創建僅在特定版本Java環境中運行庫程序時選擇使用的class版本。

實例:

multirelease.jar

├── META-INF

│ └── versions

│ └── 9

│ └── multirelease

│ └── Helper.class

├── multirelease

├── Helper.class

└── Main.class

multirelease.jar可以在Java9中使用,不過Helper這個類使用的不是頂層的multirelease.Helper這個class,而是處在META-INFO/version/9下面的類。這是特別為Java9準備的class版本,可以運行Java9所提供的特性和庫。同時,在早期的Java諸版本中使用這個JAR也是能運行的,因為較老版本的Java只會看到頂層的Helper類。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在10分鐘內讓Redux發揮作用

Hi everyone ??大家好?? For a while now I’ve been hearing my friends and colleagues complaining about how hard it was to get into Redux.一段時間以來&#xff0c;我一直在聽我的朋友和同事抱怨進入Redux有多困難。 I run a freeCodeCamp Study Group in the So…

兩個鏈接合并_如何找到兩個鏈接列表的合并點

兩個鏈接合并了解問題 (Understand the Problem) We are given two singly linked lists and we have to find the point at which they merge.我們給了兩個單鏈表&#xff0c;我們必須找到它們合并的點。 [SLL 1] 1--->3--->5 \ …

安裝veket到移動硬盤NTFS分區

如果你已經看過《手動安裝veket到硬盤》和《簡單的將veket安裝到U盤的方法》兩篇文章并且安裝成功的話&#xff0c;說明不適用本文的安裝環境&#xff0c;就不用往下看了。 《手動安裝veket到硬盤》一文采用grub4dos來引導硬盤上的veket&#xff0c;主要是用來在本機已安裝Wind…

簡書使用小技巧

1、不同字體  在 設置->基礎設置->富文本 模式下可以實現 2、添加圖片&#xff0c;讓文章更生動 3、添加代碼框 &#xff01;注意&#xff1a;設置為Markdown模式后&#xff0c;只對新創建的文章起作用。轉載于:https://www.cnblogs.com/HMJ-29/p/7049540.html

掩碼 項目編碼_每天進行20天的編碼項目

掩碼 項目編碼by Angela He通過何安佳 每天進行20天的編碼項目 (A coding project a day for 20 days) 我如何在20天內自學Web開發 (How I taught myself web development in 20 days) It was the first day of winter break for Stanford students. Back at home, I opened a…

java循環一年月份天數和_javawhile循環編寫輸入某年某月某日,判斷這一天是這一年的第幾…...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓public class ZuoYe9 {public static void main(String[] args) {int days0; //存儲變量這一年的第幾天//1.輸入年&#xff0c;月&#xff0c;日Scanner inputnew Scanner(System.in);System.out.println("請輸入年份&#xf…

leetcode 605. 種花問題(貪心算法)

假設你有一個很長的花壇&#xff0c;一部分地塊種植了花&#xff0c;另一部分卻沒有。可是&#xff0c;花卉不能種植在相鄰的地塊上&#xff0c;它們會爭奪水源&#xff0c;兩者都會死去。 給定一個花壇&#xff08;表示為一個數組包含0和1&#xff0c;其中0表示沒種植花&…

工程師的成熟模型_數據工程師的成熟度

工程師的成熟模型數據科學與機器學習 (DATA SCIENCE AND MACHINE LEARNING) What does a data engineer do?數據工程師做什么&#xff1f; Let’s start with three big wars that we need to understand before understanding what a data engineer does.讓我們從理解數據工…

杭電2064

此題是一道簡單的遞歸 此題是一道遞歸運算題&#xff0c;這題又是一道漢諾塔問題&#xff01;&#xff01;&#xff01;只要了解其規律&#xff0c;呵呵&#xff0c;你就可以很快AC了&#xff01;&#xff01; 這是一般的漢諾塔問題的解題方法照片&#xff01;&#xff01;&…

/ ./ ../ 的區別

/ 根目錄 &#xff08;絕對路徑&#xff09; ./ 當前目錄 ../父級目錄 &#xff08;相對路徑&#xff09; ./home是當前目錄下的一個叫home的目錄/home是絕對路徑的/home就是根下的home目錄轉載于:https://www.cnblogs.com/sjd1118/p/7055475.html

java設置表格列不可修改_Java DefaultTableModel使單元格不可編輯JTable

參見英文答案 >How to make a JTable non-editable 7個我有一個JAVA項目,并希望使用DefaultTableModel使我的JTable不可編輯.我知道一個解決方法,稱為&#xff1a;JTable table new JTable(...){public boolean isCellEditable(int row…

阻塞隊列實現

? 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主頁&#xff1a;小胡_不糊涂的個人主頁 &#x1f4c0; 收錄專欄&#xff1a;JavaEE &#x1f496; 持續更文&#xff0c;關注博主少走彎路&#xff0c;謝謝大家支持 &#x1f496; 阻塞隊列 1. 什么是阻塞隊列2. 標準庫中的…

graphql入門_GraphQL入門指南

graphql入門by Leonardo Maldonado萊昂納多馬爾多納多(Leonardo Maldonado) GraphQL入門指南 (A Beginner’s Guide to GraphQL) One of the most commonly discussed terms today is the API. A lot of people don’t know exactly what an API is. Basically, API stands fo…

leetcode 239. 滑動窗口最大值(單調隊列)

給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回滑動窗口中的最大值。 示例 1&#xff1a; 輸入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 輸出…

scrape創建_確實在2分鐘內對Scrape公司進行了評論和評分

scrape創建網頁搜羅&#xff0c;數據科學 (Web Scraping, Data Science) In this tutorial, I will show you how to perform web scraping using Anaconda Jupyter notebook and the BeautifulSoup library.在本教程中&#xff0c;我將向您展示如何使用Anaconda Jupyter筆記本…

ArcGIS自定義高程

沒寫呢。 轉載于:https://www.cnblogs.com/jiangyuanjia/p/11220183.html

Java基礎——String類(一)

一、String 類代表字符串 Java 程序中的所有字符串字面值&#xff08;如 "abc" &#xff09;都作為此類的實例實現。 字符串是常量&#xff1b;它們的值在創建之后不能更改。字符串緩沖區支持可變的字符串。因為 String 對象是不可變的&#xff0c;所以可以共享。例如…

java jol原理_Java對象布局(JOL)實現過程解析

java對象布局JOL(java object layout),描述對象在堆內存的布局。如下圖&#xff1a;1.markword 固定長度8byte&#xff0c;描述對象的identityhashcode&#xff0c;分代年齡&#xff0c;鎖信息等(https://www.jb51.net/article/183984.htm)&#xff1b;2.klasspoint 固定長度4b…

數據庫維護相關

&#xff08;1&#xff09;SQL Server 查看數據表使用空間 exec sp_spaceused 表名 &#xff08;2&#xff09;SQL Server 數據表使用空間排序 exec sp_MSForeachTable precommandN create table ##( table_name sysname, records int, save_space Nvarchar(10), use_space var…

Redux初學者指南

by Safeer Hayat通過更安全的哈亞特 Understanding Redux as a beginner can be quite confusing. Redux has an abundance of new terms and concepts which are often pretty unintuitive. This guide presents a very simplified example of a Redux implementation. I wil…