Junior
Javaда жолдор пулу деген эмне?
sobes.tech AI
AIден жооп
String pool — бул Javaнын heap (жыйнак) эсинде сакталган атайын бөлүм, анда саптардын литералдары жана интернирленген саптар сакталат. Анын негизги максаты — бирдей сап маанилерди кайра колдонуу аркылуу эс тутумду үнөмдөө.
Кандай иштейт:
Саптын литералын (мисалы, "hello") түзгөндө JVM биринчи кезекте ошол маанидеги сап бар экенин текшерет.
- Эгер бар болсо: JVM ал сапка шилтемени кайтарат, жаңы объект түзбөй.
- Эгер жок болсо: JVM жаңы
Stringобъектисин пулда түзүп, шилтемени кайтарат.
Саптарды жана пулду түзүү:
- Саптын литералын колдонуу:
// "hello" — саптын литералы String s1 = "hello"; String s2 = "hello"; // s1 жана s2 бир эле объектке шилтемени көрсөтөт new String()конструкторун колдонуу:String s3 = new String("world"); String s4 = new String("world"); // s3 жана s4 ар башка объекттерге шилтемени көрсөтөт, эгерде маанилери бирдей болсо да. // "world" саптын литералы пулда болушу мүмкүн, бирок s3 жана s4 — андан тышкары.intern()ыкмасын колдонуу:String s5 = new String("java"); // intern() ыкмасы ошол маанидеги сап пулда бар-жогун текшерет String s6 = s5.intern(); // Эгер бар болсо, пулдагы объектке шилтемени кайтарат. // Эгер жок болсо, учурдагы сапты пулга кошуп, шилтемени кайтарат.
Пулдун артыкчылыктары:
- Эс тутуму үнөмдөө: Кайталаган сап объекттеринин санын азайтат.
- Өнүмдүүлүктү жогорулатуу: Литерлдык саптарды салыштыруу (
==)Stringобъекттерин салыштырууга караганда тезирээк болушу мүмкүн, эгер эки операнд да пулда бир эле объектке шилтемени көрсөтсө.
Маанилүү:
== оператору менен саптарды салыштыруу эки өзгөрмө бир эле объектке шилтемени көрсөтүп жатканына текшерет. Саптардын мазмунун салыштыруу үчүн ар дайым equals() ыкмасын колдонуңуз:
String str1 = "abc"; // Пулда
String str2 = "abc"; // Пулда, бир эле шилтеме
String str3 = new String("abc"); // Пулдан тышкары
String str4 = str3.intern(); // Пулда, бир эле шилтеме, как `str1` жана `str2`
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true