Ответ немного сложнее, чем предлагают другие ответы.
Значение String, соответствующее литералу String в вашем исходном коде, создается один раз, когда классзагружен.Кроме того, эти строки автоматически "интернируются", что означает, что если один и тот же литерал появляется в более чем одном месте в любом классе , будет сохранена только одна копия строки.(Любые другие копии, , если они были созданы , будут собирать мусор.)
Когда приложение вызывает new String(...)
, когда оно оценивает выражение конкатенации String (т.е.оператор +
), или когда он вызывает один из многих библиотечных методов, которые создают строки под капотом, будет создана новая строка.
Итак, чтобы ответить на ваши вопросы:
1 - Следующее фактически не будет создавать строку вообще.Скорее, он вернет строку, созданную при загрузке класса:
return "some string";
2 - в следующем примере будут созданы две строки.Сначала он вызовет someObject.toString (), а затем объединит его с литералом, чтобы дать другую строку.
return "The answer is :" + someObject;
3 - следующее не создаст строку;см. 1.
throw new Exception("Some message");
4 - Следующее создаст две строки при его выполнении;см. 2.
throw new Exception(someObject + "is wrong");
(На самом деле, 3 и 4 скрывают тот факт, что создание исключения приводит к захвату сведений о стеке вызовов текущего потока, и эти сведения включают имя метода, имя класса и файлимя для каждого фрейма. Не указывается, когда строки, которые представляют эти вещи, фактически созданы или являются ли они интернированными. Таким образом, возможно , что акт создания объекта Exception вызывает создание рядаСтроки.)