Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Java: zwei Strings sind gleich, aber nicht laut Java

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.12.2002
    Ort
    austria
    Beiträge
    9

    Java: zwei Strings sind gleich, aber nicht laut Java

    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:
    Code:
    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:
    Code:
    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:
    Code:
    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

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.12.2002
    Ort
    austria
    Beiträge
    9
    ok, passt, vielen dank!

    ogott

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.10.2004
    Beiträge
    20
    == für Objekte oder Zahlen ('if variable == null' oder 'if zahl == 42')
    Geändert von Geist (29-10-2004 um 08:34 Uhr)

  5. #5
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Zitat Zitat von Geist
    == 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.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  6. #6
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    String ist eine Klasse und somit sind Deine Strings alles Instanzen dieser Klasse, also Objekte
    I haven't lost my mind - It's somewhere on a backup-disc

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich komm nicht mit. Aber was solls

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  8. #8
    Registrierter Benutzer
    Registriert seit
    21.07.2000
    Ort
    Österreich
    Beiträge
    189
    Zitat Zitat von Sym
    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).

  9. #9
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich nehme an Sym weiss das hat aber den Text von Geist nicht verstanden und sich darauf bezogen.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  10. #10
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Zitat Zitat von peschmae
    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
    Zitat Zitat von Geist
    == 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.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  11. #11
    Registrierter Benutzer Avatar von fs111
    Registriert seit
    23.03.2002
    Beiträge
    594
    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:

    Code:
    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:

    Code:
    > 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

  12. #12
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Das steht so schon im zweiten Posting in diesem Thread
    Wenn auch ohne Code.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  13. #13
    Registrierter Benutzer
    Registriert seit
    07.10.2004
    Beiträge
    20
    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.
    Geändert von Geist (02-11-2004 um 10:49 Uhr)

  14. #14
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •