В чем разница между строками, выделенными с помощью оператора new и без оператора new в java J2ME? - PullRequest
4 голосов
/ 05 августа 2011

В чем разница между

String str=new String("Thamilan");

и

String str="Thamilan";

в Java J2ME.

Ответы [ 5 ]

8 голосов
/ 05 августа 2011

В первом случае новый объект будет создаваться всегда, во втором случае объект из пула строк можно использовать повторно.Подробнее о String pool можно узнать здесь: Что такое String pool?

4 голосов
/ 05 августа 2011

Разница в том, что новая строка создает новый объект с тем же значением, что и передаваемый литерал:

    String s = "abc";
    String t = new String("abc");

    System.out.println(s==t); //false

    String u = "abc";
    String v = "abc";

    System.out.println(u==v);  //true

Это потому, что литерал всегда из внутреннего пула.

Возможно, вы захотите взглянуть на метод intern - вот его описание:

Возвращает каноническое представление для строкового объекта. Пул строк, изначально пустой, поддерживается частным образом классом String. При вызове метода intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String. Отсюда следует, что для любых двух строк s и t s.intern () == t.intern () истинно тогда и только тогда, когда s.equals (t) верно Все литеральные строки и строковые константные выражения интернированы. Строковые литералы определены в §3.10.5 Спецификации языка Java

2 голосов
/ 05 августа 2011

Ответ от Объявление Java String

   String str = new String("SOME") 

всегда создает новый объект в куче

    String str="SOME"  

использует пул строк

Попробуйте этот небольшой пример:

    String s1 = new String("hello");         
    String s2 = "hello";
     String s3 = "hello";
      System.err.println(s1 == s2);
     System.err.println(s2 == s3); 

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

1 голос
/ 05 февраля 2015
  1. String t = new String("abc"); Оператор 1 создаст объект в Heap и дополнительно поместит строковый литерал в пул с таким же значением.

Ссылочная переменная t будет ссылаться на объект в куче.

  1. String t = "abc";

Однако оператор 2 создаст объект в пуле строковых констант только в том случае, если объект с таким же значением отсутствует в пуле и t будет ссылаться на объект, помещенный в пул строковых констант.

0 голосов
/ 05 августа 2011

В 'Эффективной Java' говорится, что никогда не пишите код, подобный этому:

String s = new String("string");

Поскольку он создает ненужные объекты String.Но вместо этого это должно быть написано так:

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