国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java java教程 JBang,Java 生態(tài)系中缺少的腳本工具

JBang,Java 生態(tài)系中缺少的腳本工具

Jan 05, 2025 am 04:01 AM

Java生態(tài)已經(jīng)有兩個(gè)強(qiáng)大的專(zhuān)案管理工具,Maven和Gradle,但缺少一個(gè)簡(jiǎn)單而強(qiáng)大的腳本工具。
這就是 JBang 發(fā)揮作用的地方。
它是一個(gè)簡(jiǎn)約但功能強(qiáng)大的 Java、Kotlin 和 Groovy 檔案啟動(dòng)器。
事實(shí)上,它允許您像運(yùn)行腳本一樣輕鬆地運(yùn)行程式碼。
它還提供許多其他功能,例如依賴(lài)管理、模板和 App Store。
讓我們?cè)谶@篇文章中探索 JBang 及其功能。

設(shè)定

jbang 命令列可以使用不同的方法安裝在 Windows、Linux 和 macOS 上,這些方法在此處有詳細(xì)記錄。
我們可以透過(guò)執(zhí)行 jbang --version 來(lái)驗(yàn)證安裝。

除此之外,最好為我們最喜歡的 IDE 安裝隨附的 IDE 擴(kuò)充功能。
此處列出了支援的 IDE 擴(kuò)充。

JBang 不依賴(lài) JDK 到 JRE,但執(zhí)行使用 Java 的腳本需要 JDK。
您可以透過(guò)執(zhí)行 jbang jdk install 23 來(lái)安裝 JBang,這將安裝 JDK 23。

我們現(xiàn)在準(zhǔn)備好要寫(xiě)我們的第一個(gè)腳本。

第一個(gè)腳本

讓我們建立一個(gè)簡(jiǎn)單的腳本來(lái)列印「Hello, World!」到控制臺(tái)。

> jbang init helloworld.java

這將建立一個(gè)名為 helloworld.java 的文件,可以使用 jbang helloworld.java 運(yùn)行。

> jbang helloworld.java
Hello world

當(dāng)您開(kāi)啟該文件時(shí),您將看到它是一個(gè)普通的 Java 文件,帶有 main 方法和特定的第一行。

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

正如我們將看到的,JBang 腳本由三個(gè)部分組成:shebang、可選屬性和腳本本身。
我們將在接下來(lái)的部分中使用第二部分的一些屬性,但讓我們專(zhuān)注於第一部分。

這部分 ///usr/bin/env jbang "$0" "$@" ;退出$?告訴系統(tǒng)使用 JBang 來(lái)執(zhí)行腳本。
它在 Unix 生態(tài)系統(tǒng)中被稱(chēng)為 shebang,用於指定腳本的解釋器。
我們可以在 Unix 系統(tǒng)(macOS、Linux)上透過(guò)執(zhí)行 chmod x helloworld.java 使腳本可執(zhí)行,然後執(zhí)行 ./helloworld.java 來(lái)說(shuō)明這一點(diǎn)。

/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
" "$@" ; exit $? //JAVA 23+ //COMPILE_OPTIONS --enable-preview -source 23 //RUNTIME_OPTIONS --enable-preview void main(String... args) { System.out.println("Hello World"); } " "$@" ; exit $? //JAVA 25 //COMPILE_OPTIONS --enable-preview -source 25 //RUNTIME_OPTIONS --enable-preview import java.util.concurrent.Callable; import java.util.concurrent.StructuredTaskScope; import static java.lang.System.*; void main(String... args) { out.println("Hello Java 25"); Callable task1 = () -> { out.println("Task 1" + Thread.currentThread()); return "Task 1"; }; Callable task2 = () -> { out.println("Task 2" + Thread.currentThread()); return 2; }; try ( var scope = new StructuredTaskScope()) { StructuredTaskScope.Subtask subtask1 = scope.fork(task1); StructuredTaskScope.Subtask subtask2 = scope.fork(task2); scope.join(); } catch (Exception e) { e.printStackTrace(); } }

