Я не впевнений у JavaScript, але в Java, рядки роблять додатковий крок до незмінності за допомогою "String Constant Pool". Рядки можуть бути побудовані за допомогою рядкових літералів ( "foo"
) або з String
конструктором класу. Рядки, побудовані за допомогою рядкових літералів, є частиною String Constant Pool, і той самий рядковий літерал завжди буде однаковою адресою пам'яті з пулу.
Приклад:
String lit1 = "foo";
String lit2 = "foo";
String cons = new String("foo");
System.out.println(lit1 == lit2); // true
System.out.println(lit1 == cons); // false
System.out.println(lit1.equals(cons)); // true
У вищесказаному обидва lit1
і lit2
будуються за допомогою одного і того ж літерального рядка, тому вони вказують на одну і ту ж адресу пам'яті;lit1 == lit2
призводить до того true
, що вони є абсолютно одним і тим же об'єктом.
Однак cons
побудований за допомогою конструктора класів. Хоча параметр є однаковою строковою константою, конструктор виділяє нову пам'ять для cons
, тобто cons
не є тим самим об'єктом, що lit1
іlit2
, незважаючи на те, що містить ті самі дані.
Звичайно, оскільки всі три рядки містять однакові символьні дані, використовуючи equals
методу повернеться true.
(Звичайно, обидва типи струнних конструкцій незмінні)