Java 8 到 Java 22 新特性詳解

Java 8 到 Java 22 新特性詳解

Java自發布以來一直在不斷演進,添加新特性以提升開發效率和性能。本文將介紹Java 8到Java 22的主要新特性,幫助開發者了解各版本的新功能和改進。

Java 8 (2014)

1. Lambda 表達式

Lambda 表達式允許使用簡潔的語法定義匿名函數,主要用于簡化集合操作和并行處理。

為什么需要 Lambda 表達式?

在 Java 8 之前,匿名內部類通常用于實現功能性接口,例如 RunnableComparator。但這種方式語法冗長且可讀性差。Lambda 表達式提供了一種更簡潔的方式來實現這些接口,使代碼更簡潔、可讀。

如何定義 Lambda 表達式

Lambda 表達式的基本語法如下:

(parameters) -> expression
或
(parameters) -> { statements; }
示例

下面是一個使用 Lambda 表達式對列表進行排序的示例:

List<String> names = Arrays.asList("張三", "李四", "王五");
names.sort((String a, String b) -> b.compareTo(a));
names.forEach(name -> System.out.println(name));

2. Stream API

Stream API 提供了一種聲明性方式處理集合數據,通過鏈式操作實現復雜的數據處理邏輯。

為什么需要 Stream API?

傳統的集合處理方式通常使用迭代器或循環,這種方式代碼冗長且易出錯。Stream API 提供了一種更簡潔和強大的方式來處理集合數據,使得代碼更具表達力和可讀性。

如何使用 Stream API

Stream API 主要由源、零或多個中間操作和終端操作組成。中間操作是惰性的,只有在終端操作調用時才會執行。

示例

下面是一個使用 Stream API 過濾和收集數據的示例:

List<String> names = Arrays.asList("張三", "李四", "王五");
List<String> filteredNames = names.stream().filter(name -> name.startsWith("張")).collect(Collectors.toList());
filteredNames.forEach(System.out::println);

3. 默認方法

默認方法(Default Methods)是Java 8引入的一個非常有用的特性,它允許在接口中定義帶有實現的方法。

為什么需要默認方法?

在Java 8之前,接口只能包含抽象方法,即沒有方法體的方法。這樣在擴展接口時,如果為接口新增方法,所有實現了該接口的類都必須實現新增加的方法。這會導致大量的代碼修改,尤其是在維護大型項目時非常不便。默認方法解決了這一問題。

默認方法的使用場景
  1. 接口演進:在框架或庫中擴展接口功能,而不影響已有的實現。
  2. 提供常用功能:在接口中提供一些常用的工具方法,這些方法可以在實現類中直接使用或重寫。
如何定義默認方法

默認方法使用 default 關鍵字進行定義。下面是一個簡單的示例:

interface MyInterface {default void defaultMethod() {System.out.println("默認方法");}void abstractMethod();
}class MyClass implements MyInterface {@Overridepublic void abstractMethod() {System.out.println("抽象方法實現");}// 可以選擇重寫默認方法@Overridepublic void defaultMethod() {System.out.println("重寫默認方法");}
}public class Main {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.abstractMethod();  // 輸出:抽象方法實現myClass.defaultMethod();   // 輸出:重寫默認方法}
}
多重繼承中的默認方法

在使用默認方法時,可能會遇到接口多重繼承的問題。如果一個類實現了多個接口,而這些接口中有同名的默認方法,那么必須在實現類中重寫該默認方法,以解決沖突。

interface InterfaceA {default void defaultMethod() {System.out.println("InterfaceA 默認方法");}
}interface InterfaceB {default void defaultMethod() {System.out.println("InterfaceB 默認方法");}
}class MyClass implements InterfaceA, InterfaceB {// 必須重寫 defaultMethod 以解決沖突@Overridepublic void defaultMethod() {InterfaceA.super.defaultMethod();InterfaceB.super.defaultMethod();}
}public class Main {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.defaultMethod();  // 輸出:InterfaceA 默認方法//      InterfaceB 默認方法}
}

4. 新的日期時間 API (java.time)

Java 8 引入了新的日期時間 API,提供了更好的日期和時間處理。

為什么需要新的日期時間 API?

在 Java 8 之前,java.util.Datejava.util.Calendar 存在設計上的缺陷,例如線程不安全、API 使用復雜等。新的日期時間 API 提供了一種更現代化、更直觀的方式來處理日期和時間。

如何使用新的日期時間 API

新的日期時間 API 位于 java.time 包下,主要包括 LocalDateLocalTimeLocalDateTimeZonedDateTime 等類。

示例

下面是一些常用的日期時間操作示例:

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
Period age = Period.between(birthday, today);
System.out.println("年齡: " + age.getYears() + " 年");LocalTime now = LocalTime.now();
LocalTime bedTime = LocalTime.of(22, 0);
Duration duration = Duration.between(now, bedTime);
System.out.println("距離睡覺時間還有: " + duration.toHours() + " 小時");

Java 9 (2017)

1. 模塊系統 (Project Jigsaw)

模塊系統允許開發者將代碼組織成獨立的模塊,提高代碼的可維護性和封裝性。

為什么需要模塊系統?

在 Java 9 之前,Java 平臺和應用程序通常是通過類路徑管理依賴,這種方式在大型項目中容易導致類沖突和依賴管理復雜等問題。模塊系統提供了一種更好的依賴管理和封裝機制。

如何定義模塊

模塊由 module-info.java 文件定義,包含模塊的名稱、依賴和導出包等信息。

示例

下面是一個簡單的模塊定義示例:

module my.module {requires java.base;exports com.example;
}
使用模塊系統的好處
  1. 強封裝:模塊系統強制模塊之間的依賴關系,避免了類路徑下的類沖突。
  2. 可維護性:通過模塊化設計,代碼更加清晰和可維護。
  3. 性能優化:模塊化可以減少應用程序的啟動時間和內存占用。

2. JShell

JShell 是一個交互式編程工具,方便開發者試驗Java代碼片段。

為什么需要 JShell?

在 Java 9 之前,Java 沒有提供類似 Python REPL 或者 JavaScript 控制臺的工具。JShell 提供了一個交互式的編程環境,可以快速測試和調試 Java 代碼。

如何使用 JShell

JShell 提供了一種 REPL(Read-Eval-Print Loop)環境,可以直接輸入 Java 代碼并立即執行。

示例
jshell> System.out.println("你好, JShell!");

3. 改進的集合工廠方法

新的工廠方法可以更簡潔地創建不可變集合。

為什么需要改進的集合工廠方法?

在 Java 9 之前,創建集合通常需要多行代碼,而且創建不可變集合相對復雜。改進的集合工廠方法提供了一種更簡潔的語法來創建不可變集合。

如何使用改進的集合工廠方法

新的集合工廠方法位于 ListSetMap 接口中,可以通過靜態方法創建不可變集合。

示例
List<String> list = List.of("蘋果", "香蕉", "橙子");
Set<String> set = Set.of("紅色", "綠色", "藍色");
Map<String, Integer> map = Map.of("張三", 1, "李四", 2);

Java 10 (2018)

1.局部變量類型推斷

  • 特性: 使用 var 關鍵字,編譯器根據右側的值自動推斷變量類型。

  • 流程:

    var list = new ArrayList<String>();
    
    • 代碼中 list 的類型會被推斷為 ArrayList<String>,不再需要顯式聲明。

2.G1 垃圾回收器改進

  • 特性: 提升了 G1 垃圾回收器的性能,優化了大堆內存的處理能力。
  • 流程:
    • 通過改進 G1 的內部算法和性能調優,減少了垃圾回收的暫停時間,提升了整體性能。

Java 11 (2018)

1. 新的字符串方法

  • 特性: 新增了 isBlanklinesstrip 方法。

    • isBlank: 檢查字符串是否為空白(僅包含空格、制表符等)。
    • lines: 將字符串按行分割為流(Stream)。
    • strip: 去除字符串前后的空白字符(比 trim 更強大,支持 Unicode 空白字符)。
  • 流程:

    String str = " Hello World ";
    System.out.println(str.isBlank());  // 輸出 false,因為字符串不為空白
    System.out.println(str.strip());    // 輸出 "Hello World",去除了前后空格String multiLineStr = "Line1\nLine2\nLine3";
    multiLineStr.lines().forEach(System.out::println); // 輸出每一行
    

2. 垃圾回收器改進

  • 特性: 引入了 ZGC (Z Garbage Collector),一個低延遲的垃圾回收器。

    • ZGC 設計用于處理大內存堆,提供低延遲的垃圾回收,適合需要高響應時間的應用。
    • 支持非常大的堆(數 TB),停頓時間通常在 10ms 以內。
  • 流程:

    • 啟用 ZGC:

      java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar yourApp.jar
      
    • 這個命令行參數啟用了 ZGC,以顯著降低應用的垃圾回收停頓時間。

3. 單文件程序執行

  • 特性: 直接運行單個 Java 源文件。

    • 這簡化了開發和測試過程,無需先編譯成字節碼文件,適合快速原型和簡單測試。
  • 流程:

    • 創建一個簡單的 Java 文件 HelloWorld.java:

      public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
      }
      
    • 使用以下命令直接運行這個文件:

      java HelloWorld.java
      
    • 這會在后臺編譯并執行 Java 文件,簡化了運行單個源文件的過程。

Java 12 (2019)

1.Switch 表達式 (預覽特性)

  • 特性: 將 switch 語句增強為可以作為表達式,并支持新的語法。

  • 流程:

    int numLetters = switch (day) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;default -> throw new IllegalStateException("Unexpected value: " + day);
    };
    
    • switch 表達式可以返回值,并且用箭頭 (->) 語法來代替傳統的 case 標簽。

2.G1 垃圾回收器改進

  • 特性: 改進了 G1 垃圾回收器的吞吐量和暫停時間。
  • 流程:
    • 通過改進 G1 的并行和并發操作,減少了垃圾回收的時間,增加了吞吐量。

Java 13 (2019)

1.文本塊 (預覽特性)

  • 特性: 使用三重引號定義多行字符串。

  • 流程:

    String text = """{"name": "Alice","age": 25}""";
    
    • 提高了多行字符串的可讀性和編寫效率,特別是在處理 JSON 和 XML 時。

2.Switch 表達式 (第二次預覽)

  • 特性: 對 Java 12 中的 Switch 表達式進行了進一步改進。
  • 流程:
    • 通過改進語法和功能,增強了對 Switch 表達式的支持和穩定性。

Java 14 (2020)

1. Switch 表達式

  • 特性: Switch 表達式正式引入。

    • Switch 表達式在 Java 中得到了正式支持,使得 switch 語句可以作為一種表達式返回值,從而簡化代碼結構和提高可讀性。
    • 新的 Switch 表達式不僅支持傳統的語法,還增加了更靈活和簡潔的語法形式。
  • 流程:

    • 之前作為預覽特性的 Switch 表達式現在作為正式特性提供了穩定的功能和語法支持。

    • 新的 Switch 表達式允許在 switch 塊中使用 -> 箭頭符號來代替 casebreak 關鍵字,使代碼更加簡潔明了。例如:

      int number = 3;
      String result = switch (number) {case 1 -> "one";case 2 -> "two";case 3 -> "three";default -> "unknown";
      };
      
    • 在這個示例中,Switch 表達式根據 number 的值返回相應的字符串,并賦值給 result 變量。

    • Switch 表達式還支持使用 yield 關鍵字返回值,使得復雜情況處理更加靈活:

      int day = 2;
      String dayType = switch (day) {case 1, 2, 3, 4, 5 -> "Weekday";case 6, 7 -> "Weekend";default -> {yield "Invalid day";}
      };
      
    • 在這個示例中,yield 關鍵字用于在默認情況下返回一個值。

    • 新的 Switch 表達式不僅可以提高代碼的可讀性和可維護性,還減少了冗余代碼和錯誤的可能性。

2.instanceof 模式匹配 (預覽特性)

  • 特性: 簡化了 instanceof 操作符的使用。

  • 流程:

    if (obj instanceof String s) {System.out.println(s.toLowerCase());
    }
    
    • instanceof 現在可以直接在條件判斷中進行類型轉換和使用。

3.Records (預覽特性)

  • 特性: 提供了一種簡潔的方式定義數據類。

  • 流程:

    public record Person(String name, int age) {}
    
    • record 關鍵字定義了不可變的數據類,自動生成構造函數、equalshashCodetoString 方法。

Java 15 (2020)

1. 文本塊

  • 特性: 文本塊正式引入。

    • 文本塊(Text Blocks)允許在代碼中更方便地書寫多行字符串,提高了代碼的可讀性和可維護性。
    • 使用三個雙引號 """ 包圍文本塊,可以避免傳統字符串中復雜的轉義字符,同時保留原始格式。
  • 流程:

    • 之前作為預覽特性的文本塊現已成為正式功能,提供了穩定的多行字符串處理。

    • 文本塊的主要優點包括減少了對轉義字符的需求、保留了文本的原始格式以及改進了代碼的可讀性和可維護性。

    • 示例代碼展示了如何使用文本塊:

      String json = """{"name": "John","age": 30,"city": "New York"}""";
      
    • 在這個示例中,文本塊使得書寫多行字符串(如 JSON 格式數據)更加簡潔和直觀,避免了傳統字符串中換行符和引號的混亂。

    • 文本塊還支持內置的格式修剪功能,通過去除每行前面的公共空白字符,使文本塊的內容在代碼中更整齊。使用 stripIndent() 方法,可以輕松移除多余的縮進:

      String html = """<html><body><p>Hello, world</p></body></html>""".stripIndent();
      

2.Sealed Classes (預覽特性)

  • 特性: 允許開發者控制哪些類可以擴展或實現它們。

  • 流程:

    public abstract sealed class Shapepermits Circle, Square, Rectangle {}
    
    • sealed 類限制了可以擴展或實現的類,增強了類型系統的安全性和控制。

Java 16 (2021)

1.Records

  • 特性: Records 正式引入。
  • 流程:
    • 之前的預覽特性正式成為 Java 的一部分,提供穩定的數據類定義。

2.instanceof 模式匹配

  • 特性: instanceof 模式匹配正式引入。
  • 流程:
    • instanceof 操作符支持簡化的類型檢查和轉換。

3.Sealed Classes (第二次預覽)

  • 特性: Sealed Classes 進行進一步改進。
  • 流程:
    • 對 Sealed Classes 進行了改進,提供更靈活的類型系統支持。

Java 17 (2021)

1. Sealed Classes

  • 特性: Sealed Classes 正式引入。

    • Sealed Classes 允許在定義類時限制其他類對它的擴展,從而增強了類型系統的表達能力和安全性。
    • 通過控制子類的數量和類型,可以提高代碼的可維護性和安全性,防止不必要的或意外的擴展。
  • 流程:

    • 在聲明一個類時使用 sealed 關鍵字,并在 permits 子句中指定允許擴展該類的子類。例如:

      public sealed class Shape permits Circle, Square {// ...
      }public final class Circle extends Shape {// ...
      }public final class Square extends Shape {// ...
      }
      
    • 這種方式確保了 Shape 類只能被 CircleSquare 這兩個類擴展,其他任何嘗試擴展 Shape 的類都將導致編譯錯誤。

2. 新的 LTS 版本

  • 特性: Java 17 是一個長期支持(LTS)版本。

    • Java 17 提供了更長時間的支持和維護,適用于長期使用的生產環境。這使得企業和開發者可以更安心地使用 Java 17 進行開發,而不用頻繁升級到新版本。
  • 流程:

    • LTS 版本的發布周期通常為每三年一次,這意味著在這期間,LTS 版本將會得到官方的定期更新和安全補丁。
    • 企業可以在這段時間內依賴 Java 17 提供的穩定性和安全性,而不用擔心頻繁的版本變更帶來的兼容性和維護問題。
    • 舉例來說,使用 Java 17 進行項目開發,可以確保在接下來的數年內持續得到官方支持和更新,從而降低了長期的維護成本。

Java 18 (2022)

1.簡化的 UTF-8 編碼

  • 特性: 默認字符編碼變更為 UTF-8。
  • 流程:
    • 所有的 Java 應用程序默認使用 UTF-8 編碼,簡化了國際化應用的開發和處理。

2.Vector API (第二次孵化)

  • 特性: 進一步改進了 Vector API,使得向量計算更加高效。
  • 流程:
    • 提供了對向量計算的支持,優化了數據處理和計算效率。

Java 19 (2022)

1.虛擬線程 (預覽特性)

  • 特性: 提供了輕量級的線程實現,提升了并發處理能力。

  • 流程:

    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {executor.submit(() -> System.out.println("Hello from a virtual thread!"));
    }
    
    • 虛擬線程提供了比傳統線程更輕量級的線程模型,提升了并發性能。

2.外部函數和內存 API (孵化)

  • 特性: 引入了與本地代碼交互的新API。
  • 流程:
    • 新的 API 簡化了 JNI 的使用,提升了與本地代碼交互的效率和安全性。

Java 20 (2023)

1.模式匹配 (繼續預覽)

  • 特性: 進一步改進了模式匹配特性。
  • 流程:
    • 模式匹配功能進行了改進,增強了對復雜數據結構的支持。

2.字符串模板 (孵化)

  • 特性: 簡化了動態字符串的生成。

  • 流程:

    String name = "Alice";
    String greeting = STR."Hello, {name}!";
    
    • 字符串模板提供了簡潔的方式生成動態字符串,提升了代碼的可讀性和安全性。

Java 21 (2023)

1. 虛擬線程 (正式)

  • 特性: 虛擬線程在 Java 22 中正式引入。這是一種新的線程模型,旨在簡化高并發編程。
  • 原理: 虛擬線程是與傳統操作系統線程(平臺線程)不同的一種線程模型。它們由 Java 虛擬機(JVM)管理,而不是由操作系統直接管理。虛擬線程是輕量級的,創建和管理的開銷比平臺線程要小很多。通過將虛擬線程映射到少量的操作系統線程上,Java 可以在單個線程中處理大量的虛擬線程,這有助于提高系統的并發處理能力。
  • 改進:
    • 性能提升: 虛擬線程可以顯著減少線程切換和上下文切換的開銷,使得高并發應用程序的性能得到提升。
    • 簡化編程模型: 使用虛擬線程可以簡化代碼編寫,特別是在處理大量并發任務時,可以減少復雜的線程管理代碼。
    • 提升可伸縮性: 虛擬線程的輕量級特性允許應用程序處理更多的并發任務,而不會像傳統線程那樣消耗大量系統資源。

2. 字符串模板 (預覽)

  • 特性: 字符串模板作為預覽特性繼續優化,提供了動態字符串處理的新功能。
  • 原理: 字符串模板是 Java 中用于生成和處理字符串的強大工具。它允許開發者通過插入變量和表達式來動態生成字符串。模板語法簡潔,支持在字符串中嵌入復雜的表達式。
  • 改進:
    • 功能優化: 在預覽階段,字符串模板的功能進行了多次優化,改進了模板語法和功能,使其更加強大和靈活。
    • 增強的動態字符串處理能力: 通過字符串模板,開發者可以更方便地構造動態內容,減少了手動拼接字符串的復雜性,提高了代碼的可讀性和維護性。
    • 性能優化: 字符串模板的實現得到了優化,生成字符串的性能得到了提升,使得在需要大量動態字符串處理的場景中更加高效。

3. 模式匹配

  • 特性: 模式匹配在 Java 22 中得到了進一步完善,增強了對復雜數據結構的處理能力。
  • 原理: 模式匹配是一種語言特性,用于簡化對對象類型和數據結構的檢查和解構。它允許開發者通過模式匹配語法在一個表達式中進行類型檢查和解構,而不需要編寫復雜的條件語句和類型轉換代碼。
  • 改進:
    • 增強數據結構處理能力: Java 22 中的模式匹配擴展了對復雜數據結構(如記錄和密集數據結構)的支持,使得在處理這些數據結構時更加簡潔和高效。
    • 提高代碼簡潔性和可讀性: 模式匹配使得類型檢查和數據解構的代碼更加簡潔和易于理解,減少了樣板代碼的數量。
    • 改進模式匹配語法: 新版本中對模式匹配語法進行了進一步的優化和完善,使得開發者能夠更直觀地表達匹配邏輯,提高代碼的表達力和可維護性。

Java 22 (2024)

1. 增強的垃圾回收器

ZGC (Z Garbage Collector)
  • 原理: ZGC 是一個低延遲垃圾回收器,旨在最小化垃圾回收的停頓時間。它使用并行和并發的回收策略,通過將堆分為多個區域并使用并發標記和清理過程來減少停頓時間。
  • 改進: 在 Java 22 中,ZGC 的改進可能包括優化標記和回收階段,減少內存碎片,并提高并發處理能力,從而進一步減少應用程序的停頓時間。
G1 垃圾回收器
  • 原理: G1 是一個目標停頓時間的垃圾回收器,它將堆分為多個區域,優先回收垃圾最多的區域。它通過并行和并發回收階段來優化停頓時間。
  • 改進: 在 Java 22 中,G1 的優化可能包括改進區域選擇算法、提升并發標記和整理階段的性能,從而減少停頓時間并提高整體性能。

2. 持續改進的外部函數和內存 API

  • 原理: 外部函數和內存 API 允許 Java 程序直接與本地代碼(如 C/C++)進行交互,以及管理內存(如分配和釋放)。它們提供了一種比 JNI 更高效、更安全的方式來訪問本地代碼和內存。
  • 改進: 在 Java 22 中,外部函數和內存 API 的改進可能包括提高訪問本地代碼和內存的效率,減少內存泄漏的風險,簡化 API 的使用,使得與本地代碼的交互更加安全和高效。

3. 新的編譯器優化

  • 原理: 編譯器優化包括多種技術,如優化代碼生成、內聯函數、循環優化等,旨在提高生成代碼的執行效率。優化的目標是減少運行時開銷,提高程序的整體性能。
  • 改進: 在 Java 22 中,新的編譯器優化技術可能包括改進代碼生成策略、提升內聯優化的效果、減少冗余計算、以及更好地利用現代 CPU 特性(如 SIMD 指令集)。這些優化有助于提高 Java 程序的執行速度和響應能力。

總結

? 從Java 8到Java 22,Java引入了眾多新特性和改進,極大地提升了開發效率和性能。Lambda表達式、Stream API、模塊系統、虛擬線程、字符串模板等特性,使Java在現代開發中依然保持著強大的競爭力。希望本文能幫助開發者更好地理解和利用這些新特性,在實際項目中充分發揮它們的優勢。

附錄

Java新特性的引入過程通常遵循一個逐步成熟的路徑,從最初的概念提出到最終成為穩定的標準特性。以下是對這些概念的詳細解釋及其在Java發展中的作用:

  1. 預覽特性
    • 定義: 預覽特性是在Java開發周期中首次以實驗形式推出的特性。這些特性可能尚未完全成熟,存在缺陷或不確定行為,需要通過社區的反饋來完善設計。
    • 目的: 收集開發者和用戶的反饋,幫助開發團隊調整和改進特性,確保其符合需求和期望。
    • 示例: Java 14中的Switch表達式,最初以預覽特性形式推出,隨后在后續版本中成為正式特性。
  2. 繼續預覽
    • 定義: 當一個預覽特性在當前版本中繼續保留預覽狀態,表明該特性需要更多時間來收集反饋和進行改進。
    • 目的: 給予更多時間來確保特性的穩定性和實用性,避免匆忙將其標準化可能帶來的問題。
    • 示例: Java 20中模式匹配的繼續預覽,說明該特性仍在進行優化和調整。
  3. 孵化
    • 定義: 孵化特性是處于早期開發階段的新功能,可能存在不穩定性或不完整性,其主要目標是獲取社區的反饋和測試。
    • 目的: 評估特性的可行性和實用性,決定是否應進一步開發或放棄。
    • 示例: Java 19中外部函數和內存API的孵化,表明這些功能正在探索中,未來可能有重大變化。
  4. 第二次孵化
    • 定義: 特性在經歷了第一次孵化后,再次進入孵化階段,意味著需要進一步測試和改進,以確保其質量和實用性。
    • 目的: 完善特性,解決前一階段中發現的問題,增加其成熟度。
    • 示例: Java 18中Vector API的第二次孵化,顯示了對特性的深入開發和改進。
  5. 正式
    • 定義: 正式特性是經過充分測試和社區反饋后,達到穩定狀態的特性,被正式納入Java標準中。
    • 目的: 提供穩定可靠的特性供開發者在生產環境中使用,保證代碼的穩定性和兼容性。
    • 示例: Java 21中虛擬線程的正式引入,標志著該特性經過多個版本的預覽和孵化后,已成為穩定的標準特性。

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

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

相關文章

SQL 之 concat_ws和concat的區別

concat_ws和concat都是用于連接字符串的函數&#xff0c;但它們在使用上有一些區別&#xff1a; 一、concat、concat_ws函數格式&#xff1a; concat格式&#xff1a; concat&#xff08;參數1,參數2,…參數n&#xff09;&#xff0c;如果要加’分隔符’直接寫在 各參數中間就…

關于微信支付-商戶平臺:查詢訂單提示“查詢失敗:操作失敗,請稍候重試”的分析

目錄 引子 分析 應對 小結 引子 在開發和實施微信 JSAPI 支付的應用后&#xff0c;我們遇到了一些問題&#xff0c;訂單的狀態更新不正常&#xff0c;當然我們首先需要從自身尋找原因和完善解決問題的辦法和方案。在支付的過程中&#xff0c;客戶會給我們一些反饋&#xf…

Open-Sora1.2環境搭建推理測試

引子 前陣子寫了一篇Open-Sora1.0環境搭建&推理測試&#xff08;Open-Sora1.0環境搭建&推理測試_自己搭建sora服務-CSDN博客&#xff0c;感興趣的童鞋&#xff0c;請移步&#xff09;。Open-Sora1.1發布的時候&#xff0c;撇了一眼新聞。后面一轉頭&#xff0c;忘記這…

ARL聯動AWVS實現自動化漏洞掃描

0x01 前言 很多場景下需要大范圍的掃描漏洞和快速排查互聯網暴露面的漏洞&#xff0c;需要使用這種自動化的手段&#xff0c;常規滲透測試的找互聯網暴露面是&#xff0c;域名>子域名>IP>C段>端口&#xff0c;可以手動收集&#xff0c;也可以借助一些網絡搜索引擎…

css中偽元素 :: before的用法

在CSS中&#xff0c;偽元素 ::before 用于在選定元素的內容前插入內容。它常用于添加圖標、文本或裝飾性的元素&#xff0c;而不需要在HTML中實際添加額外的標簽。 以下是一個示例說明 ::before 的用法&#xff1a; <!DOCTYPE html> <html lang"en"> &…

一文解決Postman請求發送難題

標題&#xff1a;【技術深度解析】一文解決Postman請求發送難題 在API開發和測試過程中&#xff0c;Postman作為一款強大的工具&#xff0c;其重要性不言而喻。然而&#xff0c;開發者們時常會遇到Postman無法發送請求的問題&#xff0c;這無疑會嚴重影響開發進度和測試效率。…

wordpress網站添加一個臨時維護功能

把以下代碼放到functions.php文件中&#xff0c;主要用網站臨時維護或者用于備案。事情做好了&#xff0c;把以下代碼刪除即可&#xff01;&#xff01;&#xff01; 有時遇到一些情況&#xff0c;比如站點需要閉站備案、或者被要求停站等等&#xff0c;我們就可以使用本文的功…

開發個人Go-ChatGPT--5 模型管理 (三)

開發個人Go-ChatGPT–5 模型管理 (三) 服務部署 go-ChatGPT項目涉及的中間件服務較多&#xff0c;以下部署文件目錄&#xff1a; |-- chat-api | |-- etc | | -- config.yaml | -- logs |-- chat-rpc | |-- etc | | -- config.yaml | -- logs |-- docker-co…

CP AUTOSAR標準之UDPNetworkManagement(AUTOSAR_CP_SWS_UDPNetworkManagement)(更新中……)

1 簡介和功能概述 本文檔介紹了AUTOSAR UDP網絡管理(UdpNm)的概念、核心功能、可選功能、接口和配置問題。UdpNm旨在成為一項可選功能。它旨在與TCP/IP堆棧協同工作,獨立于所用通信系統的物理層。AUTOSAR UDP網絡管理是一種獨立于硬件的協議,可用于基于TCP/IP的系統(有關限制…

卡爾曼濾波Q和R怎么調

卡爾曼濾波器是一種有效的估計算法&#xff0c;主要用于在存在噪聲的環境中估計動態系統的狀態。它通過結合預測模型&#xff08;系統動態&#xff09;和觀測數據&#xff08;包括噪聲&#xff09;來實現這一點。在卡爾曼濾波中&#xff0c;調整過程噪聲協方差矩陣 ( Q ) 和測量…

Java中的標準輸入流簡述

System.in簡介 System.in 是標準輸入流&#xff0c;通常與鍵盤輸入相關聯。它是 InputStream 類型的對象&#xff0c;Java 使用它來從控制臺接收用戶輸入。在 Java 程序中&#xff0c;通常使用 Scanner 類來讀取 System.in 的輸入。 以下是一些關鍵點&#xff0c;解釋為什么需…

Kubernetes運維工程師必備:K8s 基礎面試題精編(一)

Kubernetes運維工程師必備:K8s 基礎面試題精編(一) 1. 什么是Kubernetes?2. Kubernetes如何實現容器編排?3. 說出k8s的常見資源對象?4. 什么是pod?5. Deployment介紹及使用?6. statefulesets介紹及使用?7. statefulesets和deployment區別?8. 什么是調度器(Scheduler…

The First項目報告:NvirWorld與區塊鏈游戲的未來

根據官方公告&#xff0c;The Fisrt現貨區將于2024年7月2日16:00上架NVIR/USDT交易對&#xff0c;NVIR是NvirWorld平臺的原生代幣。作為一個去中心化解決方案&#xff0c;NvirWorld為開發者提供了一個簡化且適應性強的環境&#xff0c;旨在通過優化的擴展解決方案來降低交易成本…

docker 本地部署大模型(ollama)

docker 安裝 ollama docker search ollama docker pull ollama/ollama###docker下載ollama部署 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama### 下載模型 docker exec -it ollama ollama pull llama3### 交互式運行模型docker exec -i…

ECharts 最小高度設置指南

下面提供一份關于ECharts中設置最小高度的專業而詳細的文檔。這份文檔將涵蓋不同圖表類型的最小高度設置方法&#xff0c;適合初學者學習和參考。 ECharts 最小高度設置指南 1. 通用屬性 對于大多數圖表類型&#xff0c;可以使用以下通用屬性來控制最小高度&#xff1a; 1.…

算法 —— 二分查找

目錄 二分查找 在排序數組中查找元素的第一個和最后一個位置 搜索插入位置 x的平方根 山峰數組的峰頂索引 尋找峰值 搜索旋轉排序數組中的最?值 點名 二分查找模板分為三種&#xff1a;1、樸素的二分模板 2、查找左邊界的二分模板 3、查找右邊界的二分模板&#xf…

【基于R語言群體遺傳學】-12-超顯性與次顯性

歡迎先看前面的博客&#xff0c;再繼續進行后面的內容&#xff1a; 群體遺傳學_tRNA做科研的博客-CSDN博客 當雜合子的適應度超出純合子的范圍時&#xff0c;二倍體能夠展現出更多令人著迷的選擇實例。這種形式的一種是雜合子優勢&#xff0c;或稱為“超顯性”&#xff0c;其…

【包郵送書】AIGC時代程序員的躍遷——編程高手的密碼武器

歡迎關注博主 Mindtechnist 或加入【智能科技社區】一起學習和分享Linux、C、C、Python、Matlab&#xff0c;機器人運動控制、多機器人協作&#xff0c;智能優化算法&#xff0c;濾波估計、多傳感器信息融合&#xff0c;機器學習&#xff0c;人工智能等相關領域的知識和技術。關…

深入了解 Huber 損失函數

深入了解 Huber 損失函數 在機器學習和深度學習的訓練過程中&#xff0c;選擇合適的損失函數對于模型性能的提升至關重要。MSE&#xff08;均方誤差&#xff09; 和 RMSE&#xff08;均方根誤差&#xff09; 是我們常見的回歸損失函數。然而&#xff0c;當數據中存在異常值&am…

無線麥克風哪個品牌音質最好,揭秘手機收音麥克風哪個牌子好!

隨著全球直播和短視頻行業的蓬勃發展&#xff0c;領夾麥克風因其便攜性和出色的錄音質量而備受青睞。用戶在各種場合下追求清晰、真實的錄音效果&#xff0c;領夾麥克風無疑是一個理想的選擇。 然而&#xff0c;面對市場上琳瑯滿目的品牌和型號&#xff0c;想要挑選一款性能優…