Sobes.tech
Junior
156

Жолдызды құру кезінде new String() қолдану мен жолды литералды қолданудың айырмашылығы неде?

AI-дан жауап

sobes.tech AI

Строка латын әріптерімен ("abc") жазылған кезде, ол жолдар пулінде (String Pool) сақталады. Егер осындай мәні бар жол пулінде бұрыннан бар болса, ол объектінің сілтемесі қайтарылады. Бұл жадты үнемдеу үшін жасалған оңтайландыру.

new String("abc") қолданғанда, әрқашан жаңа жол объектісі жадта (heap) құрылады, тіпті егер осындай мәні бар жол пулінде бұрыннан бар болса да.

Мысал:

// "hello" жолының латын әріптерімен жазылған нұсқасы құрылады. Егер мұндай жол пулінде жоқ болса, ол қосылады.
// str1 пулдегі объектке сілтеме жасайды.
String str1 = "hello";

// Қайта "hello" латын әріптерімен жазылған жол пайдаланылады. Егер ол бұрыннан бар болса,
// str2 да сол пулдегі объектке сілтеме жасайды.
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 бөлек жасалған жолдар үшін