Распределение памяти пула строк

1
String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));

Это печатает:

ложный
правда

Может кто-нибудь объяснить, почему это так?

  • 1
    Это другой обман. Ответ должен быть - * s+"" создает экземпляр String в куче.
  • 0
    Кажется, это не дубликат остроконечного вопроса.
Теги:
string
string-pool

2 ответа

3
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.
  • 0
    Можете ли вы объяснить, почему s4=s+"" идет в кучу вместо пула ..
  • 4
    @ user153 - потому что за кулисами s+"" будет сделано с использованием StringBuilder а затем он будет преобразован в String помощью вызова stribgBuilder.toString() . Итак, эта строка будет идти в кучу. Следует отметить одну вещь: если s помечен как final , == даст true потому что он превратит все выражение s+"" в постоянную времени компиляции.
1

Вот ваш код с выходом в комментарии -

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.

Надеюсь, это поможет.
Большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню