Code Erklärung

Diskutiere Code Erklärung im Allgemeine Java-Themen Bereich.

Bitte aktiviere JavaScript!
S

SyntaxTalksToMe

Tag,

ein Bekannter und ich machen gerade so Testdurchläufe für den OCA. Hier ist erstmal der Code:

Code:
public class Test {
    public static void main(String[] args) {
        final int i1 = 1;
        final Integer i2 = 1;
        final String s1 = ":ONE";
       
        String str1 = i1 + s1;
        String str2 = i2 + s1;
       
        System.out.println(str1 == "1:ONE");
        System.out.println(str2 == "1:ONE");
    }
}
Wir verstehen nicht, wie die Konsolenausgaben zustande kommen.
Und zwar wird:

true
false

ausgegeben.
Aber wo ist da der entscheidende Unterschied, warum beim zweiteren false ausgegeben wird? Vom Prinzip ist es ja das gleiche?!

Eine Erklärung wäre super :)
 
F

fhoffmann

Strings sollte man immer mit equals vergleichen. Also
Code:
        System.out.println(str1.equals("1:ONE"));
        System.out.println(str2.equals("1:ONE"));
 
A

abc66

Ich habe es Dir mal kommentiert, siehe dir mal den String-Pool an
Java:
	public static void main(String[] args) {
		final int i1 = 1;
		final Integer i2 = 1;
		final String s1 = ":ONE";

		String str1 = i1 + s1;
		String str2 = i2 + s1;

		System.out.println(str1.intern() == "1:ONE"); // sollte true liefern
		System.out.println(str2.intern() == "1:ONE"); // sollte true liefern
		System.out.println(new String(str1) == "1:ONE"); // muss false liefern
		System.out.println(new String(str2) == "1:ONE"); // muss false liefern
		System.out.println(str1 == str2.intern()); // sollte true liefern
		System.out.println(str1.intern() == str2); // sollte false liefern
	}
 
S

SyntaxTalksToMe

Strings sollte man immer mit equals vergleichen. Also
Code:
        System.out.println(str1.equals("1:ONE"));
        System.out.println(str2.equals("1:ONE"));
Das steht aber nicht zur Debatte, da die Aufgabe nun mal so ist.

Ich habe es Dir mal kommentiert, siehe dir mal den String-Pool an
Java:
    public static void main(String[] args) {
        final int i1 = 1;
        final Integer i2 = 1;
        final String s1 = ":ONE";

        String str1 = i1 + s1;
        String str2 = i2 + s1;

        System.out.println(str1.intern() == "1:ONE"); // sollte true liefern
        System.out.println(str2.intern() == "1:ONE"); // sollte true liefern
        System.out.println(new String(str1) == "1:ONE"); // muss false liefern
        System.out.println(new String(str2) == "1:ONE"); // muss false liefern
        System.out.println(str1 == str2.intern()); // sollte true liefern
        System.out.println(str1.intern() == str2); // sollte false liefern
    }
Ich danke dir für deine Mühe. Wir würden es aber gerne verstehen, anhand von dem Beispiel dass ich gepostet habe. Wir wollen einfach wissen, warum genau bei dieser einen Beispiel einmal true und einmal false kommt. Ich glaube dein Beispiel zu verstehen. Aber bei beiden Beispielen werden verschiedene Variablen kombiniert. Müsste dann nicht beides true true sein?
 
A

abc66

Na ja... welche Strings interned werden und welche nicht, ist Implementierungsdetail der VM. Das bedeutet konkret; es gibt keine Zusicherung, dass s1 == s2 true liefert, wenn der Inhalt von s1 und s2 der gleiche ist.... welche Strings in den Pool kommen und welche aus ihm genommen werden, ist für den Progger nicht sichtbar. ;)

Also vergleiche Strings immer mit .equals().
 
mihe7

mihe7

L

LimDul

Würde mal sagen, dass die Antwort in [1] in Verbindung mit [2] zu finden ist, insbesondere "The String object is newly created (§12.5) unless the expression is a constant expression (§15.28)." und "Constant expressions of type String are always "interned" so as to share unique instances, using the methodString.intern."

[1] https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1
[2] https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28
Aber mal eine ganz profane Frage - Wofür muss ich das wissen?
 
H

httpdigest

Na ja... welche Strings interned werden und welche nicht, ist Implementierungsdetail der VM
Nein. Welche Strings interned werden und wie sie sich dementsprechend bei einem '==' Vergleich zu verhalten haben, ist strikt in der Java Language Specification geregelt (siehe Antwort von @mihe7). Daran hat sich jede Java-Platform-kompatible JVM-Implementierung zu halten. Eine JVM darf weder konstante Strings nicht internen, noch darf sie nicht-konstante Strings internen (es sei denn natürlich, du erzeugst und verwendest solche Strings durch einen expliziten String.intern() Aufruf).
 
