Junior
Каква е разликата между създаването на низ с помощта на new String() и използването на литерал на низ?
sobes.tech AI
Отговор от AI
Когато използвате буквален низ ("abc"), низът се създава в пул от низове (String Pool). Ако вече съществува низ със същата стойност в пула, се връща препратка към съществуващия обект. Това е оптимизация за спестяване на памет.
При използване на new String("abc"), винаги се създава нов обект низ в купчината (heap), дори ако вече има низ със същата стойност в пула.
Пример:
// Създава се буквален низ "hello". Ако го няма в пула, се добавя.
// str1 препраща към обекта в пула.
String str1 = "hello";
// Отново се използва буквалният низ "hello". Тъй като вече е в пула,
// str2 също препраща към същия обект в пула като str1.
String str2 = "hello";
// Създава се нов обект низ със стойност "hello" в купчината.
// str3 препраща към този нов обект в купчината, а не към обекта в пула.
String str3 = new String("hello");
// Проверка на препратките:
// str1 и str2 препращат към един и същи обект в пула.
System.out.println(str1 == str2); // true
// str1 препраща към обекта в пула, str3 към новия обект в купчината.
System.out.println(str1 == str3); // false
// Проверка на стойността:
// Всички низове имат една и съща стойност.
System.out.println(str1.equals(str3)); // true
Разлики в таблицата:
| Критерий | Буквален низ ("abc") |
new String("abc") |
|---|---|---|
| Място на създаване | String Pool | Купчина (Heap) |
| Създаване на обект | Връща съществуващ или създава нов | Винаги създава нов обект |
| Оптимизация на паметта | Ефективно използва пула за повторения | Може да създаде дубли, по-малко ефективен |
Сравнение на препратки (==) |
Често true за низове със същата стойност |
Винаги false за отделно създадени низове със същата стойност |