Erste Schritte Vergleich der String-Objekte

jackochan

Mitglied
Java:
public class Testclass {
	
  public static void main ( String[] args ) {
    String ersteswort; 
    ersteswort= new String();
    ersteswort = "Hallo";
    String zweiteswort; 
    zweiteswort = new String();
    zweiteswort = "Hallo"; 			  
			  			  	  
    if (ersteswort == zweiteswort){
      System.out.println("Wir haben die gleichen Referenzen");
				  			  }
    else{
      System.out.println("Wir haben unterschiedliche Referenzen");
    }
			  
    if ( ersteswort.equals(zweiteswort)){
      System.out.println("Unsere String-Objekt-Inhalte sind gleich");
    }
    else{
      System.out.println("Unsere String-Objekt-Inhalte sind nicht gleich");
    }
  }
}

Ich dachte, für "ersteswort" und "zweiteswort" werden zwei unterschiedliche Objekte auf dem Heap erzeugt (mit gleichem Inhalt).
Demzufolge hätte der Vergleich "ersteswort == Zweiteswort" -> "false" liefern müssen, da sie auf unterschiedliche Objekte referenzieren.
Leider bekomme ich folgende Antwort... why?
Code:
Wir haben die gleichen Referenzen
Unsere String-Objekt-Inhalte sind gleich
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Nein, das ist nicht ganz richtig.
Es gibt intern noch einen Stringpool. Für den String "Hallo" wird ein String erzeugt der im Stringpool liegt, deine beiden Referenzen ersteswort und zweiteswort zeigen damit auf den selben String.

Java:
			  ersteswort= new String();
			  ersteswort = "Hallo";
Das ist übrigens sinnlos, die Zuweisung
Code:
new String();
hat kein Gewicht, weil sie direkt wieder überschrieben wird. Oder meinst du sowas :
Java:
erstesWort = new String("Hallo");
zweiteswort = new String("Hallo");
Dann hast du tatsächlich errreicht dass
Code:
erstesWort == zweitesWort
false ergibt.
 

HimBromBeere

Top Contributor
Nur mal so nebenbei, wie sieht es denn dann hiermit aus (hab grade nichts zum Testen da, sonst hätt ich das fix erledigt):
Java:
String str1 = "Hallo";
String str2 = "Hallo";
sysout(str1 == str2);
 
G

Gast2

Gast
Das ist doch der selben Code den jackochan probiert hat?! Ergebnis ist true, daran ändert sich nichts.
 

jackochan

Mitglied
Acsho, das mit dem Stringpool wusste ich nicht.
Dachte Strings werden genau so behandelt wie "Objekte" bzw. sind Objekte der Klasse "String".
Wollte mit dem Ausdruck:
Code:
  String ersteswort; 
  ersteswort= new String();
  ersteswort = "Hallo";
explizit darauf hinweisen, dass Strings genau wie Objekte erzeugt werden und dass das gleiche ist wie
Code:
String ersteswort = "Hallo"

Aber anscheinend stimmt das ja nicht. Und das Ergebnis vom Referenzvergleich liefert auch was anders.
Deine Antwor mit "Stringpool" stellt meine ganzen String-Vorstellungen auf dem Kopf.
Das ist übrigens sinnlos, die Zuweisung new String(); hat kein Gewicht, weil sie direkt wieder überschrieben wird. Oder meinst du sowas :

Kannst du mir vllt. erklären was ich hier überschrieben habe??
Code:
 String ersteswort;             // deklareation der Variablennamn für Stringtypen
 ersteswort= new String();  // Es wird ein String Objekt erzeugt und der Variable ersteswort zugewiesen
 ersteswort = "Hallo";         // Inhalt des referenzienten Objekts mit "Hallo" füllen
 
G

Gast2

Gast
Kannst du mir vllt. erklären was ich hier überschrieben habe??
folgendes wäre das gleich:
Java:
int i;
i = 3;
i = 4;
i = 5;
i = 6;
am Ende ist i immer 6, die vorherigen Zuweisungen sind irrelevant. Das selbe machst du mit deinen Strings.

Dachte Strings werden genau so behandelt wie "Objekte" bzw. sind Objekte der Klasse "String".
Ja, ist richtig. Nur dass eben noch ein Pool von Strings verwaltet wird. Stell dir vor du hast in deinem Quellcode sehr viele "" oder " " stehen. Da wärs ja quatsch für jeden solchen String ne eigene Instanz zu haben. Das wird dann durch den String pool optimiert.
Ne weitere Besonderheit ist, dass du Strings nicht explizit per new erzeugen musst:
Code:
String s = "Test";
 

xehpuk

Top Contributor
Code:
 String ersteswort;             // deklareation der Variablennamn für Stringtypen
 ersteswort= new String();  // Es wird ein String Objekt erzeugt und der Variable ersteswort zugewiesen
 ersteswort = "Hallo";         // Inhalt des referenzienten Objekts mit "Hallo" füllen
Die letzte Zeile stimmt nicht. Mit einer Zuweisung rührst du das Objekt, das hinter der Variable steckt, nicht an. Stattdessen wird die Referenz auf das neu zugewiesene Objekt umgeleitet. Das alte Objekt wird nun einfach nicht mehr von dieser Variable referenziert.
 

jackochan

Mitglied
Ja, das stimmt....wär echt nicht logisch für jeden String ein Objekt zu erzeugen.

Die letzte Zeile stimmt nicht. Mit einer Zuweisung rührst du das Objekt, das hinter der Variable steckt, nicht an. Stattdessen wird die Referenz auf das neu zugewiesene Objekt umgeleitet. Das alte Objekt wird nun einfach nicht mehr von dieser Variable referenziert

Verstehe...! Das alte Stringobjekt , das ich mit
Code:
new String ()
erzeugt habe wird mit der neuen Zuweisung
Code:
ersteswort = "Hallo"
futter für Garbage Collector.
Okay, muss die Strings noh genauer unter die Lupe nehmen...Danke :)
 
B

bygones

Gast
als Zusatzinfos:

zb bei Integer und Boolean ist es aehnlich. Letzteres sollte man immer per
Code:
Boolean.TRUE
bzw
Code:
Boolean.FALSE
nutzen, nicht
Code:
new Boolean
- da gepoolt.
Bei Integer sollte man auch
Code:
Integer.valueOf(x)
und nicht
Code:
new Integer(x)
nehmen, da (manche) Zahlen gepoolt werden.
 

jackochan

Mitglied
Okay.. also Strings werden im "Stringpool" gespeichert, wenn sie mit dem Befehl
Code:
String wort = "Hallo";
erzeugt werden.

Werden sie dagegen mit dem Befehl
Code:
 String wort = new String("Hallo");
erzeugt , werden tatsächlich neue Objekte für jeden so erzeugten String auf dem (Garbage Collector) Heap erstellt.

Diese Befehle sind unterschiedlich. Ich dachte immer, dass der Letzterer einfach eine Kurzschreibweise des ersten Befehls sei. Aber so ist es nicht!!

Code:
String ersteswort = new String("Hallo");
String zweiteswort = new String("Hallo");
boolean test = (ersteswort == zweiteswort)   // Ergebnis: FALSE

Code:
String ersteswort = "Hallo";
String zweiteswort = "Hallo";
boolean test = (ersteswort == zweiteswort)   // Ergebnis: TRUE

Hier ist das gut erklärt
Der Stringpool - Java als erste Programmiersprache - Javaschublade
 

musiKk

Top Contributor
Wenn wir schon beim Thema Lernen sind:

Man kann auch bei dynamischen Strings erzwingen, dass sie in den Pool wandern (bzw. aus diesem genommen werden, falls schon existent). Das geht per [c]String#intern()[/c]:

Java:
public class Test {

    public static void main(String[] args) throws Exception {

        System.err.println((new Ha() + "llo") == "Hallo");
        System.err.println((new Ha() + "llo").intern() == "Hallo");

    }

    static class Ha {
        @Override
        public String toString() {
            return "Ha";
        }
    }

}

gibt

Code:
false
true

(Den Umweg mit der extra Klasse bin ich gegangen, weil der Compiler das sonst schon optimiert und der Effekt nicht erkennbar ist.)
 

Andreas29

Bekanntes Mitglied
Hi,

ich denke das es wichtig ist zu erwähnen das Strings immutable sind. Also unveränderlich. Dies bedeutet, dass jede Operation, die einen String verändert, einen neuen String liefert. Nur dadurch ist es möglich die Strings zu poolen. Ansonsten würde es zu unabsehrbaren Nebenwirkungen kommen, wenn sich im programmteil eins ein Steingut ändert u dies auf mal Auswirkungen auf ganz andere Programmteile hat.

Grüße,
Andreas
 

California

Aktives Mitglied
Was alle hier vergessen haben:

Strings können nur mit .equals verglichen werden!

also auf Gleichheit:
Code:
 if (text1.equals( text2 )) {...
oder Ungleich:
Code:
 if (!text1.equals( text2 )) {...

== vergleicht die Adressen der Strings und würde damit sagen, dass text1 identisch (heisst an derselben Speicheradresse stehend) mit text2 ist, und das ist in der Praxis leider meistens wertlos :-D

Falls Du wissen willst, ob ein String grösser / kleiner / auch gleich einem anderen ist, musst du compareTo nehmen:
Code:
 if (text1.compareTo( text2 ) > 0) { // text2 ist grösser als text1 ...

..äähm, korrekt heisst es "kommt bei Vergleich der Unicodes lexikographisch nach text1" statt "grösser als"...
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Was alle hier vergessen haben:

Strings können nur mit .equals verglichen werden!
Einfach mal richtig lesen, California, der erste Beitrag von EikeB sagt dir, warum.

Im Zweifelsfall probier das Folgende aus:
Java:
String s1 = "Hallo";
String s2 = "Hallo";
System.out.println(s1 == s2);

War für mich aber auch neu...
Was lernen wir daraus? Immer alle Beiträge durchlesen :D
 

California

Aktives Mitglied
Genau das habe ich geschrieben. Deine beiden Hallos sind IDENTISCH, weil der Compiler die Konstante nur einmal ablegt.
Deshalb haben sie auch die gleiche Adresse. Wenn der Compiler die Konstanten anders implementiert, zum Beispiel nicht platzoptimiert, ist es mit dem == wieder Essig.

Stringvergleiche mit == sind und bleiben Quatsch.

Und die Ausnutzung eines systeminternen (damit von der JVM - Implementierung abhängigen) Mechanismus in realen Programmen ist höchst fragwürdig.
 
B

bygones

Gast
wo er aber dennoch recht hat ist, dass man sich nicht auf den StringPool verlassen sollte und denken "naja, dann kann ich ja Strings per == vergleichen". Strings sind Objekte und daher sollte man auf Gleichheit NUR mit equals vergleichen. Wenn man auf Identitaet vergleichen will, dann kann man == nehmen.

Also - immer mit equals nehmen und den Stringpool zwar wissen, aber nicht sich darauf verlassen.
 

California

Aktives Mitglied
wo er aber dennoch recht hat ist, dass man sich nicht auf den StringPool verlassen sollte und denken "naja, dann kann ich ja Strings per == vergleichen". Strings sind Objekte und daher sollte man auf Gleichheit NUR mit equals vergleichen. Wenn man auf Identitaet vergleichen will, dann kann man == nehmen.

Also - immer mit equals nehmen und den Stringpool zwar wissen, aber nicht sich darauf verlassen.

Genau. Bitte auch daran denken, dass wir im Anfängerforum sind. Der ganze Thread gehört eher unter "Java- Philosphie für Fortgeschrittene...". Irgendeiner nimmt das wörtlich.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C String Objekte Vergleich je nach Instanzierung unterschiedlich!!?!! Java Basics - Anfänger-Themen 4
B String vergleich Java Basics - Anfänger-Themen 3
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
T Input/Output String-Vergleich schlägt fehl Java Basics - Anfänger-Themen 7
M String-Vergleich und NullPointerException Java Basics - Anfänger-Themen 4
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
P String-Vergleich Java Basics - Anfänger-Themen 3
R String-Vergleich Java Basics - Anfänger-Themen 15
P Erste Schritte vergleich substring und string Java Basics - Anfänger-Themen 4
Y Java Programm URL und String Vergleich! Java Basics - Anfänger-Themen 4
S String Vergleich funktioniert nicht Java Basics - Anfänger-Themen 3
A String-Vergleich geht nicht Java Basics - Anfänger-Themen 2
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
L Problem String-Vergleich Java Basics - Anfänger-Themen 2
Y Datentypen String vergleich Java Basics - Anfänger-Themen 3
S String Vergleich mit Passwort geht nur bei Zahlen ? Java Basics - Anfänger-Themen 7
G Komplizierterer String Vergleich Java Basics - Anfänger-Themen 10
G String-Vergleich: Was ist besser "equals()" oder & Java Basics - Anfänger-Themen 4
S String Vergleich. Java Basics - Anfänger-Themen 4
G exception bei String-Vergleich Java Basics - Anfänger-Themen 3
S Vergleich String Java Basics - Anfänger-Themen 4
M Vergleich von String mit String bzw. Stringkonstante Java Basics - Anfänger-Themen 2
N String Vergleich!!! Java Basics - Anfänger-Themen 9
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
Zeppi Vergleich von Array-Inhalten Java Basics - Anfänger-Themen 14
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
W Vergleich von DatenPaketen Java Basics - Anfänger-Themen 6
K File-Name Vergleich Java Basics - Anfänger-Themen 2
V Fließkommazahlen Vergleich Java Basics - Anfänger-Themen 7
J Vergleich Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
T Vergleich und Ausgabe von Zahlen Java Basics - Anfänger-Themen 1
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
J Fehler bei Vergleich auf den grössten Wert Java Basics - Anfänger-Themen 2
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
W Konvertierung und Vergleich unterschiedlicher Zeitformate Java Basics - Anfänger-Themen 11
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L PW-Vergleich Java Basics - Anfänger-Themen 5
S Vergleich von Listen Java Basics - Anfänger-Themen 6
J vergleich von arrays (benötige Hilfe/Denkanstoß) Java Basics - Anfänger-Themen 16
V Einfacher vergleich von Arrays geht schief Java Basics - Anfänger-Themen 2
T Operatoren Multiplikation nur mit Addition, Subtraktion und Vergleich Java Basics - Anfänger-Themen 29
N Methoden Array vergleich funzt nicht Java Basics - Anfänger-Themen 8
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
S Vergleichsmethode zum Objekt-Vergleich mit < und > Java Basics - Anfänger-Themen 4
F Problem bei Vergleich Java Basics - Anfänger-Themen 3
S File vergleich - Junit Java Basics - Anfänger-Themen 6
S Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen Java Basics - Anfänger-Themen 14
W Vergleich ob Buchstabe in einem Wort enthalten ist Java Basics - Anfänger-Themen 3
C Variablen Vergleich funktioniert nicht Java Basics - Anfänger-Themen 11
B Zwei verschiedene Daten vergleich Java Basics - Anfänger-Themen 2
A Variablen Vergleich Java Basics - Anfänger-Themen 5
G Date - Calender | "Vergleich" Java Basics - Anfänger-Themen 3
M Vergleich mit Toleranz Java Basics - Anfänger-Themen 7
B Objekt Vergleich - Unterschiede ausgeben Java Basics - Anfänger-Themen 4
P Vergleich mit Variablen Java Basics - Anfänger-Themen 6
K Vergleich von variable und array Java Basics - Anfänger-Themen 9
L vergleich zweier texte Java Basics - Anfänger-Themen 18
H Beim Vergleich/Sortieren mehr als zwei Objekte berücksichtigen Java Basics - Anfänger-Themen 14
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
P Vergleich von Enums Java Basics - Anfänger-Themen 4
F Methoden Vergleich von int Zahlen Java Basics - Anfänger-Themen 16
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
N Vergleich per equals Java Basics - Anfänger-Themen 5
Z XML Vergleich Java Basics - Anfänger-Themen 20
S Herunterladen von Dateien mit Vergleich Java Basics - Anfänger-Themen 6
E Objekte-Vergleich Java Basics - Anfänger-Themen 6
R Vergleich von Objekten anhand variierender Kriterien Java Basics - Anfänger-Themen 5
K Datentypen Arrays in Java - Adress-Arithmetik im Vergleich zu Listen Java Basics - Anfänger-Themen 4
S equals vergleich Java Basics - Anfänger-Themen 10
A Datentypen instanceof VS Class - Vergleich Java Basics - Anfänger-Themen 4
M Char vergleich zu Int Java Basics - Anfänger-Themen 10
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
algorismi Ausführungszeit Vergleich == true Java Basics - Anfänger-Themen 8
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
T Zwei listen vergleich und selbige löschen Java Basics - Anfänger-Themen 4
T Vergleich mit Typecasts Java Basics - Anfänger-Themen 3
Screen Eine Frage zu moueMove in applets und deren Vergleich Java Basics - Anfänger-Themen 11
M Vergleich Float-, Doublewert Java Basics - Anfänger-Themen 10
G Vergleich zweier Arrays Java Basics - Anfänger-Themen 8
U Methode Vergleich von 2 Arrays Java Basics - Anfänger-Themen 5
G Vergleich klappt nicht Java Basics - Anfänger-Themen 3
T Vergleich von generischen Typen Java Basics - Anfänger-Themen 2
C DB Vergleich mit Eingabe Java Basics - Anfänger-Themen 5
G Vergleich großer Basen/Exponenten? Java Basics - Anfänger-Themen 3
F Vergleich von Objekten Java Basics - Anfänger-Themen 2
N Vergleich findet nicht statt. Java Basics - Anfänger-Themen 13
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
A Vergleich schlägt fehl Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben