Java: вопрос для начинающих относительно строк - PullRequest
7 голосов
/ 11 апреля 2019

При создании строки в Java, в чем разница между этими двумя:

String test = new String();
test = "foo";

и

String test = "foo";

Когда мне нужно использовать ключевое слово new?Или эти два в основном одинаковы и оба создают новый объект String?

Ответы [ 3 ]

4 голосов
/ 11 апреля 2019

В первом фрагменте вы создаете новую пустую строку, а затем сразу же перезаписываете ее строковым литералом.Новая строка, которую вы создали, потеряна и в конечном итоге будет собрана сборщиком мусора.Создавать его бессмысленно, и вы должны просто использовать второй фрагмент.

0 голосов
/ 11 апреля 2019

Вот пример программы, которая поможет вам понять, как работают строки в Java.

import java.util.Objects;

public class TestStrings {

    public static void main(String[] args) {
        String test = new String();
        System.out.println("For var test value is '"+ test+ "' and object identity is "+ System.identityHashCode(test));
        test = "foo";
        System.out.println("For var test after reassignment value is '"+ test+ "' and object identity is "+ System.identityHashCode(test));
        String test2 = "foo";
        System.out.println("For var test2 value is '"+ test2+ "' and object identity is "+ System.identityHashCode(test2));
        String test3 = new String("foo");

        System.out.println("For var test3 value is '"+ test3+ "' and object identity is "+ System.identityHashCode(test3));
    }
}

Запустите это, чтобы увидеть, что происходит с хеш-кодом идентификатора, напечатанным для переменных test, test2 и * 1006.*.

По сути, Java пытается оптимизировать процесс создания строк, когда они создаются как литералы.Java пытается поддерживать пул строк, и если вы снова используете тот же литерал, он использует тот же объект из этого пула строк.Это может быть сделано, потому что строки в Java неизменны.

Подробнее об этом можно прочитать на этом вопросе Что такое интернирование Java String?

0 голосов
/ 11 апреля 2019

new String() создаст новый экземпляр строки объекта с собственным хэш-кодом идентификации. При создании такой строки String string = "myString"; Java будет пытаться повторно использовать эту строку, выполняя поиск уже созданной строки, чтобы найти эту точную строку. Если он найден, он вернет тот же хеш-код этой строки. Это приведет к тому, что если вы создаете, например, хэш-код строки идентификатора, вы получите то же значение.

Пример:

public class Stringtest {
   public static void main(String[] args) {
      final String s = "myString";
      final String s2 = "myString";
      final String otherS = new String("myString");

      //S and s2 have the same values
      System.out.println("s: " + System.identityHashCode(s));
      System.out.println("s2: " + System.identityHashCode(s2));

      //The varaible otherS gets a new identity hash code
      System.out.println("otherS: " + System.identityHashCode(otherS));
   }
}

В большинстве случаев вам не нужно создавать новый объект строки, потому что у вас нет статических значений при работе, например, с. HashMap с или подобные вещи.

Итак, создавайте новые строки с new String только тогда, когда это действительно необходимо. В основном используйте String yourString = "...";.

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