Java intern stałe łańcuchowe (ostateczne strings) i literały (utworzyć jedną instancję każdej struny w basenie wewnętrznym), a zatem można uzyskać ten sam przypadek, nawet jeśli jest "stworzony" przez konkatenację.
I jak już wspomniano, optymalizacja kompilatora faktycznie przekształciłaby konkatenację w literał ("ab").
Nigdy nie można w pełni polegać na semantyce String, dlatego należy zawsze używać equals(..)
.
Edit: wyjaśnienie powyżej zdanie:
Z obiektów ==
zawsze oznacza, że odniesienia są porównywane i będzie zawsze zwraca true, jeśli oba odniesienia są takie same. Jednak nie zawsze można polegać na uzyskaniu tego samego odwołania do obiektu (jak w przykładzie, w którym proste zmiany w zachowaniu lub w frameworkach takich jak Hibernate itp.), Dlatego zazwyczaj powinieneś używać equals(...)
.
Oczywiście można użyć ==
, jeśli potrzebna jest fizyczna równość (ten sam obiekt) zamiast logicznej równości (ta sama wartość).
Innym przykładem gdzie ==
miałyby różne wyniki, choć z locical punktu widzenia oba powinny być prawdziwe:
Integer l1 = 0;
Integer l2 = 0;
l1 == l2; //most often true, since Integer objects up to 127 are cached
Integer l1 = 1000;
Integer l2 = 1000;
l1 == l2; //most often false, since those are not cached anymore
Należy zauważyć, że z „najczęściej” To znaczy, że może się to zmienić pomiędzy wersjami Javy (jeśli nie różni się JVM), chociaż nie jest to bardzo prawdopodobne.
... co jest pół odpowiedź ... ;-) –