String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));
Это печатает:
ложный
правда
Может кто-нибудь объяснить, почему это так?
String s="abc"; // goes to string constants pool
String s4 = s +"" ;// has value "abc" but goes on heap and not in string constants pool
System.out.println(s4==s);//well,, the references are not equal. There are 2 diffrent instances with value="abc"
System.out.println(s4.equals(s)); // equals() checks for value and the values of both insatnces are equal.
s4=s+""
идет в кучу вместо пула ..
s+""
будет сделано с использованием StringBuilder
а затем он будет преобразован в String
помощью вызова stribgBuilder.toString()
. Итак, эта строка будет идти в кучу. Следует отметить одну вещь: если s помечен как final
, ==
даст true
потому что он превратит все выражение s+""
в постоянную времени компиляции.
Вот ваш код с выходом в комментарии -
String s="abc";
String s4 = s +"" ;
System.out.println(s4==s); //false
System.out.println(s4.equals(s)); //true
Первый - false
потому что он проверяет ссылку s4
и s
. Поскольку эти две ссылки разные, они вычисляются как false
. Здесь ==
(оператор равенства), применяемый к ссылочному типу, используется для проверки того, являются ли две ссылки одинаковыми или разными.
equals()
- метод, который достигается каждым ссылочным типом из класса объекта. Вы можете переопределить метод equals() для своего собственного класса.
Метод equals(s)
используется для проверки, имеет ли смысл два объекта или нет. Для класса String
осмысленно равнозначно, что две сравнивающие строки одинаковы, но их ссылки могут быть разными. Класс String
уже переопределяет метод equals()
и, следовательно, вам не нужно переопределять метод equals()
самостоятельно.
Теперь для понимания концепции пула строк рассмотрим следующий фрагмент кода -
String s5 = s;
System.out.println(s5); //abc
System.out.println(s5==s); //true
System.out.println(s5.equals(s)); //true
Здесь s5==s
оценивается как true. Поскольку s5
не ссылается на новый объект String. Он ссылается на существующий объект String (то есть - "abc", на который ссылается s
) в пуле string
. Теперь обе ссылки s5
и s4
равны. В последнем утверждении s5 и s s5.equals(s)
равны и, следовательно, s5.equals(s)
оцененные как true
.
Надеюсь, это поможет.
Большое спасибо.
s+""
создает экземпляр String в куче.