Code Erklärung

SyntaxTalksToMe

Bekanntes Mitglied
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 :)
 

fhoffmann

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

abc66

Top Contributor
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
	}
 

SyntaxTalksToMe

Bekanntes Mitglied
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?
 

abc66

Top Contributor
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

Top Contributor

LimDul

Top Contributor
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?
 

httpdigest

Top Contributor
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).
 

abc66

Top Contributor
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.
 

httpdigest

Top Contributor
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.
 

SyntaxTalksToMe

Bekanntes Mitglied
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.
 

SyntaxTalksToMe

Bekanntes Mitglied
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.
 

httpdigest

Top Contributor
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.
 

abc66

Top Contributor
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?)
 

httpdigest

Top Contributor
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.
 

abc66

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

SyntaxTalksToMe

Bekanntes Mitglied
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.
 
K

kneitzel

Gast
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 ...
 

abc66

Top Contributor
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.
 
K

kneitzel

Gast
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/
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Bitte um Code Erklärung Allgemeine Java-Themen 5
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
schemil053 Methoden Code-Verbesserung Allgemeine Java-Themen 2
D Webarchive (war): Code verschleiern Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
OnDemand Releaseversion Tag in Code Allgemeine Java-Themen 5
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
F Code auslagern Allgemeine Java-Themen 5
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
OnDemand Clean Code oder Allgemeine Java-Themen 5
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen &#8203; Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
Prafy Best Practice Code Refaktorisierung Allgemeine Java-Themen 7
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
X Was macht folgender Code!? Allgemeine Java-Themen 6
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
Fab1 Best Practice Vorgehensweise bestehenden Code/Programm verschönern Allgemeine Java-Themen 4
M Code optimieren Allgemeine Java-Themen 7
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
J Erzeugung von Java-Code Allgemeine Java-Themen 2
A Source code analyze Allgemeine Java-Themen 8
N VB Code in Java verwenden Allgemeine Java-Themen 5
P Aktuellen HTML Code auslesen (von JS manipuliert) Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben