Niekończąca się pętla + warunek przerwania

0

nie kminie czemu działa w jeden sposób a w drugi nie.

        {
        Scanner sc = new Scanner(System.in);

        String temp = "";
        boolean ifTrue = true;

        System.out.println("Type \"exit\" to quit");
        while (ifTrue) {
            temp = sc.next();
            if (temp == "Exit" ) { // w ten sposób nie działa, działa tak --> temp.equals("Exit")
                ifTrue = false;
            }

        }


1. Wiem, że String to obiekt dlatego metoda equals działa

Dlaczego nie moge porównać w sposób :    if(temp == "Exit") ?

Przecież jeśli zrobie coś takiego to warunek w Ifie zostanie wykonany. 


        String x= "asd";
        String y= "asd";
        
        if(x == y)  // lub if(x== "asd")
            System.out.println("true");
      ````
1

== porównuje referencje. Drugi przykład działa dzięki mechanizmowi string pooling - tak naprawdę w pamięci jest przechowywany jeden napis, jeżeli wpiszesz (dosłownie) w kilku miejscach w kodzie taki sam.
Spróbuj String y = new String("asd"); i zobaczysz, że x == y zwróci fałsz, bo wymuszasz stworzenie nowego obiektu. Będzie to inne miejsce w pamięci, inna referencja.
Gdy używasz next() string pool nie działa.

Tu masz fajnie opisane:
https://www.baeldung.com/java-string-pool
https://javastart.pl/baza-wiedzy/efektywne-programowanie/javatraps-001

0

Operator == wskazuje na adres w pamięci, natomiast musisz się przyzwyczaić, że do porównania służy metoda equals. Przy porównywaniu obiektów tez trzeba się nią posługiwać, tylko musi być zaimplementowana, bo domyślnie w klasie Object (z której dziedziczy każdy obiekt) jest bodajże zaimplementowana właśnie jako porównanie operatorem ==.

1 użytkowników online, w tym zalogowanych: 0, gości: 1