![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Gast
Beiträge: n/a
|
Ich habe die folgende Quelletext: PHP-Code: s1==s2:true s2==s3:false s1 equals s2:true s2 equals s3:true Und meine Frage : Warum ist s2== s3 ist false ?? |
|
| | Nach oben #2 |
| Erfahrener Benutzer Registriert seit: 29.05.2004
Beiträge: 228
|
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 |
| | |
| | Nach oben #3 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.108
|
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");
Code: String s3= "Hallo"; 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. |
| | |
| | Nach oben #6 |
| Benutzer Registriert seit: 30.11.2004
Beiträge: 97
|
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 ? |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ä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 |