我們現(xiàn)在可以像使用任何 Java 檔案一樣開(kāi)發(fā)腳本。
一旦準(zhǔn)備好發(fā)布,我們可以將其匯出為不同的格式,如下所示:

  • 一個(gè)jar檔:jbang導(dǎo)出可移植的helloworld.java。如果您的腳本使用依賴(lài)項(xiàng),則更建議使用以下命令。
  • A fatjar:包含所有相依性:jbang export fatjar helloworld.java。此方法仍需要在目標(biāo)機(jī)器上安裝JDK/JRE。如果您不想這樣做,更建議使用接下來(lái)的命令。
  • 包含 JDK 的 jlink 二進(jìn)位檔案:jbang export jlink helloworld.java。要執(zhí)行的二進(jìn)位檔案是 Unix 上的 helloworld-jlink/bin/helloworld 或 Windows 上的 helloworld-jlink/bin/helloworld.bat。
  • A 原生 imgae:jbang 匯出原生 helloworld.java。這需要安裝 GraalVM。

腳本也可以匯出為 mavenrepo: jbang export mavenrepo helloworld.java

JDK管理

如前一章所示,JBang 可以在您的電腦上安裝 JDK。
您可以使用 jbang jdk list 列出已安裝的 JDK,使用 jbang jdk list --available --show-details 列出可安裝的 JDK,使用 jbang jdk install [version] 安裝新的 JDK。 Jbang 也支援使用 SDKMAN 來(lái)管理支援系統(tǒng)上的 JDK。

此外,可以在腳本中指定 JDK 版本。
這是透過(guò)將以下行新增至腳本屬性來(lái)完成的: //JAVA [version](如果我們想要精確版本)或 //JAVA [version](如果我們至少想要一個(gè)特定版本)。
在這種情況下,JBang 將自動(dòng)安裝所需的 JDK 版本並僅將其用於該腳本,而不更改系統(tǒng)的預(yù)設(shè) JDK。

例如,以下腳本使用 Java 25 和一些預(yù)覽功能。

> jbang init helloworld.java

沒(méi)有「Main」類(lèi)別的腳本

由於腳本往往是輕量級(jí)的,因此最好在沒(méi)有類(lèi)別和 main 方法的情況下編寫(xiě)它們。
幸運(yùn)的是,Java 有一個(gè)稱(chēng)為隱式宣告類(lèi)別和實(shí)例主方法的功能(在 Java 23 中仍處?kù)额A(yù)覽狀態(tài))。
此功能允許在沒(méi)有類(lèi)別和靜態(tài) main 方法的情況下編寫(xiě) java 程式和 JBang 腳本。

下面的腳本將被編譯並執(zhí)行,沒(méi)有任何問(wèn)題。

> jbang helloworld.java
Hello world

這是透過(guò)向腳本添加以下屬性來(lái)實(shí)現(xiàn)的。

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

第一行 //JAVA 23 告訴 JBang 使用 Java 23 或更高版本。
第二行和第三行 //COMPILE_OPTIONS --enable-preview -source 23 和 //RUNTIME_OPTIONS --enable-preview 分別啟用編譯和執(zhí)行時(shí)的預(yù)覽功能。

一旦功能變得穩(wěn)定,我們可以刪除這 3 行,腳本仍然可以工作。整齊!

依賴(lài)關(guān)係

JBang 支援以 Gradle 樣式依賴(lài)項(xiàng)的形式為腳本新增依賴(lài)項(xiàng),方法是為每個(gè)依賴(lài)項(xiàng)新增 //DEPS atrefact-id:atrefact-name:version 行。
例如,要使用 jfiglet 函式庫(kù),我們可以將以下行加入腳本: //DEPS com.github.lalyos:jfiglet:0.0.8.

> jbang init helloworld.java

目錄

JBang 中的目錄允許有效地組織和共享腳本和範(fàn)本。
此功能對(duì)於想要共享常見(jiàn)任務(wù)或工作流程的腳本集合的團(tuán)隊(duì)或社群特別有用。
對(duì)於想要分發(fā)入門(mén)程式碼或在不提供原始程式碼的情況下顯示練習(xí)結(jié)果的教師來(lái)說(shuō),它也很有用。

目錄是一個(gè)名為 jbang-catalog.json 的 JSON 文件,其中包含兩組項(xiàng)目:別名和模板。
別名允許使用簡(jiǎn)單的命令從目錄運(yùn)行腳本,而模板則提供新腳本的起點(diǎn)。
目錄可以是遠(yuǎn)端的或本地的,並且可以根據(jù)需要添加和使用任意數(shù)量的本地或遠(yuǎn)端儲(chǔ)存庫(kù)。
有趣的是,JBang 在設(shè)定過(guò)程中創(chuàng)建了一個(gè)本地目錄,其中包含一些開(kāi)箱即用的別名和模板。

JBang 依照下列順序在這些目錄中尋找本機(jī)目錄(來(lái)源 JBang 文件):

  1. 目前目錄,./jbang-catalog.json
  2. 在./.jbang/jbang-catalog.json中
  3. 在父目錄中,../jbang-catalog.json
  4. 在父級(jí)的 .jbang 目錄中,../.jbang/jbang-catalog.json
  5. 並向上遞歸重複步驟3和4到檔案系統(tǒng)的根
  6. 最後一步它將查看 $HOME/.jbang/jbang-catalog.json

JBang 將在許多開(kāi)源儲(chǔ)存庫(kù)(如 GitHub、GitLab、Bitbucket 等)中尋找遠(yuǎn)端目錄。
我將在本文中使用 GitHub 作為範(fàn)例。
若要建立遠(yuǎn)端目錄,您需要將 jbang-catalog.json 新增至儲(chǔ)存庫(kù)的根資料夾。
然後透過(guò) account/repository_name 引用該目錄。
如果您的儲(chǔ)存庫(kù)名為 jbang-catalog,那麼您可以透過(guò)帳戶(hù)引用它。
因此,例如,如果我的GitHub 帳戶(hù)名為yostane,並且我有一個(gè)名為curs-java 的儲(chǔ)存庫(kù),其中包含一個(gè)名為jbang-catalog.json 的檔案的目錄,我可以透過(guò)yostane/cours-java 引用該目錄。此外,如果我在名為 jbang-catalog 的儲(chǔ)存庫(kù)中有一個(gè) jbang-catalog.json,那麼我可以透過(guò) yostane/jbang-catalog 或簡(jiǎn)單地 yostane 引用它。

> jbang helloworld.java
Hello world

以下章節(jié)將展示如何使用目錄中的別名和模板。

別名

JBang 中的別名允許從目錄執(zhí)行腳本。
完整語(yǔ)法是 jbang alias@account/repository [args] 和 jbang alias [args] 分別表示遠(yuǎn)端和本地別名。

可以使用以下格式在目錄檔案的別名部分定義別名:

> jbang init helloworld.java

這是我在 DevoxxMA 2024 會(huì)議期間使用的目錄。

> jbang helloworld.java
Hello world

您可以使用以下命令執(zhí)行這些別名:

  • jbang palcli@yostane/cours-java 女士
  • jbang palqrest@yostane/cours-java
  • jbang hellojfx@yostane/cours-java

官方JBang GitHub帳號(hào)提供了包含許多別名和範(fàn)本的目錄。
讓我們運(yùn)行其中的一些:

  • jbang httpd@jbangdev 運(yùn)行本機(jī)網(wǎng)路伺服器。
  • jbang gavsearch@jbangdev [arg] 在 search.maven.org 上搜尋 [arg]。

範(fàn)本

模板,這是預(yù)先定義的腳本,可以用作新腳本的起點(diǎn)。
它們使用以下格式在目錄檔案的範(fàn)本部分中定義:

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

使用範(fàn)本時(shí),JBang 會(huì)在 file-refs 屬性中建立所有檔案的副本。
當(dāng) file-ref 包含 {basename} 時(shí),JBang 會(huì)將其替換為正在建立的腳本的名稱(chēng)。
當(dāng)檔案引用使用 .qute 副檔名時(shí),JBang 使用 Qute 模板引擎

以下是一些現(xiàn)成可用的範(fàn)本的範(fàn)例:

  • 使用 picocli 的 CLI 腳本:jbang init -t cli hellocli.java
  • Quarkus 單檔 REST API:jbang init -t qrest helloqrest.java

我們也可以使用社群共享的網(wǎng)路範(fàn)本。
例如,此指令建立一個(gè) JUnit 單元測(cè)試檔: jbang init -t junit@jbangdev file_to_test.java.
從指令中我們可以找到 jbangdev/jbang-catalog 儲(chǔ)存庫(kù)中定義範(fàn)本的 jbang-catalog.json。

/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
" "$@" ; exit $? //JAVA 23+ //COMPILE_OPTIONS --enable-preview -source 23 //RUNTIME_OPTIONS --enable-preview void main(String... args) { System.out.println("Hello World"); } " "$@" ; exit $? //JAVA 25 //COMPILE_OPTIONS --enable-preview -source 25 //RUNTIME_OPTIONS --enable-preview import java.util.concurrent.Callable; import java.util.concurrent.StructuredTaskScope; import static java.lang.System.*; void main(String... args) { out.println("Hello Java 25"); Callable task1 = () -> { out.println("Task 1" + Thread.currentThread()); return "Task 1"; }; Callable task2 = () -> { out.println("Task 2" + Thread.currentThread()); return 2; }; try ( var scope = new StructuredTaskScope()) { StructuredTaskScope.Subtask subtask1 = scope.fork(task1); StructuredTaskScope.Subtask subtask2 = scope.fork(task2); scope.join(); } catch (Exception e) { e.printStackTrace(); } }

應(yīng)用程式商店

JBang App Store 是一個(gè) Web 應(yīng)用程序,允許瀏覽索引目錄的別名。
它提供了一種發(fā)現(xiàn)和使用各種工具和實(shí)用程式的便捷方法,無(wú)需複雜的設(shè)定或安裝過(guò)程。
例如,當(dāng)我們搜尋 yostane 時(shí),我們應(yīng)該能夠找到我在不同目錄中定義的不同別名。
下圖顯示了搜尋結(jié)果。

JBang, the missing scripting tool of the Java ecosystem

以下是我在A(yíng)pp Store瀏覽時(shí)發(fā)現(xiàn)的一些有趣又好笑的腳本:

  • 考賽。以下是運(yùn)行腳本的一些範(fàn)例:
    • jbangowsay@ricksbrown/cowsay MOO!
    • jbangowsay@ricksbrown/cowsay -f Dragon「我是維爾德拉暴風(fēng)雨!」
  • 尋找類(lèi)似 grep 的子字串: jbang grep@a-services "hello" 。
  • 從圖像建立 PDF:images2pdf@a-services。以下命令將從兩個(gè)影像建立 PDF 檔案:
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">  {
    "catalogs": {},
    "aliases": {
      // aliases
    },
    "templates": {
      // templates
    }
  }
" "$@" ; exit $? //DEPS com.github.lalyos:jfiglet:0.0.9 import com.github.lalyos.jfiglet.FigletFont; public class DependenciesDemo { public static void main(String... args) throws Exception { System.out.println(FigletFont.convertOneLine("JBang is amazing")); } }

當(dāng)您發(fā)布目錄時(shí),它很可能會(huì)在 JBang AppStore 下次索引後出現(xiàn)。
這是此處定義的預(yù)定 GitHub 操作。

一些具有著名框架的範(fàn)例

透過(guò) JBang,我們可以建立使用流行框架和函式庫(kù)的單文件應(yīng)用程式。
一些例子包括 Quarkus、picolcli 和 JavaFX。
讓我們?cè)谝韵虏糠种刑接懸恍┕?fàn)例。

JavaFX(openjfx)

JavaFX 是一個(gè)桌面和 UI 框架。
其官方網(wǎng)站是 openjfx.io,也受到 Gluon 的支持,Gluon 提供了額外的 UI 元件,並為 JavaFX 帶來(lái)了行動(dòng)應(yīng)用程式支援。
JBang 支援此??框架,可用於建立單一檔案 JavaFX 應(yīng)用程式。

以下是使用 JBang 建立的一些 JavaFX 應(yīng)用程式範(fàn)例:

  • 基本視窗
  • 更漂亮的例子jbang https://gist.github.com/FDelporte/c69a02c57acc892b4c996a9779d4f830
  • 模板 jbang init -t javafx@yostane hellojfx

誇庫(kù)斯

Quarkus 是一個(gè)針對(duì) Kubernetes 和無(wú)伺服器環(huán)境進(jìn)行最佳化的 Java 框架。
它提供快速啟動(dòng)時(shí)間和低記憶體消耗,使其成為雲(yún)端原生應(yīng)用程式的理想選擇。

感謝 JBang,我們可以創(chuàng)建利用該框架強(qiáng)大功能的單一檔案 Quarkus 應(yīng)用程式。
以下範(fàn)例顯示了一個(gè)測(cè)試字串是否為回文的 REST API。它具有 JSON 解析、日誌記錄並提供 OpenAPI 和 Swagger 文件。

> jbang init helloworld.java

我們可能會(huì)注意到腳本中的 //SOURCES PalindromeService.java 行。
它告訴 JBang 在與腳本相同的目錄中尋找名為 PalindromeService.java 的檔案。
這意味著JBang支援多檔案腳本。

您可以使用 jbang palqrest@yostane/cours-java 執(zhí)行伺服器並使用curl http://localhost:8080/palindrome?input=madam 呼叫端點(diǎn)。

> jbang helloworld.java
Hello world

其他語(yǔ)言

JBang 支援執(zhí)行 Java、Kotlin、JShell 和 Groovy 程式碼。
它甚至可以從 Markdown 檔案運(yùn)行 Java 程式碼。
以下是如何在不同語(yǔ)言中使用 JBang 的一些範(fàn)例:

  • Kotlin:您可以使用 jbang init -t hello.kt filename.kt 初始化 Kotlin 腳本。請(qǐng)注意,這與官方 .main.kts Kotlin 腳本不同。事實(shí)上,JBang 創(chuàng)建的 Kotlin 腳本可以受益於目錄和 App Store 功能。以下是使用 JBang 建立的 Kotlin 腳本的範(fàn)例。
> jbang init helloworld.java
  • 有趣的事實(shí):JBang 的想法來(lái)自針對(duì) Kotlin 生態(tài)系統(tǒng)的 kscript。
  • Kotlin 已經(jīng)具有原生腳本支援(使用 .main.kts 腳本),但似乎缺乏目錄、範(fàn)本和 App Store 功能。
    • Groovy:使用 jbang init -t hello.groovy filename.groovy 初始化 Groovy 腳本。以下是使用 JBang 建立的 Groovy 腳本的範(fàn)例。
> jbang helloworld.java
Hello world
  • JShell:JBang 支援帶有 .jsh 或 .jshell 副檔名的 JShell 腳本以及使用 jbang -c 'System.out.println("Inline Java ? yay!")' 的內(nèi)聯(lián)腳本。以下是使用 JBang 建立的 JShell 腳本範(fàn)例。
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }
  • 使用 Java 和 JShell 程式碼區(qū)塊進(jìn)行 Markdown:您可以使用 jbang my_markdown.md 直接從 Markdown 檔案執(zhí)行 Java 和 JShell 程式碼區(qū)塊。
/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
" "$@" ; exit $? //JAVA 23+ //COMPILE_OPTIONS --enable-preview -source 23 //RUNTIME_OPTIONS --enable-preview void main(String... args) { System.out.println("Hello World"); } " "$@" ; exit $? //JAVA 25 //COMPILE_OPTIONS --enable-preview -source 25 //RUNTIME_OPTIONS --enable-preview import java.util.concurrent.Callable; import java.util.concurrent.StructuredTaskScope; import static java.lang.System.*; void main(String... args) { out.println("Hello Java 25"); Callable task1 = () -> { out.println("Task 1" + Thread.currentThread()); return "Task 1"; }; Callable task2 = () -> { out.println("Task 2" + Thread.currentThread()); return 2; }; try ( var scope = new StructuredTaskScope()) { StructuredTaskScope.Subtask subtask1 = scope.fork(task1); StructuredTaskScope.Subtask subtask2 = scope.fork(task2); scope.join(); } catch (Exception e) { e.printStackTrace(); } }

以上是JBang,Java 生態(tài)系中缺少的腳本工具的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

hashmap和hashtable之間的區(qū)別? hashmap和hashtable之間的區(qū)別? Jun 24, 2025 pm 09:41 PM

HashMap與Hashtable的區(qū)別主要體現(xiàn)在線(xiàn)程安全、null值支持及性能方面。 1.線(xiàn)程安全方面,Hashtable是線(xiàn)程安全的,其方法大多為同步方法,而HashMap不做同步處理,非線(xiàn)程安全;2.null值支持上,HashMap允許一個(gè)null鍵和多個(gè)null值,Hashtable則不允許null鍵或值,否則拋出NullPointerException;3.性能方面,HashMap因無(wú)同步機(jī)制效率更高,Hashtable因每次操作加鎖性能較低,推薦使用ConcurrentHashMap替

為什麼我們需要包裝紙課? 為什麼我們需要包裝紙課? Jun 28, 2025 am 01:01 AM

Java使用包裝類(lèi)是因?yàn)榛緮?shù)據(jù)類(lèi)型無(wú)法直接參與面向?qū)ο癫僮?,而?shí)際需求中常需對(duì)象形式;1.集合類(lèi)只能存儲(chǔ)對(duì)象,如List利用自動(dòng)裝箱存儲(chǔ)數(shù)值;2.泛型不支持基本類(lèi)型,必須使用包裝類(lèi)作為類(lèi)型參數(shù);3.包裝類(lèi)可表示null值,用於區(qū)分未設(shè)置或缺失的數(shù)據(jù);4.包裝類(lèi)提供字符串轉(zhuǎn)換等實(shí)用方法,便於數(shù)據(jù)解析與處理,因此在需要這些特性的場(chǎng)景下,包裝類(lèi)不可或缺。

什麼是接口中的靜態(tài)方法? 什麼是接口中的靜態(tài)方法? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

JIT編譯器如何優(yōu)化代碼? JIT編譯器如何優(yōu)化代碼? Jun 24, 2025 pm 10:45 PM

JIT編譯器通過(guò)方法內(nèi)聯(lián)、熱點(diǎn)檢測(cè)與編譯、類(lèi)型推測(cè)與去虛擬化、冗餘操作消除四種方式優(yōu)化代碼。 1.方法內(nèi)聯(lián)減少調(diào)用開(kāi)銷(xiāo),將頻繁調(diào)用的小方法直接插入調(diào)用處;2.熱點(diǎn)檢測(cè)識(shí)別高頻執(zhí)行代碼並集中優(yōu)化,節(jié)省資源;3.類(lèi)型推測(cè)收集運(yùn)行時(shí)類(lèi)型信息實(shí)現(xiàn)去虛擬化調(diào)用,提升效率;4.冗餘操作消除根據(jù)運(yùn)行數(shù)據(jù)刪除無(wú)用計(jì)算和檢查,增強(qiáng)性能。

什麼是實(shí)例初始器塊? 什麼是實(shí)例初始器塊? Jun 25, 2025 pm 12:21 PM

實(shí)例初始化塊在Java中用於在創(chuàng)建對(duì)象時(shí)運(yùn)行初始化邏輯,其執(zhí)行先於構(gòu)造函數(shù)。它適用於多個(gè)構(gòu)造函數(shù)共享初始化代碼、複雜字段初始化或匿名類(lèi)初始化場(chǎng)景,與靜態(tài)初始化塊不同的是它每次實(shí)例化時(shí)都會(huì)執(zhí)行,而靜態(tài)初始化塊僅在類(lèi)加載時(shí)運(yùn)行一次。

變量的最終關(guān)鍵字是什麼? 變量的最終關(guān)鍵字是什麼? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

什麼是工廠(chǎng)模式? 什麼是工廠(chǎng)模式? Jun 24, 2025 pm 11:29 PM

工廠(chǎng)模式用於封裝對(duì)象創(chuàng)建邏輯,使代碼更靈活、易維護(hù)、松耦合。其核心答案是:通過(guò)集中管理對(duì)象創(chuàng)建邏輯,隱藏實(shí)現(xiàn)細(xì)節(jié),支持多種相關(guān)對(duì)象的創(chuàng)建。具體描述如下:工廠(chǎng)模式將對(duì)象創(chuàng)建交給專(zhuān)門(mén)的工廠(chǎng)類(lèi)或方法處理,避免直接使用newClass();適用於多類(lèi)型相關(guān)對(duì)象創(chuàng)建、創(chuàng)建邏輯可能變化、需隱藏實(shí)現(xiàn)細(xì)節(jié)的場(chǎng)景;例如支付處理器中通過(guò)工廠(chǎng)統(tǒng)一創(chuàng)建Stripe、PayPal等實(shí)例;其實(shí)現(xiàn)包括工廠(chǎng)類(lèi)根據(jù)輸入?yún)?shù)決定返回的對(duì)象,所有對(duì)象實(shí)現(xiàn)共同接口;常見(jiàn)變體有簡(jiǎn)單工廠(chǎng)、工廠(chǎng)方法和抽象工廠(chǎng),分別適用於不同複雜度的需求。

什麼是類(lèi)型鑄造? 什麼是類(lèi)型鑄造? Jun 24, 2025 pm 11:09 PM

類(lèi)型轉(zhuǎn)換有兩種:隱式和顯式。 1.隱式轉(zhuǎn)換自動(dòng)發(fā)生,如將int轉(zhuǎn)為double;2.顯式轉(zhuǎn)換需手動(dòng)操作,如使用(int)myDouble。需要類(lèi)型轉(zhuǎn)換的情況包括處理用戶(hù)輸入、數(shù)學(xué)運(yùn)算或函數(shù)間傳遞不同類(lèi)型的值時(shí)。需要注意的問(wèn)題有:浮點(diǎn)數(shù)轉(zhuǎn)整數(shù)會(huì)截?cái)嘈?shù)部分、大類(lèi)型轉(zhuǎn)小類(lèi)型可能導(dǎo)致數(shù)據(jù)丟失、某些語(yǔ)言不允許直接轉(zhuǎn)換特定類(lèi)型。正確理解語(yǔ)言的轉(zhuǎn)換規(guī)則有助於避免錯(cuò)誤。

See all articles