Чем отличается вот такая конструкция:
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");
}
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 = ("Петин номер"); и его ссылка теперь указывает на новый объект.
А твоя не изменилась, он по-прежнему Колян.
Объекты 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".
Взято отсюда.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости