88 Stimmen

Java-Zeichenfolgen: "String s = new String("albern");"

Ich bin ein C++-Typ, der Java lernt. Ich lese Effective Java und etwas hat mich verwirrt. Es sagt, man solle niemals Code wie diesen schreiben:

String s = new String("silly");

Da es unnötige String-Objekte erstellt. Stattdessen sollte es so geschrieben werden:

String s = "Nicht mehr albern";

Ok bis hierher ... Aber, gegeben diese Klasse:

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

CaseInsensitiveString cis = new CaseInsensitiveString("Polnisch");
String s = "polnisch";
  1. Warum ist die erste Aussage in Ordnung? Sollte es nicht sein

    CaseInsensitiveString cis = "Polnisch";

  2. Wie mache ich CaseInsensitiveString so, dass es sich wie String verhält, damit die obige Aussage in Ordnung ist (mit und ohne Erweiterung von String)? Was macht String zu etwas, das es erlaubt, einfach einen Literal zu übergeben? Nach meinem Verständnis gibt es kein Konzept des "Kopierkonstruktors" in Java?

2 Stimmen

String str1 = "foo"; String str2 = "foo"; Beide str1 und str2 gehören zum selben String-Objekt, "foo", da Java Strings im StringPool verwaltet, sodass eine neue Variable auf denselben String verweist und nicht einen anderen erstellt, sondern den bereits im StringPool vorhandenen zuweist. Aber wenn wir dies tun: String str1 = new String("foo"); String str2 = new String("foo"); Hier gehören sowohl str1 als auch str2 zu verschiedenen Objekten, da new String() zwangsläufig ein neues String-Objekt erstellt.

0voto

PhiLho Punkte 39496

Ich würde einfach hinzufügen, dass Java Kopierkonstruktoren hat...

Nun, das ist ein gewöhnlicher Konstruktor mit einem Objekt des gleichen Typs als Argument.

2 Stimmen

Es handelt sich um ein Designmuster, nicht um eine Sprachkonstruktion. Bei Java gibt es nur sehr wenige Anwendungen, bei denen ein Kopierkonstruktor interessant wäre, da immer alles "per Referenz" übergeben wird und jedes Objekt nur eine Kopie hat. Tatsächlich würden Kopien wirklich viele Probleme verursachen.

0voto

Zunächst kann man keine Klasse erstellen, die von String abgeleitet ist, da String eine finale Klasse ist. Und Java behandelt Strings anders als andere Klassen, daher kann man dies nur mit String machen

String s = "Polish";

Aber mit Ihrer Klasse müssen Sie den Konstruktor aufrufen. Daher ist dieser Code in Ordnung.

0voto

Tolga E Punkte 11468

Schnur ist eine der speziellen Klassen, in denen Sie sie ohne den neuen Sring-Teil erstellen können

es ist dasselbe wie

int x = y;

oder

char c;

0voto

Darron Punkte 20861

In Java erzeugt die Syntax "text" eine Instanz der Klasse java.lang.String. Die Zuweisung:

String foo = "text";

ist eine einfache Zuweisung, ohne dass ein Kopierkonstruktor benötigt wird.

MyString bar = "text";

ist illegal, egal was man macht, weil die Klasse MyString weder java.lang.String noch eine Oberklasse von java.lang.String ist.

0voto

Akash5288 Punkte 1821
 String str1 = "foo"; 
 String str2 = "foo"; 

Sowohl str1 als auch str2 gehören zum gleichen String-Objekt, "foo", weil Java Strings im StringPool verwaltet, sodass wenn eine neue Variable auf denselben String verweist, nicht ein neues erstellt wird, sondern der bereits im StringPool vorhandene zugewiesen wird.

 String str1 = new String("foo"); 
 String str2 = new String("foo");

Hier gehören sowohl str1 als auch str2 zu verschiedenen Objekten, da new String() zwangsläufig ein neues String-Objekt erstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X