Heim > Java > javaLernprogramm > Warum ist es notwendig, „new' zu verwenden, wenn ein „CaseInsensitiveString'-Objekt erstellt wird, aber kein „String'-Objekt?

Warum ist es notwendig, „new' zu verwenden, wenn ein „CaseInsensitiveString'-Objekt erstellt wird, aber kein „String'-Objekt?

Mary-Kate Olsen
Freigeben: 2024-11-13 08:23:02
Original
818 Leute haben es durchsucht

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

Erstellen von Strings in Java: Der Fall von „String s = new String(“silly“)

Beim Erstellen von Strings in Java Es ist wichtig, das Verhalten der String-Klasse zu verstehen. Im Gegensatz zu vielen anderen Klassen in Java erstellen String-Literale automatisch String-Objekte, ohne dass das Schlüsselwort new erforderlich ist. Vom Erstellen eines neuen String-Objekts mit dem new-Operator wird jedoch ausdrücklich abgeraten, da dies zu unnötigem Speicherverbrauch führen kann.

Um dies zu veranschaulichen, betrachten Sie den folgenden Code:

String s = "No longer silly";
Nach dem Login kopieren

In this In diesem Fall wird das Literal „Nicht mehr albern“ direkt der s-Variablen zugewiesen, wodurch ein einzelnes String-Objekt erstellt wird. Der folgende Codeausschnitt:

String s = new String("silly");
Nach dem Login kopieren

erstellt jedoch ein unnötiges zusätzliches String-Objekt. Um dies zu vermeiden, wird empfohlen, wann immer möglich die Literalzuweisung zu verwenden, wie im ersten Beispiel gezeigt.

Es kann jedoch Situationen geben, in denen es erforderlich ist, String-Objekte dynamisch zu erstellen. Betrachten Sie zum Beispiel die folgende Klasse:

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

In diesem Szenario:

  1. Warum ist die erste Aussage in Ordnung? Sollte es nicht CaseInsensitiveString cis = "Polish"; lauten?
    Die erste Anweisung, CaseInsensitiveString cis = new CaseInsensitiveString("Polish");, ist korrekt. Während allgemein empfohlen wird, für String-Objekte die Literalzuweisung zu verwenden, gilt diese Regel nicht für Objekte anderer Klassen, wie z. B. CaseInsensitiveString. In diesem Fall ist das neue Schlüsselwort erforderlich, um eine neue Instanz der CaseInsensitiveString-Klasse zu erstellen.
  2. Wie sorge ich dafür, dass sich CaseInsensitiveString wie String verhält, sodass die obige Anweisung in Ordnung ist (mit und ohne String-Erweiterung)? Was macht es an String so, dass man ihm einfach ein solches Literal übergeben kann? Soweit ich weiß, gibt es in Java kein „Kopierkonstruktor“-Konzept?
    Die String-Klasse in Java weist im Vergleich zu anderen Klassen ein einzigartiges Verhalten auf. Insbesondere werden Literale implizit in String-Objekte konvertiert, sodass keine explizite Konstruktion erforderlich ist. Dies ermöglicht Anweisungen wie String s = "Polish"; ohne den neuen Operator aufzurufen. In Java gibt es kein entsprechendes „Kopierkonstruktor“-Konzept. Stattdessen bietet die String-Klasse Unveränderlichkeit und einen vordefinierten Konstruktor, der eine Zeichenfolge, beispielsweise eine Literalzeichenfolge, akzeptiert, um ein neues String-Objekt zu erstellen.

Das obige ist der detaillierte Inhalt vonWarum ist es notwendig, „new' zu verwenden, wenn ein „CaseInsensitiveString'-Objekt erstellt wird, aber kein „String'-Objekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage