einfache Quizfrage programmieren

dylar

Neues Mitglied
Ich möchte eine Quizfrage programmieren auf die geantwortet werden kann. Ist die Antwort richtig, soll "Richtig" ausgegeben werden, ist sie falsch soll "leider falsch" ausgegeben werden. Die Frage ist "Wer erfand die Glühbirne", Antwort soll "Edison" sein. Folgendes habe ich dazu programmiert:

Java:
import java.util.Scanner;

public class Quiz {
	public static void main (String args[]){
    Scanner input = new Scanner(System.in);
    
        System.out.println("Wer erfand die Glühbirne? ");
        String Antwort = input.nextLine ();
        
        if (Antwort == "Edison"){
        	System.out.println ("richtig");
        	
        }else{
        	System.out.println ("leider falsch");
        	
        }
	}
}

Es wird auch die Frage ausgegeben, ich kann meine Antwort eingeben, aber dann gibt das Programm immer nur "leider falsch" aus. Ich vermute ich mache das mit

Code:
 if (Antwort == "Edison")

falsch, oder?
 

supertux

Mitglied
Hi, ich bin selbst Anfänger aber ich habe gelesen das == nicht möglich ist du musst dafür equal oder so nehmen dann müsste es gehen... (Habe jetzt leider keinen Link parat)
 

Volvagia

Top Contributor
Das stimmt so nicht, == ist möglich und macht grundsätzlich das selbe wie equal. Der einzige Unterschied ist, dass equal überschrieben werden kann (keine Überladungen in Java), und bei Strings den Inhalt des String vergleicht.

Variablennamen sollte man übrigens wenn möglich immer klein schreiben.
 

dylar

Neues Mitglied
ah ok. Also so funktioniert es jetzt:

Java:
import java.util.Scanner;

public class Quiz {
	public static void main (String args[]){
    Scanner input = new Scanner(System.in);
    
        System.out.println("Wer erfand die Glühbirne? ");
        String antwort = input.nextLine ();
        
        if (antwort.equals ("Edison")){
        	System.out.println ("richtig");
        	
        }else{
        	System.out.println ("leider falsch");
        	
        }

herzlichen Dank.
 

kirax

Bekanntes Mitglied
Das stimmt so nicht, == ist möglich und macht grundsätzlich das selbe wie equal. Der einzige Unterschied ist, dass equal überschrieben werden kann (keine Überladungen in Java), und bei Strings den Inhalt des String vergleicht.

Das ist FALSCH.

Java:
String str1 = "string1";
String str2 = "string1";
System.out.println(str1 == str2);  // possibly true, usually false
System.out.println(str1 == "string1");  // possibly true, usually false
System.out.println(str1.equals(str2));  // always true

String str3 = "string1";
String str4 = new String("string1");
System.out.println(str3 == str4);  // always false
System.out.println(str3.equals(str4));   // always true

Warum ist das so?
Bei [c]==[/c] wird geprüft, ob die Referenz gleich ist, während [c]equals[/c] überprüft, ob der Inhalt gleich ist. Und weil bei eigenen Klassen selbst definiert werden muss, wann der Inhalt gleich ist, muss equals jeder selbst implementieren (deswegen ist sie überschreibbar).

Was ist da jetzt der Unterschied?
Die Referenz ist genau dann gleich, wenn die beiden Objekte auf die gleiche Stelle im Speicher zeigen. Denn es kann durchaus mehrere Objekte mit den gleichen Parametern geben, aber eben an unterschiedlichen Stellen im Speicher. In diesen Fällen würde equals true ausgeben, == aber false.

Was ist das Besondere an Strings?
Strings sind die einzigen Objekte, die (neben ihren komplexen Vertretern) wie primitive Datentypen initialisiert werden können. Die JVM behält sich bei dieser Methode vor, gleichlautenden Strings u.U. die selbe Referenz (=selbe Adresse im Speicher) zu geben. Das macht sie aus Performancegründen.
Das macht sie aber nicht immer. Insbesondere meist dann nicht, wenn die Strings an völlig verschiedenen Stellen definiert wurden (was in deinem Beispiel zwar nicht so aussieht, aber so sein wird).
str4 im obigen Beispiel wird definitiv als neues Objekt deklariert. Da wird die JVM auf keinen existierenden String verweisen.

equals vergleicht bei Strings auf den Inhalt. Deswegen ist der Test [c]str3.equals(str4))[/c] auch immer wahr, weil der Inhalt gleich ist.

Im Übrigen lässt sich equals() sehr wohl überladen:
Java:
@Override
public boolean equals(Object t) {
  return true;
}
    
public boolean equals(Integer i) {
  return true;
}
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Das er die String-Cache nicht verwendet hängt jetzt nicht mit dem Ort der Definition zusammen, sondern damit, dass der String mit new instanziert wurde.

[java=1940]new String(offset + beginIndex, endIndex - beginIndex, value);[/code]

Und doch, equal macht prinzipiell das selbe wie ==:

Java:
public class Object {
    public boolean equals(Object obj) {
	return (this == obj);
    }
}

Zudem habe ich nie behauptet, dass equal nicht überschrieben werden kann, ich hab genau das Gegenteil gesagt. ???:L
 

kirax

Bekanntes Mitglied
Ich bin jetzt zu faul in der Spec nachzulesen (wenn das überhaupt genau geregelt ist). Aber es gibt Fälle, in denen gleichlautende Strings die gleiche Referenz haben und andere, in denen das nicht so ist (siehe das Problem des TE).
Mit new erzwinge ich lediglich, dass ein neues Objekt angelegt wird (mit anderem Speicherort und damit anderer Referenz). Das sollte auch nur als Beispiel dienen, in denen das auf jeden Fall passiert.

Und nur Object.equals() macht dasselbe wie [c]==[/c]. Das hat aber nichts mit dem Problem des Vergleichs bei String zu tun, denn da ist equals() überschrieben.

Was stimmt, ist folgendes:
[c]o1 == o2 ==> o1.equals(o2)[/c]
Das ist in der Spezifikation von equals geregelt (und hat damit für alle Overrides von equals zu gelten). Aber
[c]o1.equals(o2) ==> o1 == o2[/c] gilt nicht. Sonst bräuchte man equals nicht, weil wozu dann überschreiben ;)

Du hattest geschrieben "keine Überladungen in Java". Ich hatte das auf equals() bezogen. Aber offenbar meintest du damit die Operatorüberladung von [c]==[/c]. Dann sorry ;)
 

tsitra

Bekanntes Mitglied
Hallo,

hier kann ich was zur Entscheidung beitragen.
Folgendes halte ich für eine gewagte bzw. eher falsche Behauptung

Und doch, equal macht prinzipiell das selbe wie ==

Es müsste eher heißen:
"equals macht manchmal genau das selbe wie =="

kirax hat das schon recht gut erklärt, warum das eben doch verschieden ist.

Es gibt Fälle in denen "x.equals(y)" das gleiche liefert wie "x == y" aber das sollte nicht darüber hinwegtäuschen, dass "equals()" und "==" eigentlich wesentlich verschieden sind!

Die "equals()" aus Object nutzt "==" und == prüft Bitgleichheit also liefert nur true wenn
der Zeiger identisch ist.
Das ist natürlich viel zu streng um Bedeutungsgleichheit
(Inhaltsgleichheit) zu überprüfen! Aus dem Grund MUSS jede class, deren Instanzen miteinander
auf Bedeutungsgleichheit getestet werden sollen, equals() überschreiben.
Dabei kann dann entschieden werden, welche die Kriterien für Bedeutungsgleichheit sein sollen.

Java nutzt ein sogenannten "StringConstantPool"(Ich denke Vovagia meint diesen mit "String-Cache") und deshalb ist bei
String str1 = "string1";
String str2 = "string1";

str1 == str2 ist immer true, aber das hatte kirax bereits erwähnt.

Jede neue String Variable strNeu bekommt die selbe Referenz wie ein String Literal (konkreter String-Wert) strX im "StringConstantPool"sofern der Wert von StrNeu genau gleich strX ist.
Wird ein ganz neuer String xyz verwendet, der noch nicht im "StringConstantPool" ist, so
wird der dort eingetragen und ab dann, zeigen alle etwaigen Clons davon genau auf xyz.

Viele Grüße
tsitra
 

kirax

Bekanntes Mitglied
String str1 = "string1";
String str2 = "string1";

str1 == str2 ist immer true, aber das hatte kirax bereits erwähnt.
Naja da wär ich nicht so sicher.
Siehe das Problem vom TE. Genau deswegen muss man Strings ja mit equals vergleichen.
 

tsitra

Bekanntes Mitglied
Hallo kirax,
vertust Du Dich jetzt nicht oder missverstehst mich?
Also nochmal:

WENN
String str1 = "string1";
String str2 = "string1";
DANN:
Der Vergleich str1 == str2 liefet immer true,

In dem Fall, dass zwei Strings str1 und str2 identische Werte haben und NICHT mit new
erzeugt wurden, sondern einfach nur mit String deklariert wurden,
sind diese, wegen dem String Constant Pool immer bezüglich == gleich, also
"referenzgleich".

Innerhalb "String Antwort = input.nextLine ();" wird wohl ein new String(...)
ausgeführt, wodurch danach der Gleichheitstest nur noch mit equals()
gemacht werden kann, wenn man inhaltsgleiche Strings als solche erkennen will.

Viele Grüße
tsitra
 

kirax

Bekanntes Mitglied
Doch, ich verstehe, was du sagen willst. Und ich versuche dir auch zu glauben. :)
Nur:
Java:
String Antwort = input.nextLine ();
if (Antwort == "Edison")

Wenn [c]Antwort[/c] den gleichen Inhalt wie "Edison" hält, dann dürfte "Edison" in der Abfrage (nach deiner Theorie) nicht als neues String-Objekt erzeugt werden (was nichts damit zu tun hat, ob für Antwort in der ersten Zeile ein neuer String erzeugt wird, oder nicht), sondern die JVM würde hierfür die Referenz des (einzigen?) String-Objekts mit dem Inhalt "Edison", worauf sich ja auch [c]Antwort[/c] beziehen würde, einsetzen. Damit wäre der Vergleich [c]true[/c].

Verstehst du, was ich meine? :)
Du darfst mir gern helfen, meinen Fehler zu finden, aber ich sehe ihn nicht.....
 

tsitra

Bekanntes Mitglied
Hallo kirax,
etwas verworren Dein Einwand, also schwer zu verstehen.

Ich nehme an, mit Abfrage meinst Du "input.nextLine ();"

Du schriebst:
"Wenn Antwort den gleichen Inhalt wie "Edison" hält, dann dürfte "Edison" in der Abfrage (nach deiner Theorie) nicht als neues String-Objekt erzeugt werden ..."

Es ist das Gegenteil von dem was ich in meinem ersten Beitrag geschrieben habe,
denn da beschrieb ich, dass es beides gibt, so wie Du es auch dargelegt hattest.
Wo habe ich das also behauptet?
Ich habe nirgendwo behauptet, dass ein andere Stringvariable str2, die jedoch
inhaltsgleich mit str1 ist, IMMER intern auf die str2 zeigt.

Ich habe die JVM und die API nicht programmiert, daher weiss ich nicht was da intern geschieht.Doch ich sehe genau, dass der Vergleich (Antwort == "Edison") false gibt und dafür muss es eine Ursache geben.
Ganz wichtig ist es also, dass die praktischen Fakten gesehen werden.

Ich stelle mir vor, dass der rechte Teil also "input.nextLine ();" eine Referenz
zurückliefert auf einen String namens "Edison", der jedoch eine andere Instanz
ist. Es gibt also in dem Fall zwei mal ein "Edison" im Speicher.

Du schriebst in einem früheren Beitrag:
"Mit new erzwinge ich lediglich, dass ein neues Objekt angelegt wird (mit anderem Speicherort und damit anderer Referenz). Das sollte auch nur als Beispiel dienen, in denen das auf jeden Fall passiert."
Das scheint mir nah an der Lösung des Problems dran. Hattest Du das vergessen?

Liegt es hier nicht nahe, dass genau das hier passiert und deshalb (Antwort == "Edison")
zu false evaluiert wird?

Viele Grüße
tsitra
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
B Einfache OCR zur Zahlenerkennung? Java Basics - Anfänger-Themen 6
M Einfache Datenfilterung Java Basics - Anfänger-Themen 15
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
B Einfache HSQLDB? (lock acquisition failure) Java Basics - Anfänger-Themen 2
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
O Ganz einfache Frage - Array Java Basics - Anfänger-Themen 5
E Einfache Java Verschlüsselung Java Basics - Anfänger-Themen 4
J Einfache Frage zu "null" Java Basics - Anfänger-Themen 2
J Einfache pub/sub Lösung mit ausführlicher Doku Java Basics - Anfänger-Themen 5
R Gibt es Eine einfache Programierung dieser Methoden Java Basics - Anfänger-Themen 8
K einfache Kombinatorik Java Basics - Anfänger-Themen 4
M Erste Schritte Einfache Aufzugssteuerung programmieren - Anfänger Java Basics - Anfänger-Themen 2
D Eine einfache Verschlüsselung schreiben Java Basics - Anfänger-Themen 3
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
X Einfache Frage; wie soll ich die spezielle float var speichern? Java Basics - Anfänger-Themen 2
J Einfache einbindung eines Bildes in ein Applet Java Basics - Anfänger-Themen 4
D Klassen Gesucht: Einfache Beispiel-Klasse für einen Datentyp Java Basics - Anfänger-Themen 7
K Möglichkeiten um eine einfache Animation darzustellen Java Basics - Anfänger-Themen 7
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
P Erste Schritte Einfache For Schleife Java Basics - Anfänger-Themen 10
M Einfache Java Operation, cheggs net Java Basics - Anfänger-Themen 2
V Erste Schritte Einfache Rechnung mit Exponenten Java Basics - Anfänger-Themen 3
G einfache Leet-Übersetzung implementieren und benutzen Java Basics - Anfänger-Themen 14
M Einfache und Doppelte Operatoren Java Basics - Anfänger-Themen 3
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
shiroX OOP Türme von Hanoi - einfache grafische Ausgabe Java Basics - Anfänger-Themen 2
C Extrem einfache Aufgabe falsch beantwortet :$ Java Basics - Anfänger-Themen 6
Z Super einfache Frage For-Schleife im Detail Java Basics - Anfänger-Themen 3
N Potenzierung durch einfache Operatoren Java Basics - Anfänger-Themen 13
H Einfacher Editor, Einfache Handelsanweisungen Java Basics - Anfänger-Themen 2
H Sehr einfache Java-Programme Java Basics - Anfänger-Themen 24
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
-horn- Einfache graphische Darstellung von 3D Koordinaten für Flugbahnen? Java Basics - Anfänger-Themen 4
B Einfache jsp Seite darstellen Java Basics - Anfänger-Themen 9
G Einfache if-Abfrage der Main-Argumente Java Basics - Anfänger-Themen 3
J Einfache Designfrage Java Basics - Anfänger-Themen 4
R Methoden Einfache Loops? Java Basics - Anfänger-Themen 8
E einfache Frage zu private Java Basics - Anfänger-Themen 26
R Sehr einfache möglichkeit ArrayList oder Array zu initialisieren? Java Basics - Anfänger-Themen 8
F Einfache Klassen für Datum und Zeit Java Basics - Anfänger-Themen 3
Spin Einfache Anfänger Frage setVisible von Panels Java Basics - Anfänger-Themen 5
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
B Einfache Applets für Webseite Java Basics - Anfänger-Themen 10
K Einfache Rekursion - Wert wird nicht in Variable gespeichert Java Basics - Anfänger-Themen 7
U Einfache Aufgabe Java Basics - Anfänger-Themen 5
E Einfache Frage zur Parameterübergabe in Methoden Java Basics - Anfänger-Themen 8
M einfache Übungsaufgaben gesucht Java Basics - Anfänger-Themen 7
M Einfache Rechnung(R=U/I) Java Basics - Anfänger-Themen 12
D Wohl eine einfache Frage... Java Basics - Anfänger-Themen 2
W Einfache Passwortabfrage funktioniert nicht Java Basics - Anfänger-Themen 3
P einfache GUI-Elemente Java Basics - Anfänger-Themen 10
F Vererbung (einfache Frage) Java Basics - Anfänger-Themen 5
S 2 Einfache Fragen (Exception Breakpoint, Konstruktor) Java Basics - Anfänger-Themen 4
L einfache Klasse erstellen Java Basics - Anfänger-Themen 16
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
P Einfache Bedingung (?) in Java Java Basics - Anfänger-Themen 3
W Einfache Rekursion Java Basics - Anfänger-Themen 14
T Einfache Textausgabe .java unter OS X Java Basics - Anfänger-Themen 13
B einfache Rekursion Java Basics - Anfänger-Themen 9
A [Hilfe] einfache Aufgabe Java Basics - Anfänger-Themen 26
A Einfache java Verschlüsselung HILFE Java Basics - Anfänger-Themen 3
M einfache java application Java Basics - Anfänger-Themen 4
S Kann einfache Texteingabe nicht auswerten! Java Basics - Anfänger-Themen 3
M einfache frage zum Jdk-Compiler Java Basics - Anfänger-Themen 3
Spin einfache Frage zu Klassen Java Basics - Anfänger-Themen 12
J einfache Tastendrücke in einem JFrame abfragen Java Basics - Anfänger-Themen 2
C "einfache" If-Abfrage Java Basics - Anfänger-Themen 15
H Einfache Ausgabe eines Arrays in einen File Java Basics - Anfänger-Themen 8
F Einfache Liste hinten was einfügen Java Basics - Anfänger-Themen 3
L Einfache Umrechnung Java Basics - Anfänger-Themen 2
D Einfache Funktion zum kaufmännischen runden Java Basics - Anfänger-Themen 8
K einfache Multiplikation Java Basics - Anfänger-Themen 6
S Einfache Rechnung mit Schleife Java Basics - Anfänger-Themen 10
G einfache Swing-GUI Java Basics - Anfänger-Themen 3
F Einfache Tastatureingabe Java Basics - Anfänger-Themen 2
L [gelöst] Einfache Aufgabe, läuft aber nicht. Java Basics - Anfänger-Themen 8
S "einfache Klassengeschichten" keine Fehler, läuft Java Basics - Anfänger-Themen 2
R Einfache MVC-Uhr. MVC richtig umgesetzt? [Überarbeitet] Java Basics - Anfänger-Themen 5
A Einfache Frage zur Mehrfachvererbung Java Basics - Anfänger-Themen 3
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
J eine einfache liste Java Basics - Anfänger-Themen 17
D Suche einfache Übungsaufgaben für den JavaCreator! Java Basics - Anfänger-Themen 5
R Einfache Messagebox Java Basics - Anfänger-Themen 9
N einfache Adressdatenbank in Textdatei Java Basics - Anfänger-Themen 8
I einfache Wiedergabe Java Basics - Anfänger-Themen 2
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
U "Einfache Verschlüsselung" Java Basics - Anfänger-Themen 17
K einfache Umfang und Flächenberechnung mit interfaces Java Basics - Anfänger-Themen 3
M Einfache HTML Mail versenden , suche Beispiel Java Basics - Anfänger-Themen 5
L MVC-einfache frage Java Basics - Anfänger-Themen 13
M einfache schleife Java Basics - Anfänger-Themen 7
M Einfache Schleife Java Basics - Anfänger-Themen 4
U "Quizfrage" aus Javainsel Java Basics - Anfänger-Themen 14
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
B OOP was heißt objektorientiertes Programmieren (fragt ein absoluter Anfänger) Java Basics - Anfänger-Themen 17
laxla123 Rechteck programmieren Java Basics - Anfänger-Themen 4
A Erste Schritte Dynamische Stempel im PDF Exchange programmieren Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben