首頁  >  文章  >  Java  >  為什麼創建`CaseInsensitiveString`物件時需要使用`new`而不是`String`物件?

為什麼創建`CaseInsensitiveString`物件時需要使用`new`而不是`String`物件?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-13 08:23:02763瀏覽

Why is it necessary to use `new` when creating a `CaseInsensitiveString` object but not a `String` object?

在Java 中建立字串:「String s = new String("silly")」的情況

在Java 中建立字元串時,了解String 類別的行為至關重要。與 Java 中的許多其他類別不同,字串文字會自動建立 String 對象,而不需要 new 關鍵字。但是,明確不鼓勵使用 new 運算子建立新的 String 對象,因為它可能會導致不必要的記憶體消耗。

為了說明這一點,請考慮以下程式碼:

String s = "No longer silly";

在此在這種情況下,文字「不再愚蠢」被直接分配給s 變量,從而創建單個String對象。但是,以下程式碼片段:

String s = new String("silly");

建立了一個不必要的附加 String 物件。為了避免這種情況,建議盡可能使用文字賦值,如第一個範例所示。

但是,在某些情況下可能需要動態建立 String 物件。例如,考慮以下類別:

public final class CaseInsensitiveString {
    private String s;
    
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
}

在這種情況下:

  1. 為什麼第一語句可以?不是應該是 CaseInsensitiveString cis = "Polish"; 嗎?
    第一個語句 CaseInsensitiveString cis = new CaseInsensitiveString("Polish"); 是正確的。雖然通常建議對 String 物件使用文字賦值,但此規則不適用於其他類別的對象,例如 CaseInsensitiveString。在這種情況下,必須使用 new 關鍵字來建立 CaseInsensitiveString 類別的新實例。
  2. 如何讓 CaseInsensitiveString 表現得像 String,以便上述語句可以(無論是否擴充 String)? String 有何特色使得可以傳遞這樣的文字給其?據我了解,Java 中沒有「複製構造函數」概念?
    Java 中的 String 類別與其他類別相比具有獨特的行為。具體來說,文字會隱式轉換為 String 對象,因此無需明確建構。這允許像 String s = "Polish"; 這樣的語句不呼叫 new 運算子。 Java 中沒有等效的「複製建構子」概念。相反,String 類別提供了不變性和一個預先定義的建構函數,該構造函數接受字元序列(例如文字字串)來建立新的 String 物件。

以上是為什麼創建`CaseInsensitiveString`物件時需要使用`new`而不是`String`物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn