Строки также статичны: создание строк в методах - PullRequest
3 голосов
/ 24 января 2011

Я знаю, что во время компиляции, когда создается String, эта строка будет строкой, используемой всеми объектами этой конкретной подписи.

String s = "foo"; <- Любые другие идентичные строки будут просто ссылками на этот объект. </p>

Применимо ли это к строкам, созданным во время выполнения методов? У меня есть некоторый код, где объект содержит кусок строковых данных. Оригинальный код - что-то вроде

for(datum :data){
    String a = datum.getD();  //getD is not doing anything but returning a field

    StringBuffer toAppend = new StringBuffer(a).append(stuff).toString();

    someData = someObject.getMethod(a);
    //do stuff

}

Поскольку String уже был создан в data, кажется, лучше просто вызывать datum.getD() вместо создания строки на каждой итерации цикла.

Разве что-то мне не хватает?

Ответы [ 3 ]

7 голосов
/ 24 января 2011

String экземпляры совместно используются, когда они являются результатом константного выражения времени компиляции. В результате в приведенном ниже примере a и c будут указывать на один и тот же экземпляр, но b будет другим экземпляром, даже если все они представляют одно и то же значение:

String a = "hello";
String b = hell() + o();
String c = "hell" + "o";

public String hell() {
   return "hell";
}

public String o() {
   return "o";
}

Вы можете явно интернировать строку, однако:

String b = (hell() + o()).intern();

В этом случае все они будут указывать на один и тот же объект.

3 голосов
/ 24 января 2011

Линия

 String a = datum.getD();

означает, присвоить результат оценки datum.getD() эталону a.Он не создает новую строку.

0 голосов
/ 24 января 2011

Вы правы, что строки неизменны, поэтому все ссылки на одно и то же строковое значение используют один и тот же объект.Что касается статичности, я не думаю, что строки являются статичными в том виде, как вы описываете.Класс Class подобен этому, но я думаю, что это единственный объект, который делает это.

Я думаю, что было бы лучше просто вызвать datum.getD(), поскольку нет ничего, что вытягивало бы его в егоСобственный объект Sting получает для вас.

Если вы используете datum.getD() несколько раз в цикле, то может иметь смысл перенести значение в объект String, потому что стоимость создания объекта string один разможет быть меньше, чем стоимость вызова функции getD() несколько раз.

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