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.

-1voto

Ewan Makepeace Punkte 5308

In den meisten Versionen des JDK werden die beiden Versionen gleich sein:

String s = new String("silly");

String s = "Nicht mehr albern";

Da Strings unveränderlich sind, pflegt der Compiler eine Liste von String-Konstanten, und wenn Sie versuchen, eine neue zu erstellen, wird zuerst überprüft, ob der String bereits definiert ist. Wenn ja, wird eine Referenz auf den vorhandenen unveränderlichen String zurückgegeben.

Zur Klarstellung - wenn Sie "String s =" sagen, definieren Sie eine neue Variable, die Platz auf dem Stack einnimmt - dann passiert genau dasselbe, egal ob Sie "Nicht mehr albern" oder new String("albern") sagen - ein neuer konstanter String wird in Ihre Anwendung kompiliert und die Referenz zeigt darauf.

Ich sehe hier keinen Unterschied. Für Ihre eigene Klasse, die nicht unveränderlich ist, ist dieses Verhalten jedoch irrelevant, und Sie müssen Ihren Konstruktor aufrufen.

UPDATE: Ich lag falsch! Ich habe dies getestet und festgestellt, dass mein Verständnis falsch ist - new String("silly") erstellt tatsächlich einen neuen String, anstatt den vorhandenen wiederzuverwenden. Ich bin unklar, warum das so wäre (was ist der Nutzen?), aber der Code spricht lauter als Worte!

-1voto

user1945649 Punkte 35

Es ist ein grundlegendes Gesetz, dass Strings in Java unveränderlich und Groß-/Kleinschreibung beachten.

-1voto

Java erstellt ein String-Objekt für jedes Zeichenliteral, das Sie in Ihrem Code verwenden. Jedes Mal, wenn "" verwendet wird, entspricht dies dem Aufruf von new String().

Strings sind komplexe Daten, die sich nur "wie" primitive Daten verhalten. String-Literale sind tatsächlich Objekte, obwohl wir vorgeben, dass es sich um primitive Literale handelt, wie z.B. 6, 6.0, 'c', usw. Das String-"Literal" "text" gibt also ein neues String-Objekt mit dem Wert char[] value = {'t','e','x','t'} zurück. Daher ist der Aufruf von

new String("text"); 

eigentlich ähnlich wie der Aufruf von

new String(new String(new char[]{'t','e','x','t'}));

Von hier aus können Sie hoffentlich nachvollziehen, warum Ihr Lehrbuch dies als überflüssig betrachtet.

Zur Referenz finden Sie hier die Implementierung von String: http://www.docjar.com/html/api/java/lang/String.java.html

Es macht Spaß zu lesen und könnte zu einigen Erkenntnissen inspirieren. Es ist auch großartig für Anfänger zum Lesen und Verstehen, da der Code sehr professionell und den Konventionen entsprechend ist.

Eine weitere gute Referenz ist das Java-Tutorial zu Strings: http://docs.oracle.com/javase/tutorial/java/data/strings.html

0 Stimmen

Jedes Mal, wenn "" verwendet wird, handelt es sich um eine Referenz auf den gleichen String im Konstanten-Pool.

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