new String("text");
явно создает новый и ссылочно выделенный экземпляр объекта String
; String s = "text";
может повторно использовать экземпляр из пула строковых констант, если он доступен.
Вы очень редко хотели бы использовать конструктор new String(anotherString)
. Из API:
blockquote>
String(String original)
: Инициализирует вновь созданный объектString
, чтобы он представлял ту же последовательность символов, что и Аргумент; Другими словами, вновь созданная строка является копией строки аргумента. Если явная копия оригинала не нужна, использование этого конструктора необязательно, поскольку строки неизменяемы.Связанные вопросы
- Строки Java: «String s = new String (« глупо »);«
- Строки - это объекты в Java, поэтому почему мы не используем «новое» для их создания?
Что означает референциальное различие
Изучите следующий фрагмент:
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)
. Однако необходимо повторить, что это очень своеобразно и редко является намерением.Ссылки
Связанные с этим вопросы
Идея состоит в том, чтобы избегать использования memoization для данных, которые имеют возможность изменения очень часто. Как указано в блоге, это также включает обратные вызовы, который зависит от таких типов данных. Например, функционирует такой как
<Foo onClick={() => handle(visitCount)}/>
, я действительно наслаждался этим упрощенным чтением. Примеры являются яркими. https://dmitripavlutin.com/use-react-memo-wisely /