Безопасно «одолжите» блок памяти другому потоку в C, не допуская «одновременного доступа»

new String("text"); явно создает новый и ссылочно выделенный экземпляр объекта String; String s = "text"; может повторно использовать экземпляр из пула строковых констант, если он доступен.

Вы очень редко хотели бы использовать конструктор new String(anotherString). Из API:

String(String original) : Инициализирует вновь созданный объект String, чтобы он представлял ту же последовательность символов, что и Аргумент; Другими словами, вновь созданная строка является копией строки аргумента. Если явная копия оригинала не нужна, использование этого конструктора необязательно, поскольку строки неизменяемы.

Связанные вопросы


Что означает референциальное различие

Изучите следующий фрагмент:

    String s1 = "foobar";
    String s2 = "foobar";

    System.out.println(s1 == s2);      // true

    s2 = new String("foobar");
    System.out.println(s1 == s2);      // false
    System.out.println(s1.equals(s2)); // true

== по двум ссылкам типы - это сравнение ссылочной идентичности. Два объекта equals не обязательно ==. Обычно неверно использовать == для ссылочных типов; большую часть времени equals нужно использовать вместо этого.

Тем не менее, если по какой-то причине вам нужно создать две строки equals, но не ==, вы можете используйте конструктор new String(anotherString). Однако необходимо повторить, что это очень своеобразно и редко является намерением.

Ссылки

Связанные с этим вопросы

21
задан bolov 14 December 2017 в 12:40
поделиться