Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
14.09.2008, 03:11
Agamemnon-Hellmapper



FUCK JAVA...

Quellcode:String test = "test";
String testb = "";
Und Quellcode:(test == "test") liefert true, ABER

Quellcode:List t = new ArrayList();
t.add(test);
testb = (String) t.get(0);
Und Quellcode:(testb == "test") liefert false. AAAARRRRRGGGGGHHHHHH

und
Quellcode:System.out.println(test);
System.out.println(testb);
generiert den Output
Quellcode:test
test
DAS soll einer verstehen!?

===
edit:

btw... hab mein Problem jetzt mit
Quellcode:(testb.startsWith("test")) umgangen. Das liefert beides mal true, aber schön isses nich und ich hab fast 4 Stunden den &§&%$§ Fehler gesucht.

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de


Dieser Beitrag wurde am 14.09.2008 um 03:21 von Agamemnon-Hellmapper bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
14.09.2008, 04:02
Bluthund



Zu spät um selber was dazu zu schreiben:
http://www.gailer-net.de/tutorials/java/Notes/chap26/ch26_19.html

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
002
14.09.2008, 04:43
warri



Quellcode:testb.equals("test") sollte es tun..

Wenn du deine Liste typisierst, brauchst du auch nicht mehr explizit umzucasten und man macht weniger Fehler ;)

Quellcode:List<String> t = new ArrayList<String>();
t.add(test);
testb = t.get(0);
/edit:
Ok, erster Punkt ist hinfällig, sollte vielleicht erstmal auf die Links klicken..

--


Dieser Beitrag wurde am 14.09.2008 um 04:44 von warri bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
14.09.2008, 08:32
theDon



Das ist ein „Feature,“ Java hat keine Operatorueberladung, == ist damit _immer_ ein Adressvergleich, zwei Strings, die den gleichen Inhalt haben, aber nicht identisch sind, sind damit auch nicht „==.”

Nebenbei ists:
- das falsche Forum
- eine Frage, die sich durch RTFM/STFW locker haette klaeren lassen
- voll der Hitler

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
004
14.09.2008, 08:39
Agamemnon-Hellmapper



Ich vergleich hier aber keine Objekte, ich vergleiche ein Objekt mit einem Literal.
Da KANN offensichtlich nicht die Adresse gemeint sein. Und beim ersten Ausdruck funktionierts schließlich.

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de

zum Seitenanfang zum Seitenende Profil || Suche
005
14.09.2008, 08:48
theDon



Du magst das jetzt leugnen wollen, Fakt ist aber, dass du keine Ahnung hast, aber dreisterweise trotzdem davon ausgehst, dass sich die Sprache deiner Intuition beugt (Hint: Tut sie nicht).

Literalkonstanten haben keine definierten Adressen, deshalb hagelt es bei Adressvergleichen undefinierte Ergebnisse, insbesondere kann das dann auch mal „true“ liefern.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
006
14.09.2008, 09:16
Agamemnon-Hellmapper



Quellcode:String test = "test";
String test2 = "test";
String test3 = "test";
if (test == "test") System.out.println("ok"); else System.out.println("not ok");
if (test2 == "test") System.out.println("ok"); else System.out.println("not ok");
if (test3 == "test") System.out.println("ok"); else System.out.println("not ok");
liefert

Quellcode:ok
ok
ok
und

Quellcode:String test = "test";
String test2 = "test";
String test3 = "testx";
if (test == "test") System.out.println("ok"); else System.out.println("not ok");
if (test2 == "test") System.out.println("ok"); else System.out.println("not ok");
if (test3 == "test") System.out.println("ok"); else System.out.println("not ok");
liefert

Quellcode:ok
ok
not ok
Argument widerlegt.

Zitat:
insbesondere kann das dann auch mal „true“ liefern.
Es sei denn, du meinst mit "kann auch mal" == "immer, wenn dir danach is".

Im übrigen kannst du _mich_ mal, wenn du weiter soviel Scheiße in so einem überheblichen Ton von dir gibst. Wenn du schon ein Arsch sein willst, solltest du wenigstens Ahnung haben.#

Edit:

sogar
Quellcode:String test = "test";
String test3 = "test";
if (test3 == test) System.out.println("ok"); else System.out.println("not ok");
liefert jedesmal "ok", obwohl das mit meinem Problem nicht viel zu tun hat.

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de


Dieser Beitrag wurde am 14.09.2008 um 09:32 von Agamemnon-Hellmapper bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
14.09.2008, 09:27
theDon



Welchen Teil von „undefiniert“ verstehst du eigentlich nicht?

Strings kann man in Java nicht mit „==“ vergleichen, wenn man sinnvolle Ergebnisse erwartet, da kannst du jetzt noch so viele Beispiele herzitieren, wo das „geht,“ Fakt ist trotzdem, dass es nicht geht.

Aber Hauptsache, man macht einen auf dicke Fresse und beschuldigt andere Leute, keine Ahnung zu haben, ist ja schliesslich scheissegal, was die Sprachdefinition sagt, man hat ja ein Beispiel, das funktioniert, studiert Physik und weiss damit, dass ein funktionierendes Beispiel als Beweis fuer Allgemeingueltigkeit ausreicht.

Edit:

Zitat:
While == may be used to compare references of type String, such an equality test determines whether or not the two operands refer to the same String object. The result is false if the operands are distinct String objects, even if they contain the same sequence of characters. The contents of two strings s and t can be tested for equality by the method invocation s.equals(t). See also §3.10.5.
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#54508

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 14.09.2008 um 09:31 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
14.09.2008, 09:35
Agamemnon-Hellmapper



Okay, meinetwegen hast du sogar tatsächlich Recht, du bleibst aber trotzdem eine Zicke. Wie es in Wald hineinruft...

imho ziemlicher Designfehler, dass Objekt == Literal überhaupt durch den Kompiler durchgeht. Selbstkonsistenz ist etwas, das ich von einer Sprache einfach erwarte.

Ansonsten: Siehe mein Edit oben. Dir zufolge muss das ja immer definitiv "not ok" ergeben, was aber offensichtlich nicht der Fall ist.

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de


Dieser Beitrag wurde am 14.09.2008 um 09:42 von Agamemnon-Hellmapper bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
14.09.2008, 09:42
theDon



Auch Zeichenliteralkonstanten sind Instanzen von String, es gibt also absolut keinen Grund, warum das _nicht_ durch den Compiler gehen sollte.

Aber du lernst es scheinbar echt nicht, was deine Intuition dir sagt ist scheissegal, wichtig ist, was Sun in die Spezifikation schreibt.

Edit: „Undefiniert“ heisst kann, nicht muss. Die JIT-Optimierungen machen da seltsame Dinge, zum Beispiel Konstanten mit gleichen Werten zusammenlegen.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 14.09.2008 um 09:44 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
14.09.2008, 09:44
Agamemnon-Hellmapper



Nur doof, wenn sich Sun offenbar nicht an die eigene Dokumentation hält:

Zitat:
While == may be used to compare references of type String, such an equality test determines whether or not the two operands refer to the same String object
Zitat:
sogar

Quellcode:
String test = "test";
String test3 = "test";
if (test3 == test) System.out.println("ok"); else System.out.println("not ok");
liefert jedesmal "ok"

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de

zum Seitenanfang zum Seitenende Profil || Suche
011
14.09.2008, 09:45
theDon



Und wo steht geschrieben, dass das in dem Fall nicht das gleiche Objekt sein kann? Genau, nirgendwo.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
012
14.09.2008, 10:28
hausi



Nochmal von vorne:
Quellcode:String test = "test"; // verweist auf den internen String-literal "test"
String test2 = "test"; // verweist auf den selben Eintrag
String test3 = "test2"; // verweist auf den internen String-literal "test2"
String test4 = readLineFromStdIn(); // verweist NICHT ZWINGEND auf den selben Eintrag wie test, auch wenn "test" eingegeben wurde.
test == test2 => true
test == test4 => undefiniert
test.equals(test4) => true, falls test eingegeben wurde
Also kurz: == testet, ob es das selbe Objekt ist. Dies funktioniert mit konstanten, da diese beim kompilieren in einer Art Dictionary gespeichert werden und dann auf das selbe String-Literal verweisen.
.equals testet, ob zwei Objekte den selben Inhalt haben. Vielleicht wirds so klarer:
Quellcode:new Integer(13).equals(new Integer(13)) => true
new String("42").equals(new String("42")) => true
new String("42") == new String("42") => kann true oder false liefern, je nach Implementation
.equals ist auf Object-Ebene übrigens mit return arg0 == this; implementiert, also macht es bei den meisten Objekten genau das selbe wie ==.

Edit:
Für das Verständnis hilfreich ist ev. noch der Fakt, dass Java bei folgendem Code immer einen neuen String erstellt und der alte bestehen bleibt (ev. der Garbage Collection zum fressen vorgeworfen wird):
Quellcode:String test = "test";
test = test + "blubb"; // test wird eine Referenz auf "testblubb", "test" wird freigegeben

--


Dieser Beitrag wurde am 14.09.2008 um 10:32 von hausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
14.09.2008, 10:43
default



copy on write

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
014
14.09.2008, 12:56
dp
Administrator


vielleicht nochmal AI1 hoeren

--

zum Seitenanfang zum Seitenende Profil || Suche
015
14.09.2008, 14:39
Bluthund



Zitat:
dp postete
vielleicht nochmal AI1 hoeren
Nicht nur vielleicht...

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
016
14.09.2008, 19:48
RikkuZooo



Java is cool man kann sich damit viel ersparen wenn es um sachen wie: Kalender, taschen rechner usw. geht.

--

AirChina Mobile

zum Seitenanfang zum Seitenende Profil || Suche
017
14.09.2008, 21:52
Agamemnon-Hellmapper



Bleibt also zusammenzufassen, dass java für zwei separat initialisierte Stringobjekte an zwei separaten Adressen mit zufällig demselben Literal als Initialwert nicht zweimal den gleichen Wert an zwei Adressen speichert, sondern sich diese Mühe spart und die Daten nur einmal an einer einzigen Adresse speichert und einfach beide Pointer dahin zeigen lässt.

Ich kann also auch gleich schreiben:
String test1 = "test";
String test2 = test1;
mit exakt demselben Effekt. (Dann isses eh klar)

Und erst wenn mit den Stringobjekten irgendwas anderes geschieht, werden die Pointer auf separate Adressen gesetzt.

Dann erklärt sich die Diskrepanz zwischen beobachtetem und logischerweise erwartetem Verhalten beim Testen.

Thx an hausi für die kompetente Erklärung. Dass der Compiler im Code auftauchende Literale auf diese Weise behandelt ist in der Tat unerwartet. Ein kleines aber feines Detail, welches, ich habs grad extra nochmal in den Vorlesungsunterlagen AI1 nachgesehen, eindeutig übergangen wurde. Pointer & Co, alles da, aber dieses spezielle Beispiel: nope.

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de

zum Seitenanfang zum Seitenende Profil || Suche
018
14.09.2008, 21:59
theDon



Du hast es immer noch nicht verstanden, Strings in Java sind konstant, wenn du die „aenderst,“ wird ein neues Objekt angelegt.

Die VM _darf_ gleiche Literalkonstanten zusammenoptimieren, muss aber nicht (das nennt sich dann „undefiniert“).

„Logische Erwartung,“ die Sprache interessiert sich nicht dafuer, ob du das fuer sinnvoll haelst oder nicht, _es ist einfach so definiert_.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
019
14.09.2008, 22:09
Agamemnon-Hellmapper



theDon, du hast gerade den Zeitpunkt verpasst, an dem du noch etwas intelligentes hättest sagen können. Ich HABE es verstanden. Dass die VM Dinge Zusammenoptimieren _kann_, war der Knackpunkt bei der ganzen Frage.

Und deine blöden Anmachen kannst du dir sonstwohin schieben. Thread kann geclosed werden, Kommentare von theDon sind nicht erwünscht und daran wird sich auch jetzt nichts mehr ändern.

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de

zum Seitenanfang zum Seitenende Profil || Suche
020
14.09.2008, 22:30
caedes



hellmapper: kokst du eigentlich?

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.

zum Seitenanfang zum Seitenende Profil || Suche
021
14.09.2008, 22:36
Kriz



Man merke sich also letztendlich im Umgang mit Java:

1. == vergleicht Referenzen und nicht die Objekte dahinter
2. Strings vergleicht man mit equals()

Wozu also soviel Geseiher?

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
022
15.09.2008, 00:00
caedes



Fassen wir nochmal zusammen.. du hast einen Thread mit unaussagekräftigen Titel ("Ich hasse Java!" - passender wär wohl gewesen "Strings vergleichen in Java") im falschen Forum (war im Hardware & Software Board) eröffnet und fleißig Capslock benutzt.
Dein Problem wäre mit 10s googlen zu lösen gewesen. Leute, die dir versucht haben zu erklären, woran du gescheitert bist, hast du angepöbelt und unterstellt, sie hätten keine Ahnung, anstatt dich erstmal zu informieren..

Ganz schön bitter dafür, dass du sonst immer so elitär tust.

Fällt wohl unter die Kategorie "Epic Fail".

--

caedes

Deutschland rückt nach Einschätzung der Sicherheitsbehörden im Superwahljahr verstärkt ins Visier von Terroristen.

zum Seitenanfang zum Seitenende Profil || Suche
023
15.09.2008, 01:09
LeJean



Ich frage mich, was dort in der VL überhaupt gelesen wurde. "Pointer & Co" passt nicht so recht ins Java-Umfeld, wenn man von expliziten Pointern spricht. Listen etc. ohne Generics gehen auch eher weniger klar. Dazu noch das Referenzenkonzept der JVM mit Speichermanagement etc...

Entweder scheiß Vorlesung, nicht aufgepasst, nicht dagewesen oder schlicht nicht verstanden.

Edit: Ich frag mich, was an den ersten Antworten hier inkompetent gewesen sein soll? Hier hat jemand nen recht langen Schlips, auf den scheinbar schnell mal getreten wird. Ziemlicher Designfehler (vgl. #008).

--


Dieser Beitrag wurde am 15.09.2008 um 01:11 von LeJean bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
024
15.09.2008, 01:25
Agamemnon-Hellmapper



Nochmal. Der erste, der mir tatsächlich geholfen hat, weil er überhaupt mein Problem verstanden hat, war hausi, und der hatte es nicht nötig, dies in dem überheblichen Ton zu tun, wie theDon, dessen Postings im übrigen nicht nur unprovoziert arrogant (#005) sondern auch absolut nicht hilfreich waren.

Deswegen an hausi nochmal Danke für die Erklärung.

Und im Übrigen hätte die Diskussion auch schon nach #012 zuende sein können.
Aber TheWall ist ja so berechenbar... Ein provokanter Titel und ein reißerischer Post, und schon kommen die Aushilfsbulemiker angekrochen, um ihre Kotze abzusondern.

(Falsches Forum war mein Fehler, aber nicht absichtlich. Und dass mein Denkfehler letztlich darin lag, dass mir nicht bekannt war, dass die VM Literale zusammenrationalisiert, hätte mir Google auch nicht sagen können, ohne Seitenweise altbekanntes (siehe theDon) auszuspucken, wo dieses Detail dann irgendwo versteckt drinsteht)

--

Es gibt 2 Möglichkeiten, eine Kristallkugel zu benutzen:
a) um damit Spekulationen über ein Problem eines Users zu machen und
b) um sie einem besonders unkooperativen User über den Schädel zu ziehen.
- bloggt jetzt auch selbst auf Sclavia.de

zum Seitenanfang zum Seitenende Profil || Suche