A

abc66

Nein. Welche Strings interned werden und wie sie sich dementsprechend bei einem '==' Vergleich zu verhalten haben, ist strikt in der Java Language Specification geregelt [...]
Dann muss das dort aber auch mit allen Einzelheiten beschrieben sein... ansonsten haben/hätten VM-Anbieter einen gewissen Interpretationsspielraum.

Die schöne Regel, Strings auf inhaltliche Gleichheit mit Equals vergleichen, bleibt natürlich.
 
H

httpdigest

Dann muss das dort aber auch mit allen Einzelheiten beschrieben sein... ansonsten haben/hätten VM-Anbieter einen gewissen Interpretationsspielraum.
So viele Einzelheiten gibt es gar nicht. Man muss nur definieren, wann ein String "konstant" ist (bzw. durch welche Operationen mit welchen Typen er konstant bleibt, bzw. neue konstante Strings erzeugt) und, dass nur konstante Strings interned werden. Das wars. Da gibt es dann auch keinen Interpretationsspielraum mehr.
Die schöne Regel, Strings auf inhaltliche Gleichheit mit Equals vergleichen, bleibt natürlich.
Selbstverständlich.
 
L

LimDul

Anscheinend für irgendein Zertifikat:
Jo, das hab ich verstanden :) Aber ich frage mich, inwieweit mich dieses Wissen zu einem besseren Java Programmierer mache (Ich will schließlich Java und keine Java VM programmieren...) Ich stehe dem Zertifikat deswegen etwas skeptisch gegenüber.
 
S

SyntaxTalksToMe

Würde mal sagen, dass die Antwort in [1] in Verbindung mit [2] zu finden ist, insbesondere "The String object is newly created (§12.5) unless the expression is a constant expression (§15.28)." und "Constant expressions of type String are always "interned" so as to share unique instances, using the methodString.intern."

[1] https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1
[2] https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28
Nice. Das war es.
Es wird bei OCA und OCP verlangt. Das sind Zertifizierungen direkt von Oracle.
Das Thema hatte mich gefuchst. Wollte halt genau wissen. Und klar, nutze ich sonst equals.

Aber wenn es Oracle so will...und ich hab wieder was gelernt.
 
S

SyntaxTalksToMe

Jo, das hab ich verstanden :) Aber ich frage mich, inwieweit mich dieses Wissen zu einem besseren Java Programmierer mache (Ich will schließlich Java und keine Java VM programmieren...) Ich stehe dem Zertifikat deswegen etwas skeptisch gegenüber.
Ja, das mag sein. Andererseits, wenn es nur ansatzweise soviel schlechten Code auf de rWelt gibt, wie immer geklagt wird, sollte man froh sein, wenn sich jemand die MÜhe macht es zu lernen. Ob das Zertifikat jetzt einen Stellenwert hat, weiß ich nicht. Fakt ist, wenn man sonst nichts in der Hand hat und am Beginn steht, werde ich mich dagegen nicht wehren. Irgendwo muss es ja anfangen :)

Ich danke aber allen für ihre Antworten.
 
H

httpdigest

Jo, das hab ich verstanden :) Aber ich frage mich, inwieweit mich dieses Wissen zu einem besseren Java Programmierer mache (Ich will schließlich Java und keine Java VM programmieren...) Ich stehe dem Zertifikat deswegen etwas skeptisch gegenüber.
Das Ziel des Zertifikates ist es auch nicht, aus dir einen besseren Java-Programmierer zu machen. Es hat im Grunde genommen hauptsächlich das Ziel, Oracle und der Zertifizierungsgesellschaft Geld einzubringen und dich durch einen technisch sehr unversierten Einkauf einer Firma als potenzieller Bewerber/Auftragnehmer zu bekommen.
Bei unserem aktuellen Kunden werden Leute, die tatsächlich in ihrer Bewerbung angeben, dass sie Oracle-Java-Zertifikate erworben haben, sehr misstrauisch begutachtet. Ein guter Java-Programmierer wirst du durch praktische Übung und durch lernen und befolgen angesehener Praktiken wie Clean-Code, Test-Driven-Development, S.O.L.I.D. und einfach durch gutes Mentoring von bereits guten Entwicklern.
 
A

abc66

Demnach...
Ich habe es Dir mal kommentiert, siehe dir mal den String-Pool an
Java:
	public static void main(String[] args) {
		final int i1 = 1;
		final Integer i2 = 1;
		final String s1 = ":ONE";

		String str1 = i1 + s1;
		String str2 = i2 + s1;

		System.out.println(str1.intern() == "1:ONE"); // sollte true liefern
		System.out.println(str2.intern() == "1:ONE"); // sollte true liefern
		System.out.println(new String(str1) == "1:ONE"); // muss false liefern
		System.out.println(new String(str2) == "1:ONE"); // muss false liefern
		System.out.println(str1 == str2.intern()); // sollte true liefern
		System.out.println(str1.intern() == str2); // sollte false liefern
	}
... sollte da überall >muss< stehen, wo >sollte< steht. ;) (Aber ich traue der Sache noch nicht ganz, ist das erst "kürzlich" in die JLS eingeflossen?)
 
H

httpdigest

Aber ich traue der Sache noch nicht ganz, ist das erst "kürzlich" in die JLS eingeflossen?
Nein, ist seit Java 1.0 so: http://titanium.cs.berkeley.edu/doc/java-langspec-1.0/3.doc.html#101084
String literals-or, more generally, strings that are the values of constant expressions (§15.27)-are "interned" so as to share unique instances, using the method String.intern (§20.12.47).
Außerdem würde das eventuell spätere Einführen einer solch grundlegenden Änderung das Verhaltens von bis dahin entwickelten Java-Programmen ändern (ein '==' Vergleich von zwei Strings würde dann manchmal true ergeben, wohingegen es sonst immer nur true wäre für dasselbe im Code erzeugte String-Objekt; angenommen, du wolltest damit prüfen, ob ein public static final String Variable als "Sentinel"- oder "Poison"-Wert genutzt wurde, statt einer anderen Variable die zufälligerweise auch den gleichen konstanten String enthielt) und wäre damit ein absolutes no-go.
 
A

abc66

Ja das hätte dann die Semantik schlecht programmierter Anwendungen (grundlegend) geändert. ;) Danke fürs Recherchieren! Und für mein Missverständnis Pardon...
 
S

SyntaxTalksToMe

In meiner AUsbildung wird das halt mit nebenbei gemacht der OCA und OCP. Natürlich lernt mir dass das programmieren nicht. Aber die Fragen sind durchaus tückisch. Manch Beispiel sieht leicht aus, erfordert aber letzten Endes doch tieferes Verständnis.
Der OCA und OCP soll reflektieren, ob man die Materie auch tatsächlich verstanden hat. Und meiner Meinung nach tut es.
Es mag nicht auf eurem Niveau sein, aber trotzdem ein meiner Meinung nach nicht unaussagekräftiges Zertifikat.
Es geht dort halt nicht darum zu programmieren, sondern Code zu verstehen. Und zwar ohne IDE und Hilfsmittel. Ich würde wetten, dass selbst hier in dem Forum, einige über diverse Fragen gestolpert wären. Natürlich will ich das ganze jetzt nicht hochloben. Manche fragen sind schon sehr sinnbefreit.

Ja das hätte dann die Semantik schlecht programmierter Anwendungen (grundlegend) geändert. ;) Danke fürs Recherchieren! Und für mein Missverständnis Pardon...
So war das nicht gemeint. Aber es sollte im allgemeinen begrüßt werden, wenn es halt mal jemand genauer wissen will. Ich bemühe mich halt, alle Hintergründe zu kennen.
 
J

JustNobody

Das Problem mit den Zertifikaten ist nicht, dass das, was man da lernt, unsinnig wäre. Das Problem ist, dass eine große Masse an Leuten nur Fragen lernen über Dumps. Damit sagen die Zertifikate schlicht nichts aus.
Bei den Windows Zertifikaten zu Windows und den Produkten rund um Windows ist das dann z.B. bei uns so, dass Voucher, die übrig bleiben, dann natürlich verbraucht werden.... Da heißt es dann einfach: Wer hat Lust heute die Dumps durchzugehen um morgen mit zur Prüfung zu gehen? (Wir gehen dann in einer Gruppe - arbeiten mit einem Dienstleister zusammen und da machen wir dann "den Raum voll" ...)
Und die Erfolgsquote ist erstaunlich hoch bzw. die Dumps sehr gut. So hat selbst unser Chef das eine oder andere Zertifikat mit abgelegt - so greift man dann den Leuten vor, die meinen, dass man so kein Zertifikat machen kann ...
 
A

abc66

Vielleicht interessant https://www.quora.com/Does-Oracle-offer-free-certifications-and-or-training. Ich hatte auch mal so ein Training gemacht; und die Fragen sind nicht leicht, ich hatte sie aber dennoch richtig.
 
J

JustNobody

An dieser Stelle möchte ich dann auch auf das Java Magazine von Oracle hinweisen. Da ist seit kurzem auch immer ein Bereich "Quiz Yourself". Wenn man sein eigenes Wissen etwas testen möchte und ggf. vertiefen, dann ist das evtl. auch eine interessante Sache.
https://blogs.oracle.com/javamagazine/
 
Thema: 

Code Erklärung

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben