В java строка примитив или объект?
Допустим, я создаю строку, присваивая её переменной A. Вопрос, в A хранится ссылка на эту строку или её значение. Если я присвою строковой переменной B значение A и изменю значение В, будет ли изменено значение А?
Бонусный вопрос. В чём различие этого:
String a = "hi!";
От этого:
String a = new String("hi!");
Надеюсь на обстоятельный ответ, так как только начал изучать java.
Ответы (2 шт):
Отвечу сразу на бонусный вопрос!) в первом случае новый объект может и не создаться, а вытянуться из пула констант а во втором случае принудительное создание нового объекта. То есть:
String a = "a";
String b = "a";
a == b // true
String a = new String("a");
String b = new String("a");
a == b // false
Строки в Java это обертка над byte[] value, что можно увидеть перейдя в класс String.class
String a = "f"; //Проверяется пулл констант, создается новый объект, ссылка на объект сохраняется в переменную a
String b = "f"; //Проверяется пулл констант, берется ссылка на уже созданный объект и сохраняется в переменную b
String c = new String("f"); // Создается новый объект
String d = a; //Ссылка на объект из одного чара "f" дублируется в переменную d
d = "g";
b = "l";
System.out.println(a); // f
System.out.println(b); // l
System.out.println(c); // f
System.out.println(d); // g
В Java строка является ссылочным типом данных. Но с оговоркой, что под капотом есть некая оптимизация которая называется String Pool. Это сделано потому что строки в Java используются очень часто.
Что такое String Pool? Всякий раз когда вы создаёте строку таким образом
String text = "Hello";
Компилятор проверяет создавалась ли ранее такая строка? Если такая строка уже есть, то вы просто получаете на нее ссылку. Если нет, то строка добавляется в пул.
String text = new String ("Hello");
Создание строки таким образом ничем не отличается от прошлого варианта, за исключением того, что строка "Hello" будет добавлена в пул в любом случае, независимом от того есть ли она уже там или нет.
Из этого есть некий вывод:
String text = "Hello";
String text2 = "Hello";
text == text2 - true т.к. ссылки будут одинаковые.
String text = new String ("Hello");
String text2 = new String ("Hello");
text == text2 - false т.к. ссылки будут ссылаться на разные ячейки в памяти