Operator == w javie a stringi

0

Mam pytanie, chodzi o Java

String text = "Ala";
if( text == "Ala")

Mam napisane że będzie to prawdopodobnie true, dlaczego?
Kojarze też te pytanie z rozmowy kwalifikacyjnej i jak zrozumiałem to Java rozpoznaje te same stringi, więc w if'e lokując stałą tekstową "Ala" w pamięci wskaźe na już istniejącą Ala, na którą wskazuje text. Dobrze myślę?

dodanie znacznika <code class="java"> - @furious programming

1

Wykonaj poniższy kod:

String txt = "Ala";
System.out.println(txt == "Ala");
System.out.println(txt == new String("Ala"));
System.out.println(txt == new String("Ala").intern());

i zajrzyj tu https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern%28%29

0

Znak == w Javie nie jest do porównywania wartości, lecz sprawdza on referencje do obiektów są równe, a łańcuch znaków jest interowany. Ten przykład akurat zwróci true ale

String test1 = new String("test");
String test2 = new String("test");

if(test1 == test2) // zwraca false
0

Zastanawia mnie czy ktoś kiedykolwiek celowo chciał porównać referencje dwóch stringów
Dla mnie rozwiązanie z C# gdzie porównywana jest domyślnie wartość jest dużo bardziej logiczna i programmer-friendly - jak się chce porównać referencje to robi się to przez object.ReferenceEquals lub rzutuje na object i nie ma żadnych zonków

0
  1. Jeżeli dodajesz jakiemuś enumowi parametr będący stringiem (np. jakimś komunikatem) i chcesz sprawdzić czy ten komunikat to na pewno ten o który Ci chodzi to możesz porównać referencje.

  2. Gdy coś jest bardzo nastawione na wydajność możesz internować stringi i porównywać je po referencjach.

  3. I wreszcie, przeciążając jakąkolwiek metodę equals najpierw sprawdzasz operatorem porównania bo jeżeli referencje są takie same to obiekt na pewno też.

Zasadniczo jednak wygodniej byłoby zamienic == z equals() i dodać equalsReference(). Z tym że c# wyciągnął z javy co najlepsze a błędy zmienił. Java takiej szansy nie miała.

1

Java nie ma możliwości przeładowania operatorów i dlatego tak to wygląda.

0

@Pijany Orzeł stringów jak stringów ale porównywanie tożsamości obiektów się zdarza. A to czy referencje porównujesz przez == czy .equals() czy odwrotnie to szczegół. Jednocześnie java nie daje możliwości przeładowania operatorów i tu jest pies pogrzebany ;)

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