Строки Java и StringPool - PullRequest
       12

Строки Java и StringPool

2 голосов
/ 14 декабря 2009
public String makinStrings() {
   String m = "Fred47";
   String s = "Fred";
   s = s + "47";
   s = s.substring(0);
   return s.toString();
} 

Сколько объектов создано кодом?

Я сделал простой тест:

public static void main(String[] args) {
   String m = "a";
   m += "bc";
   String s1 = "mabc".substring(1);
   String s2 = "abc";

   System.out.println(m == "abc");
   System.out.println(m == s1);
   System.out.println(m == s2);
   System.out.println(s1 == s2);
}

Разве результат не должен быть "true, true, true, true", если m, s1, s2 указывают на один и тот же объект ("abc")? Вместо этого результат «ложь, ложь, ложь, ложь»!

Ответы [ 2 ]

5 голосов
/ 14 декабря 2009

Результат будет истинным в этом случае - но m, s1 и s2 все ссылаются на разные строки. Интернирование выполняется автоматически для константных строковых выражений и может быть явно вызвано путем вызова метода intern, но это не происходит для конкатенации строк и подстрок автоматически.

В реализации Java 7 от Sun x.substring(0) будет фактически возвращать ту же ссылку (x) обратно, но я не верю, что это гарантировано API.

Чтобы посмотреть на ваш пример:

public String makinStrings() {
   String m = "Fred47";
   String s = "Fred";
   s = s + "47";
   s = s.substring(0);
   return s.toString();
}

Первые две строки требуют, чтобы в памяти было две строки, но я точно не знаю, когда гарантируется, что объекты будут созданы. Как только они создали , они останутся без присмотра - поэтому повторный вызов makinStrings больше не создаст этих двух строк.

Конкатенация строк создаст новый объект строки.

substring вызов не создаст новый строковый объект в реализации, на которую я смотрел - но это могло бы быть.

Вызов s.toString() не не создаст новую строку (и это указано в JavaDoc).

0 голосов
/ 14 декабря 2009

Нет, только то, что две строки равны, не означает, что их ссылки равны.

Компиляция интернирует некоторые строки для экономии места, поэтому, если вы попробуете:

String s1 = "abc";
String s2 = "abc";

Тогда s1 == s2 будет истинным, но это особый случай, а не общее правило. В целом строки, генерируемые во время выполнения, по умолчанию не используют одну и ту же ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...