日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 18 新功能介绍

發(fā)布時(shí)間:2025/3/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 18 新功能介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java 18?在2022 年 3 月 22 日正式發(fā)布,Java 18 不是一個(gè)長(zhǎng)期支持版本,這次更新共帶來(lái) 9 個(gè)新功能。

OpenJDK Java 18 下載:https://jdk.java.net/18/

OpenJDK Java 18 文檔:https://openjdk.java.net/projects/jdk/18/

JEP描述
JEP 400默認(rèn)為 UTF-8[1]
JEP 408簡(jiǎn)單的網(wǎng)絡(luò)服務(wù)器[2]
JEP 413Java API 文檔中的代碼片段[3]
JEP 416使用方法句柄重新實(shí)現(xiàn)核心反射[4]
JEP 417Vector API(三次孵化)[5]
JEP 418互聯(lián)網(wǎng)地址解析 SPI[6]
JEP 419Foreign Function & Memory API (二次孵化)[7]
JEP 420switch 模式匹配(二次預(yù)覽)[8]
JEP 421棄用完成刪除[9]

JEP 400:默認(rèn) UTF-8 字符編碼

JDK 一直都是支持 UTF-8 字符編碼,這次是把 UTF-8 設(shè)置為了默認(rèn)編碼,也就是在不加任何指定的情況下,默認(rèn)所有需要用到編碼的 JDK API 都使用 UTF-8 編碼,這樣就可以避免因?yàn)椴煌到y(tǒng),不同地區(qū),不同環(huán)境之間產(chǎn)生的編碼問(wèn)題。

Mac OS 默認(rèn)使用 UTF-8 作為默認(rèn)編碼,但是其他操作系統(tǒng)上,編碼可能取決于系統(tǒng)的配置或者所在區(qū)域的設(shè)置。如中國(guó)大陸的 windows 使用 GBK 作為默認(rèn)編碼。很多同學(xué)初學(xué) Java 時(shí)可能都遇到過(guò)一個(gè)正常編寫 Java 類,在 windows 系統(tǒng)的命令控制臺(tái)中運(yùn)行卻出現(xiàn)亂碼的情況。

使用下面的命令可以輸出 JDK 的當(dāng)前編碼。

#?Mac?系統(tǒng),默認(rèn)?UTF-8 ???~?java?-XshowSettings:properties?-version?2>&1?|?grep?file.encodingfile.encoding?=?UTF-8file.encoding.pkg?=?sun.io ???~

下面編寫一個(gè)簡(jiǎn)單的 Java 程序,輸出默認(rèn)字符編碼,然后輸出中文漢字 ”你好“,看看 Java 18 和 Java 17 運(yùn)行區(qū)別。

系統(tǒng)環(huán)境:Windows 11

import?java.nio.charset.Charset;public?class?Hello{public?static?void?main(String[]?args)?{System.out.println(Charset.defaultCharset());System.out.println("你好");} }

從下面的運(yùn)行結(jié)果中可以看到,使用 JDK 17 運(yùn)行輸出的默認(rèn)字符編碼是 GBK,輸出的中文 ”你好“ 已經(jīng)亂碼了;亂碼是因?yàn)?VsCode 默認(rèn)的文本編輯器編碼是 UTF-8,而中國(guó)地區(qū)的 Windows 11 默認(rèn)字符編碼是 GBK,也是 JDK 17 默認(rèn)獲取到的編碼,所以會(huì)在控制臺(tái)輸出時(shí)亂碼;而使用 JDK 18 輸出的默認(rèn)編碼就是 UTF-8,所以可以正常的輸出中文 ”你好“

JEP 408:簡(jiǎn)單的 Web服務(wù)器

在 Java 18 中,提供了一個(gè)新命令?jwebserver,運(yùn)行這個(gè)命令可以啟動(dòng)一個(gè)簡(jiǎn)單的 、最小化的靜態(tài)Web 服務(wù)器,它不支持 CGI 和 Servlet,所以最好的使用場(chǎng)景是用來(lái)測(cè)試、教育、演示等需求。

其實(shí)在如 Python、Ruby、PHP、Erlang 等許多平臺(tái)都提供了開(kāi)箱即用的 Web 服務(wù)器,可見(jiàn)一個(gè)簡(jiǎn)單的Web 服務(wù)器是一個(gè)常見(jiàn)的需求,Java 一直沒(méi)有這方面的支持,現(xiàn)在可以了。

在 Java 18 中,使用?jwebserver?啟動(dòng)一個(gè) Web 服務(wù)器,默認(rèn)發(fā)布的是當(dāng)前目錄。

在當(dāng)前目錄創(chuàng)建一個(gè)網(wǎng)頁(yè)文件 index.html

<html> <head> <meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/> </head> <body> <h1>標(biāo)題</h1> </body> </html>

啟動(dòng)?jwebserver.

???bin?./jwebserver Binding?to?loopback?by?default.?For?all?interfaces?use?"-b?0.0.0.0"?or?"-b?::". Serving?/Users/darcy/develop/jdk-18.jdk/Contents/Home/bin?and?subdirectories?on?127.0.0.1?port?8000 URL?http://127.0.0.1:8000/

瀏覽器訪問(wèn):

瀏覽器訪問(wèn)測(cè)試

有請(qǐng)求時(shí)會(huì)在控制臺(tái)輸出請(qǐng)求信息:

127.0.0.1?-?-?[26/3月/2022:16:53:30?+0800]?"GET?/favicon.ico?HTTP/1.1"?404?- 127.0.0.1?-?-?[26/3月/2022:16:55:13?+0800]?"GET?/?HTTP/1.1"?200?-

通過(guò)?help?參數(shù)可以查看?jwebserver?支持的參數(shù)。

???bin?./jwebserver?--help Usage:?jwebserver?[-b?bind?address]?[-p?port]?[-d?directory][-o?none|info|verbose]?[-h?to?show?options][-version?to?show?version?information] Options: -b,?--bind-address????-?綁定地址.?Default:?127.0.0.1?(loopback).For?all?interfaces?use?"-b?0.0.0.0"?or?"-b?::". -d,?--directory???????-?指定目錄.?Default:?current?directory. -o,?--output??????????-?Output?format.?none|info|verbose.?Default:?info. -p,?--port????????????-?綁定端口.?Default:?8000. -h,?-?,?--help????????-?Prints?this?help?message?and?exits. -version,?--version???-?Prints?version?information?and?exits. To?stop?the?server,?press?Ctrl?+?C.

JEP 413:Javadoc 中支持代碼片段

在 Java 18 之前,已經(jīng)支持在 Javadoc 中引入代碼片段,這樣可以在某些場(chǎng)景下更好的展示描述信息,但是之前的支持功能有限,比如我想高亮代碼片段中的某一段代碼是無(wú)能為力的。現(xiàn)在 Java 18 優(yōu)化了這個(gè)問(wèn)題,增加了?@snippet?來(lái)引入更高級(jí)的代碼片段。

在 Java 18 之前,使用?<pre>{@code ...}</pre>?來(lái)引入代碼片段。

/***?時(shí)間工具類* Java 18 之前引入代碼片段:*?<pre>{@code*?????public?static?String?timeStamp()?{*????????long?time?=?System.currentTimeMillis();*?????????return?String.valueOf(time?/?1000);*?????}*?}</pre>**/

生成 Javadoc 之后,效果如下:

Javadoc 代碼片段

高亮代碼片段

從 Java 18 開(kāi)始,可以使用?@snippet?來(lái)生成注釋,且可以高亮某個(gè)代碼片段。

/***?在?Java?18?之后可以使用新的方式*?下面的代碼演示如何使用?{@code?Optional.isPresent}:*?{@snippet?:*?if?(v.isPresent())?{*?????System.out.println("v:?"?+?v.get());*?}*?}**?高亮顯示?println**?{@snippet?:*?class?HelloWorld?{*?????public?static?void?main(String...?args)?{*?????????System.out.println("Hello?World!");??????//?@highlight?substring="println"*?????}*?}*?}**/

效果如下,更直觀,效果更好。

Java 18 Javadoc

正則高亮代碼片段

甚至可以使用正則來(lái)高亮某一段中的某些關(guān)鍵詞:

/**?*?正則高亮:*?{@snippet?:*???public?static?void?main(String...?args)?{*???????for?(var?arg?:?args)?{?????????????????//?@highlight?region?regex?=?"\barg\b"*???????????if?(!arg.isBlank())?{*???????????????System.out.println(arg);*???????????}*???????}??????????????????????????????????????//?@end*???}*???}*/

生成的 Javadoc 效果如下:

替換代碼片段

可以使用正則表達(dá)式來(lái)替換某一段代碼。

/**?*?正則替換:*?{@snippet?:*?class?HelloWorld?{*?????public?static?void?main(String...?args)?{*?????????System.out.println("Hello?World!");??//?@replace?regex='".*"'?replacement="..."*?????}*?}*?}*/

這段注釋會(huì)生成如下 Javadoc 效果。

class?HelloWorld?{public?static?void?main(String...?args)?{System.out.println(...);} }

附:Javadoc 生成方式

#?使用?javadoc?命令生成?Javadoc?文檔 ???bin?./javadoc?-public?-sourcepath?./src?-subpackages?com?-encoding?utf-8?-charset?utf-8?-d?./javadocout #?使用?Java?18?的?jwebserver?把生成的?Javadoc?發(fā)布測(cè)試 ???bin?./jwebserver?-d?/Users/darcy/develop/javadocout

訪問(wèn)測(cè)試:

JEP 416:使用方法句柄重新實(shí)現(xiàn)反射核心功能

Java 18 改進(jìn)了?java.lang.reflect.Method、Constructor?的實(shí)現(xiàn)邏輯,使之性能更好,速度更快。這項(xiàng)改動(dòng)不會(huì)改動(dòng)相關(guān) API ,這意味著開(kāi)發(fā)中不需要改動(dòng)反射相關(guān)代碼,就可以體驗(yàn)到性能更好反射。

OpenJDK 官方給出了新老實(shí)現(xiàn)的反射性能基準(zhǔn)測(cè)試結(jié)果。

Java 18 之前:

Benchmark?????????????????????????????????????Mode??Cnt???Score??Error??Units ReflectionSpeedBenchmark.constructorConst?????avgt???10??68.049?±?0.872??ns/op ReflectionSpeedBenchmark.constructorPoly??????avgt???10??94.132?±?1.805??ns/op ReflectionSpeedBenchmark.constructorVar???????avgt???10??64.543?±?0.799??ns/op ReflectionSpeedBenchmark.instanceFieldConst???avgt???10??35.361?±?0.492??ns/op ReflectionSpeedBenchmark.instanceFieldPoly????avgt???10??67.089?±?3.288??ns/op ReflectionSpeedBenchmark.instanceFieldVar?????avgt???10??35.745?±?0.554??ns/op ReflectionSpeedBenchmark.instanceMethodConst??avgt???10??77.925?±?2.026??ns/op ReflectionSpeedBenchmark.instanceMethodPoly???avgt???10??96.094?±?2.269??ns/op ReflectionSpeedBenchmark.instanceMethodVar????avgt???10??80.002?±?4.267??ns/op ReflectionSpeedBenchmark.staticFieldConst?????avgt???10??33.442?±?2.659??ns/op ReflectionSpeedBenchmark.staticFieldPoly??????avgt???10??51.918?±?1.522??ns/op ReflectionSpeedBenchmark.staticFieldVar???????avgt???10??33.967?±?0.451??ns/op ReflectionSpeedBenchmark.staticMethodConst????avgt???10??75.380?±?1.660??ns/op ReflectionSpeedBenchmark.staticMethodPoly?????avgt???10??93.553?±?1.037??ns/op ReflectionSpeedBenchmark.staticMethodVar??????avgt???10??76.728?±?1.614??ns/op

Java 18 的新實(shí)現(xiàn):

Benchmark?????????????????????????????????????Mode??Cnt????Score???Error??Units ReflectionSpeedBenchmark.constructorConst?????avgt???10???32.392?±?0.473??ns/op ReflectionSpeedBenchmark.constructorPoly??????avgt???10??113.947?±?1.205??ns/op ReflectionSpeedBenchmark.constructorVar???????avgt???10???76.885?±?1.128??ns/op ReflectionSpeedBenchmark.instanceFieldConst???avgt???10???18.569?±?0.161??ns/op ReflectionSpeedBenchmark.instanceFieldPoly????avgt???10???98.671?±?2.015??ns/op ReflectionSpeedBenchmark.instanceFieldVar?????avgt???10???54.193?±?3.510??ns/op ReflectionSpeedBenchmark.instanceMethodConst??avgt???10???33.421?±?0.406??ns/op ReflectionSpeedBenchmark.instanceMethodPoly???avgt???10??109.129?±?1.959??ns/op ReflectionSpeedBenchmark.instanceMethodVar????avgt???10???90.420?±?2.187??ns/op ReflectionSpeedBenchmark.staticFieldConst?????avgt???10???19.080?±?0.179??ns/op ReflectionSpeedBenchmark.staticFieldPoly??????avgt???10???92.130?±?2.729??ns/op ReflectionSpeedBenchmark.staticFieldVar???????avgt???10???53.899?±?1.051??ns/op ReflectionSpeedBenchmark.staticMethodConst????avgt???10???35.907?±?0.456??ns/op ReflectionSpeedBenchmark.staticMethodPoly?????avgt???10??102.895?±?1.604??ns/op ReflectionSpeedBenchmark.staticMethodVar??????avgt???10???82.123?±?0.629??ns/op

可以看到在某些場(chǎng)景下性能稍微好些。

JEP 417:Vector API(三次孵化)

在 Java 16 中引入一個(gè)新的 API 來(lái)進(jìn)行向量計(jì)算,它可以在運(yùn)行時(shí)可靠的編譯為支持的 CPU 架構(gòu),從而實(shí)現(xiàn)更優(yōu)的計(jì)算能力。

在 Java 17 中改進(jìn)了 Vector API 性能,增強(qiáng)了例如對(duì)字符的操作、字節(jié)向量與布爾數(shù)組之間的相互轉(zhuǎn)換等功能。

現(xiàn)在在 JDK 18 中將繼續(xù)優(yōu)化其性能。

JEP 418:互聯(lián)網(wǎng)地址解析 SPI

對(duì)于互聯(lián)網(wǎng)地址解析 SPI,為主機(jī)地址和域名地址解析定義一個(gè) SPI,以便java.net.InetAddress可以使用平臺(tái)內(nèi)置解析器以外的解析器。

InetAddress?inetAddress?=?InetAddress.getByName("www.wdbyte.com"); System.out.println(inetAddress.getHostAddress()); //?輸出 //?106.14.229.49

JEP 419:Foreign Function & Memory API (第二次孵化)

新的 API 允許 Java 開(kāi)發(fā)者與 JVM 之外的代碼和數(shù)據(jù)進(jìn)行交互,通過(guò)調(diào)用外部函數(shù),可以在不使用 JNI 的情況下調(diào)用本地庫(kù)。

這是一個(gè)孵化功能;需要添加--add-modules jdk.incubator.foreign來(lái)編譯和運(yùn)行 Java 代碼,Java 18 改進(jìn)了相關(guān) API ,使之更加簡(jiǎn)單易用。

歷史

  • ??Java 14?JEP 370 (opens new window)[10]引入了外部?jī)?nèi)存訪問(wèn) API(孵化器)。

  • ??Java 15?JEP 383 (opens new window)[11]引入了外部?jī)?nèi)存訪問(wèn) API(第二孵化器)。

  • ??Java 16?JEP 389 (opens new window)[12]引入了外部鏈接器 API(孵化器)。

  • ??Java 16?JEP 393 (opens new window)[13]引入了外部?jī)?nèi)存訪問(wèn) API(第三孵化器)。

  • ??Java 17?JEP 412 (opens new window)[14]引入了外部函數(shù)和內(nèi)存 API(孵化器)。

JEP 420:switch 表達(dá)式(二次孵化)

從 Java 17 開(kāi)始,對(duì)于 Switch 的改進(jìn)就已經(jīng)在進(jìn)行了,Java 17 的 JEP 406 已經(jīng)對(duì) Switch 表達(dá)式進(jìn)行了增強(qiáng),使之可以減少代碼量。

下面是幾個(gè)例子:

//?JDK?17?以前 static?String?formatter(Object?o)?{String?formatted?=?"unknown";if?(o?instanceof?Integer?i)?{formatted?=?String.format("int?%d",?i);}?else?if?(o?instanceof?Long?l)?{formatted?=?String.format("long?%d",?l);}?else?if?(o?instanceof?Double?d)?{formatted?=?String.format("double?%f",?d);}?else?if?(o?instanceof?String?s)?{formatted?=?String.format("String?%s",?s);}return?formatted; }

而在 Java 17 之后,可以通過(guò)下面的寫法進(jìn)行改進(jìn):

//?JDK?17?之后 static?String?formatterPatternSwitch(Object?o)?{return?switch?(o)?{case?Integer?i?->?String.format("int?%d",?i);case?Long?l????->?String.format("long?%d",?l);case?Double?d??->?String.format("double?%f",?d);case?String?s??->?String.format("String?%s",?s);default????????->?o.toString();}; }

switch 可以和?null?進(jìn)行結(jié)合判斷:

static?void?testFooBar(String?s)?{switch?(s)?{case?null?????????->?System.out.println("Oops");case?"Foo",?"Bar"?->?System.out.println("Great");default???????????->?System.out.println("Ok");} }

case 時(shí)可以加入復(fù)雜表達(dá)式:

static?void?testTriangle(Shape?s)?{switch?(s)?{case?Triangle?t?&&?(t.calculateArea()?>?100)?->System.out.println("Large?triangle");default?->System.out.println("A?shape,?possibly?a?small?triangle");} }

case 時(shí)可以進(jìn)行類型判斷:

sealed?interface?S?permits?A,?B,?C?{} final?class?A?implements?S?{} final?class?B?implements?S?{} record?C(int?i)?implements?S?{}??//?Implicitly?finalstatic?int?testSealedExhaustive(S?s)?{return?switch?(s)?{case?A?a?->?1;case?B?b?->?2;case?C?c?->?3;}; }

擴(kuò)展:JEP 406:Switch 的類型匹配(預(yù)覽)[15]

JEP 421:棄用刪除相關(guān)

在未來(lái)將刪除 Finalization,目前 Finalization 仍默認(rèn)保持啟用狀態(tài),但是已經(jīng)可以手動(dòng)禁用;在未來(lái)的版本中,將會(huì)默認(rèn)禁用;在以后的版本中,它將被刪除。需要進(jìn)行資源管理可以嘗試?try-with-resources?或者?java.lang.ref.Cleaner。

引用鏈接

[1]?默認(rèn)為 UTF-8:?https://openjdk.java.net/jeps/400
[2]?簡(jiǎn)單的網(wǎng)絡(luò)服務(wù)器:?https://openjdk.java.net/jeps/408
[3]?Java API 文檔中的代碼片段:?https://openjdk.java.net/jeps/413
[4]?使用方法句柄重新實(shí)現(xiàn)核心反射:?https://openjdk.java.net/jeps/416
[5]?Vector API(三次孵化):?https://openjdk.java.net/jeps/417
[6]?互聯(lián)網(wǎng)地址解析 SPI:?https://openjdk.java.net/jeps/418
[7]?Foreign Function & Memory API (二次孵化):?https://openjdk.java.net/jeps/419
[8]?switch 模式匹配(二次預(yù)覽):?https://openjdk.java.net/jeps/420
[9]?棄用完成刪除:?https://openjdk.java.net/jeps/421
[10]?JEP 370 (opens new window):?https://openjdk.java.net/jeps/370
[11]?JEP 383 (opens new window):?https://openjdk.java.net/jeps/383
[12]?JEP 389 (opens new window):?https://openjdk.java.net/jeps/389
[13]?JEP 393 (opens new window):?https://openjdk.java.net/jeps/393
[14]?JEP 412 (opens new window):?https://openjdk.java.net/jeps/412

往期推薦

Spring爆出高危漏洞,嚴(yán)重程度不低于Log4J?


本周 火火火火火 的開(kāi)源項(xiàng)目


UUID 正在被 NanoID 取代?


有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號(hào)

好文章,我在看??

總結(jié)

以上是生活随笔為你收集整理的Java 18 新功能介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美人人爽| 中文成人在线 | www视频免费观看 | 亚洲天堂高清 | 欧美aa在线 | av不卡免费在线观看 | 亚洲爆乳无码精品aaa片蜜桃 | 欧美综合图区 | 人人草人人看 | 久久接色 | 亚洲影院一区二区三区 | 欧美一区二区三区在线免费观看 | 在线看国产 | 亚洲精品无码久久久 | 少妇喷潮明星 | 狼人精品一区二区三区在线 | 一级片中文 | 伊人久久av | 国产伦精品一区二区三区四区免费 | 1级黄色大片| 国产精成人 | 好吊妞视频一区二区三区 | 国产一区二区三区视频免费在线观看 | 亚洲一区毛片 | 99热这里只有精品3 成年人黄色网址 | 天天草天天草 | 午夜老湿机 | 国产911视频 | 国产农村妇女精品一区二区 | 99999视频| 国产精品一区二区无码免费看片 | 激情91| 福利视频在线看 | 成人午夜剧场视频网站 | 国产极品美女在线 | 在线观看毛片网站 | 青青草自拍| 激情四虎 | 国产999精品 | 精品国产一级片 | 欧美成人精品一区二区男人小说 | 国产免费网址 | 亚洲精品欧洲精品 | 国产麻豆一区二区三区在线观看 | 亚洲在线视频观看 | 少妇人妻偷人精品视频蜜桃 | 在线天堂www在线国语对白 | 欧美巨大另类极品videosbest | 侵犯女教师一区二区三区 | 美女xx00 | 久久久在线 | 亚洲熟女少妇一区二区 | 麻豆传媒在线免费 | 国产一级一区二区 | 穿扒开跪着折磨屁股视频 | 91老师国产黑色丝袜在线 | 亚洲午夜精品一区 | 日韩性大片| 国产1区在线| 中文字幕免费中文 | 亚洲色图国产视频 | 成人看片泡妞 | 性做爰视频免费播放大全 | 国产浪潮av| 波多野吉衣在线观看视频 | 中文字幕区 | 日韩有码中文字幕在线观看 | 免费看美女被靠到爽的视频 | 天堂伊人 | 国产香蕉9 | 黄色免费在线看 | 久久亚洲aⅴ无码精品 | 久久久久夜夜夜精品国产 | 久久99久久99 | 国产第一亚洲 | 新av在线 | 一级片免费观看视频 | 一区二区在线观看免费 | 噼里啪啦国语版在线观看 | 91视| 亚洲精品久久久蜜桃网尤妮丝 | 成人小视频在线免费观看 | 色妞网站 | 国产毛片高清 | 国产超级av在线 | 免费www xxx | 日韩卡一卡二 | 女人张开腿让男人桶爽 | 我爱av好色 | 国产在线精品一区二区三区 | xxx毛片| 日本女人黄色 | 国精品一区二区 | 日韩电影在线观看一区二区 | 亚洲天堂色| 男人的天堂视频 | 成人看片在线 | 亚洲成人av在线播放 | 在线观看免费视频一区 |