Подтвердить что ты не робот

В чем разница между инициализациями строк новым String() и новым String ("") в Java?

В чем разница между следующими двумя инициализациями в Java?

  • String a = new String();
  • String b = new String("");
4b9b3361

Ответ 1

Ну, они почти одинаковы.

public static void main(String[] args) {
    String s1 = new String();
    String s2 = new String(""); 
    System.out.println(s1.equals(s2)); // returns true.
}

Незначительные различия (довольно незначительные):

  • new String(); занимает меньше времени, чем new String("");, потому что конструктор копирования делает много вещей.

  • new String("") добавляет пустой String ("") в пул констант String, если он еще не присутствует.

Кроме этого, других различий не существует

Примечание. Использование new String("abc") почти всегда плохо, потому что вы будете создавать 2 строки в пуле строковых констант, а другое - в куче с тем же значением.

Ответ 2

Java Docs объясняет это красиво

Это два разных вызова конструктора

public String()

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

public String(String original)

Инициализирует вновь созданный объект String, чтобы он представлял та же последовательность символов, что и аргумент; другими словами, недавно Созданная строка - это копия строки аргумента. Если явный требуется копия оригинала, использование этого конструктора не требуется поскольку строки являются неизменными.

Ответ 3

Внутри будут вызываться разные конструкторы.

Однако результирующие объекты String будут идентичны по содержимому и равным (a.equals(b) вернет true)

Ответ 4

В первом случае вы создаете только один объект String во втором случае два: "" и new String, если "" объект уже не существует в пуле строк.

  • Инициализирует вновь созданный объект String, чтобы он представлял пустая последовательность символов.

  • Инициализирует вновь созданный объект String, чтобы он представлял та же последовательность символов, что и аргумент; другими словами, недавно Созданная строка - это копия строки аргумента.

Ответ 5

TheLostMind в основном верен, но я хотел бы добавить, что конструктор копирования на самом деле не так много делает:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/lang/String.java#137

 137  public String() {
138 this.value = new char [0];
139}

151 public String (String оригинал) {< br/ "> 152 this.value = original.value;
153 this.hash = original.hash;
154}

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

В любом случае, я бы рекомендовал использовать строковый литерал "", потому что вы можете сохранить ссылку на объект, если вы используете эту строку в другом месте. Используйте конструктор String, если вам действительно нужна копия этой строки, которая больше нигде не используется.

Ответ 6

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

Ответ 7

С чисто практической точки зрения между этими построениями существует нулевая разница, так как никогда не было причин когда-либо использовать их. Они являются расточительными и чрезмерно сложными и, следовательно, одинаково бессмысленными.

Чтобы инициализировать переменную с пустой строкой, выполните:

String s = "";

Это более короткий и понятный тип и позволяет избежать создания каких-либо объектов String, поскольку один общий экземпляр "" в первом пуле, безусловно, уже был загружен каким-либо другим классом.