Смотри, это хитрая концепция.
Существует разница между:
// These are String literals
String a = "Hiabc";
String b = "abc";
String c = "abc";
и
// These are String objects.
String a = new String("Hiabc");
String b = new String("abc");
String c = new String("abc");
Если ваши строки были объектами, т.е.
String b = new String("abc");
String c = new String("abc");
Тогда два разных объекта были бы созданы в пуле строк в двух разных местах памяти и выполняли
b == c
привело бы к false
.
Но так как ваши String b
и String c
являются литералами,
b == c
результаты true
. Это потому, что два разных объекта не были созданы. И a
, и b
указывают на одну и ту же строку в памяти стека.
В этом разница. Вы правы, ==
сравнивает по расположению памяти. И это причина,
a.substring(2, 5) == b; // a,substring(2, 5) = "abc" which is at the location of b, and
b == c // will be true, coz both b and c are literals. And their values are compared and not memory locations.
Чтобы иметь две отдельные строки с одинаковыми значениями, но в разных местах в String pool
и NOT stack memory
, необходимо создать объекты String, как показано выше.
Итак,
a.substring(2, 5) == b; // and
b == c; // will be false. as not both are objects. Hence are stored on separate memory locations on the String pool.
вы должны использовать
a.substring(2, 5).equals(b);
b.equals(c);
для объектов.