Строки в Java и разные конструкции

153
28 апреля 2019, 08:50

Чем отличается вот такая конструкция:

String name = "Tom";

от такой:

String name = new String("Jerry");

Не очень еще понимаю что такое ссылка.
Зачем делать вот так?

public void foo(){
   new String("Моя строка");
}

Если можно сделать вот так:

public void foo(){
  String name = "Mike";
}

Или же

public void foo(){
      String name = new String("John");
    }
Answer 1

String name = "Tom" в первый раз создаёт в памяти строковый литерал.
Последующее использование того же литерала вызовет создание новой ссылки на то же место.
String cat = "Tom" будет использовать ту же строку, адреса одинаковые.

String name = new String("Jerry"); создаёт новый объект в памяти.
Если сделать String mouse = new String("Jerry"); - создаётся ещё один объект в памяти. Адреса разные, т.е. строка "Jerry" дважды хранится.

Есть ещё тонкость. Сравнение с помощью "==" проверяет идентичность адресов, а метод String.equals выполняет сравнение содержимого. Поэтому name==mouse вернёт false - адреса-то разные.

Этот пример:

public void foo(){
   new String("Моя строка");
}

не имеет большого смысла. Ссылку на новый объект же надо куда-то назначить. В языках без сбора мусора такой код приведёт к утечке памяти, в Java висячий объект должен быть утилизирован. Для остальных примеров описанное остаётся в силе.

Не очень еще понимаю что такое ссылка.

У тебя в телефоне записан "Колян" и его номер.
У его мамы записан "сынок" и его номер.
У начальника в телефоне записан "сисадмин" и его номер.
У подруги записан "ушастый зая" и его номер.
Колян один, а ссылок на него может быть несколько.

Колян уволился, начальник нанял нового сисадмина. Ссылка в его телефоне стала невалидной (в Java сборщик может за этим следить, но в данном контексте неактуально).
Он нанял нового sysadm = ("Петин номер"); и его ссылка теперь указывает на новый объект.
А твоя не изменилась, он по-прежнему Колян.

Answer 2

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

Последние два примера - это переменные, которые хранят ссылки на объект. В 3-м примере вы просто создаете объект, без ссылки. Поэтому у вас не будет к нему доступа и он скорее всего удалится сборщиком мусора.

Соответствующий отрывок из JLS 7 3.10.5:

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28), "интернированы", чтобы обмениваться уникальными экземплярами, используя метод String.intern.

Пример:

        String hello = "Hello", lo = "lo";
        System.out.print((hello == "Hello") + " ");
        System.out.print((Other.hello == hello) + " ");
        System.out.print((other.Other.hello == hello) + " ");
        System.out.print((hello == ("Hel"+"lo")) + " ");
        System.out.print((hello == ("Hel"+lo)) + " ");
        System.out.println(hello == ("Hel"+lo).intern());

Выведет true true true true false true.

Язык программирования Java требует, чтобы идентичные строковые литералы (то есть литералы, содержащие одну и ту же последовательность кодовых точек) должны относиться к одному экземпляру класса String (JLS §3.10.5). Кроме того, если метод String.intern вызывается в любой строке, результатом является ссылка на тот же экземпляр класса, который будет возвращен, если эта строка появилась как литерал. Таким образом, следующее выражение должно иметь значение true: ("a" + "b" + "c").intern() == "abc".

Взято отсюда.

READ ALSO
Как узнать что картинка с сервера полностью загружена

Как узнать что картинка с сервера полностью загружена

Есть способ загрузки cover-ов в новостной ленте: перебор массива с урлами и загрузка:

183
Media Player Play\Pause

Media Player Play\Pause

На одной activity несколько блоков (около 10) текста и под каждым блоком звук, который воспроизводятся при нажатии на Play

237
IDEA не импортирует java.util.List

IDEA не импортирует java.util.List

Столкнулся с проблемой, что IDEA не хочет импортировать javautil

201
Как отследить “натяжение” анимации в RecycleView

Как отследить “натяжение” анимации в RecycleView

Подскажите пожалуйста, как отследить значения анимации при конце/начале скролингаДля понимания см

190