PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: zwei Strings sind gleich, aber nicht laut Java



ogott
27-10-2004, 23:25
hallo!

ich habe folgendes problem:
ich muss überprüfen, ob die eingabe, die an der konsole erfolgt gleich "RR" ist. wenn ich jetzt im source code folgendes eingebe, geht es natürlich:


String blume1 = "RR";
if (blume1 == "RR") {
inputError = true;
}

wenn ich allerdings folgendes eingebe, und am prompt dann "RR" eingebe, erkennt Java nicht, dass es das selbe ist:


String blume1 = EprogIO.readWord();
if (blume1 == "RR") {
inputError = true;
}

EprogIO.readWord() ist eine methode, die ich verwenden muss, damit das beispiel richtig bewertet werden kann (ist ein beispiel für die uni).

in der dokumentation steht:


public static java.lang.String readWord()
Reads characters until a whitespace character appears and returns a String.
It reads successive input-bytes, converting each input-byte separately into
a character, until it encounters a trailing whitespace character or end of
file; the characters read are then returned as a String, leading whitespace
haracters are skipped. Note that because this method processes
input-bytes, it does not support input of the full Unicode character set. A
character is considered to be a Java whitespace character if and only if it
satisfies one of the following criteria:

It is a Unicode space separator (category "Zs"), but is not a no-break space
(\u00A0 or \uFEFF).
It is a Unicode line separator (category "Zl").
It is a Unicode paragraph separator (category "Zp").
It is \u0009, HORIZONTAL TABULATION.
It is \u000A, LINE FEED.
It is \u000B, VERTICAL TABULATION.
It is \u000C, FORM FEED.
It is \u000D, CARRIAGE RETURN.
It is \u001C, FILE SEPARATOR.
It is \u001D, GROUP SEPARATOR.
It is \u001E, RECORD SEPARATOR.
It is \u001F, UNIT SEPARATOR.

If end of file is encountered before even one input-byte can be read, then
null is returned. Otherwise, each input-byte that is read is converted to
type char by zero-extension. If the character '\n' is encountered, it is
discarded and reading ceases. If the character '\r' is encountered, it is
discarded and, if the following byte converts to the character '\n', then that
is discarded also; reading then ceases. If end of file is encountered before
either of the characters '\n' and '\r' is encountered, reading ceases. Once
reading has ceased, a String is returned that contains all the characters
read and not discarded, taken in order. Note that every character in this
String will have a value less than \u0100, that is, (char)256.
Returns:
the next word from this input stream as a String.

vor und nach dem "RR" ist kein zeichen, wenn ich es nach der eingabe nochmal ausgeben lasse.

hat jemand eine idee, woran das liegen könnte?

ogott

peschmae
28-10-2004, 08:06
Java arbeitet bei Objekten mit Referenzen. Wenn beide Strings konstanten sind dann sind die netterweise gleich. Aber wenn eines eine Variable ist geht == nicht mehr weil die Adressen verschieden sind.

Folglich machst du ein
string1.equals(string2)
oder auch
string1.equalsIgnoreCase(string2)
um Strings zu vergleichen. Am besten gleich immer weil == eine schlechte Angewohnheit ist ;)

MfG Peschmä

ogott
28-10-2004, 20:26
ok, passt, vielen dank!

ogott

Geist
29-10-2004, 08:31
== für Objekte oder Zahlen ('if variable == null' oder 'if zahl == 42')

Sym
29-10-2004, 09:22
== für Objekte oder Zahlen ('if variable == null' oder 'if zahl == 42')
Was genau meinst Du mit Objekte? String erbt ja nun direkt von Object.

SeeksTheMoon
29-10-2004, 19:56
String ist eine Klasse und somit sind Deine Strings alles Instanzen dieser Klasse, also Objekte

peschmae
29-10-2004, 20:15
Ich komm nicht mit. Aber was solls ;)

MfG Peschmä

Alex_K
29-10-2004, 21:32
Was genau meinst Du mit Objekte? String erbt ja nun direkt von Object.

ich versuch auch mal eine antwort, und hoffe dass diese weiter hilft ;)

in java kannst du mit == vergleichen ob es sich um das gleiche objekt handelt.
das ist in folgender hinsicht zu verstehen:

String str1 = new String("gaga");
String str2 = new String("gaga");

... damit erzeugst du 2 objekte vom typ string, beide haben den gleichen inhalt aber es sind 2 verschiedene objekte, weshalb str1 == str2 auch false liefert.
== auf objekte angewendet ergibt wirklich nur dann true wenn sich um das gleiche handelt (nicht nur um den gleichen inhalt).

peschmae
29-10-2004, 22:40
Ich nehme an Sym weiss das hat aber den Text von Geist nicht verstanden und sich darauf bezogen.

MfG Peschmä

Sym
30-10-2004, 03:33
Ich nehme an Sym weiss das hat aber den Text von Geist nicht verstanden und sich darauf bezogen.

MfG Peschmä
Jupp, vielen dank. Genau so war es. Ich verstehe nicht

== für Objekte oder Zahlen ('if variable == null' oder 'if zahl == 42')
denn da String von Object erbt, ist es ein Objekt. Und hier geht es um den Inhalt des Strings - nicht um das Objekt an sich. Und da habe ich Geists Gedankengang nicht ganz nachvollziehen können. ;) Aber vielleicht meint er hier genau das Richtige.

fs111
30-10-2004, 12:31
Es ist zwar richtig, dass man Strings nicht mit "==" vergleichen soll, ich will aber ein Beispiel geben, wo das funktionieren kann, um die Verwirrung mal etwas zu erhöhen:



public class Test
{


public static void main(String [] args)
{
String foo = "abc";
String bar = "abc";

if (foo==bar)
{
System.out.println("Sind gleich.");
}
else
{
System.out.println("Sind ungleich.");
}

}

}


Wenn ich das jetzt kompiliere und ausführe passiert folgendes:




> pts/2 FS111:~/tmp
> 0 12:25:35 1014 $ javac Test.java
> pts/2 FS111:~/tmp
> 0 12:26:04 1015 $ java Test
Sind gleich.
> pts/2 FS111:~/tmp
> 0 12:26:05 1016 $ java Test
Sind gleich.
> pts/2 FS111:~/tmp
> 0 12:26:05 1017 $ java Test
Sind gleich.
> pts/2 FS111:~/tmp
> 0 12:26:06 1018 $ java Test
Sind gleich.
> pts/2 FS111:~/tmp
> 0 12:26:07 1019 $ java Test
Sind gleich.


Das liegt daran, das beim Start der VM ein Konstantenpool erzeugt wird, und da die Strings foo und bar auch für die VM gleich sind, zeigen sie auf die gleiche Konstante in diesem Pool, und der Vergleich klappt. Ich weiß, dass man nicht == verwenden soll, ich wollte nur ein Bsp. geben, wo das aber eben doch funktioniert.

fs111

peschmae
30-10-2004, 16:21
Das steht so schon im zweiten Posting in diesem Thread ;)
Wenn auch ohne Code.

MfG Peschmä

Geist
02-11-2004, 10:45
ups, ist hier was los.

Ich wollte nur betonen wann man '==' und 'equals' anwendet. Hab ich solche Verwirrung geschaffen?
Ich kann halt überprüfen, ob eine Stringvariable definiert ist und das tue ich mit ==. Wenn ich sie gegen einen String prüfe tue ich das mit equals.

peschmae
02-11-2004, 13:03
Du willst also behaupten du verstündest dein erstes Post? Ich nämlich nicht ;)
Mit dem was du jetzt geschrieben hast bin ich aber einverstanden :)

MfG Peschmä