Portal > Foren > Java > Allgemeine Java-Programmierung > eine Frage über String
Antwort
 
Themen-Optionen
Alt 18.05.2005, 04:30 Nach oben    #1
punachino
Gast
 
Beiträge: n/a
Standard eine Frage über String

Ich habe die folgende Quelletext:

PHP-Code:
public class StringCompare {

    
/**
     * @param args
     */
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
String s1="Hallo";
String s2=s1;
String s3=new String("Hallo");
String s4="Hallo2";
System.out.println("s1==s2:"+(s1==s2));
System.out.println("s2==s3:"+(s2==s3));
System.out.println("s1 equals s2:"+(s1.equals(s2)));
System.out.println("s2 equals s3:"+(s2.equals(s3)));
    }


Und das Ergebnis auf Bildschirm :

s1==s2:true
s2==s3:false
s1 equals s2:true
s2 equals s3:true

Und meine Frage : Warum ist s2== s3 ist false ??
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.05.2005, 07:25 Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von peschmae
 
Registriert seit: 29.05.2004
Beiträge: 228
Standard

Wegen weil der Operator == Referenzen Vergleicht. Speicheradressen falls dir das mehr sagt. s1 und s2 belegen denselben Speicher - hast sie ja eben vorhin einander zugewiesen. s3 belegt separaten Speicher den du mit new angefordert hast.

Das gilt übrigens nicht nur für Strings sondern für alle Objekte ausser die primitiven Datentypen (die du nicht mit new auf dem Heap anlegst).

MfG Peschmä
__________________
Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM
"We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth
peschmae ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.05.2005, 09:42 Nach oben    #3
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.108
Standard

Wobei peschmae einen Fall vergessen hat:
String ist ein besonderer Typ, der teilweise nicht so funktioniert, wie man es erwarten würde.

Mal ganz einfach gesagt: Wenn du folgendes
Code:
String s3=new String("Hallo");
zu
Code:
String s3= "Hallo";
änderst wird wieder true zurückgegeben.

Das liegt daran, dass bei der Erzeugung eines Strings über diesen speziellen Konstruktor (nämlich den, den wir oben aufrufen) zuerst nachgesehen wird, ob es diesen String bereits irgendwo in unserem Programm mal gegeben hat. Wenn ja wird einfach diese Instanz zurückgegeben, ansonsten eine neue Instanz.
Beim new-Konstruktor hingegen wird auf jedenfall ein neuer String erzeugt - was auch der Grund dafür ist, dass er im allgemeinen umgangen werden sollte.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.05.2005, 10:42 Nach oben    #4
punachino
Gast
 
Beiträge: n/a
Standard

Erhlich gesagt, verstehe ich gar nicht, was ihr meint
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.05.2005, 16:20 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.471
Standard

Hallo
vielleicht schaust Du hier auch mal rein:
--> http://jforum.de/showthread.php?t=930
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.05.2005, 17:11 Nach oben    #6
Benutzer
 
Benutzerbild von ehli75
 
Registriert seit: 30.11.2004
Beiträge: 97
Standard

Lass mich raten ... du hast noch nicht viel mit Java bzw. mit Objektorientierung zu tun gehabt ?
Dann wollen wir mal deinen code Stückchenweise durchgehen:
(die verwendeten ID's hab ich mir aus den Finger gezogen ... nur zur Anschauung !!)

String s1="Hallo";
du erzeugst ein Objekt in Speicher (id=1) und lässt die Variable s1 darauf zeigen

String s2=s1;
du erzeugst eine weitere Variable (s2), die auf das gleiche Objekt (mit der id=1) zeigt
Würdest du jetzt was am Inhalt des Objektes mit der id=1 verändern, würde das sich auf BEIDE Variabelen auswiken !!!

String s3=new String("Hallo");
du erzeugst ein NEUES Objekt im Speicher (id=2) und lässt die Variable s3 darauf zeigen.
ob der Inhalt "zufällig" der selbe ist, ist TOTAL EGAL - der Text "Hallo" steht nun zwei mal in deinem Speicher ! Wenn du den Inhalt des Objektes mit der id=1 veränderst, passiert hier nix, da das ein komplett anderer Speicherbereich ist !

String s4="Hallo2";
du erzeugst ein NEUES Objekt im Speicher (id=3) und lässt die Variable s4 darauf zeigen.

System.out.println("s1==s2:"+(s1==s2));
du benutzt == zum vergleichen. d.h. du vergleichst die Objekte im Speicher ... oder auch die ID's (weiss gar nicht wie das Java macht ... ist aber egal ... wir nehmen an, dass die ID'd verglichen werden). Und ... natürlich sind die gleich, da beide auf das OBjekt mit der ID 1 zeigen.

System.out.println("s2==s3:"+(s2==s3));
hier wird wieder == benutzt. ABER, obwohl der Inhalt der Obejkte (zufällif) gleich ist, zeigen sie auf verschieden Objekte mit unterschiedlichen ID's.

System.out.println("s1 equals s2:"+(s1.equals(s2)));
Hier benutzt du ein Methode der Klasse String zum vergleich. Die vergleicht nicht die ID'd, sondern vergleicht den Inhalt der Objekte zeichenweise. ist in beiden OBjekten das gleiche Zeugs drin, ist das true. Das die Objekte die gleiche ID haben, interresiert die Methode in dem Moment überhaupt nicht !!

System.out.println("s2 equals s3:"+(s2.equals(s3)));
Hier nimmst du wieder die Methode der Klasse String. Und da dieInhalte der Objekte gleich sind (das das verschieden Objekte sind, iser der Methode SCHEISS EGAL) ist's true.

War das OK ?
ehli75 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.05.2005, 01:14 Nach oben    #7
punachino
Gast
 
Beiträge: n/a
Standard

ehli 75 dake für deine Erklarrüng. es ist eindeutig,sodass ich sofort dises Problem verstehen kann.

Viele Glück
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem bei Verarbeitung von Templates (Eigene Klassen) dago PHP-Programmierung 21 31.08.2006 16:02
Symbolklassen festlegen anna Allgemeine Java-Programmierung 2 12.11.2005 11:30
Datei einlesen. cyberdevil87 Allgemeine Java-Programmierung 3 27.06.2005 09:22
Access Anbindung unter Linux mit Java ? kampet Datenbanken 5 25.04.2005 08:43
string in teilbereiche zerteilen!? Niki_Tesla Allgemeine Java-Programmierung 10 14.02.2005 09:11


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:28 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44