Sobes.tech
Junior

Javaда жолдор пулу деген эмне?

sobes.tech AI

AIден жооп

String pool — бул Javaнын heap (жыйнак) эсинде сакталган атайын бөлүм, анда саптардын литералдары жана интернирленген саптар сакталат. Анын негизги максаты — бирдей сап маанилерди кайра колдонуу аркылуу эс тутумду үнөмдөө.

Кандай иштейт:

Саптын литералын (мисалы, "hello") түзгөндө JVM биринчи кезекте ошол маанидеги сап бар экенин текшерет.

  • Эгер бар болсо: JVM ал сапка шилтемени кайтарат, жаңы объект түзбөй.
  • Эгер жок болсо: JVM жаңы String объектисин пулда түзүп, шилтемени кайтарат.

Саптарды жана пулду түзүү:

  1. Саптын литералын колдонуу:
    // "hello" — саптын литералы
    String s1 = "hello";
    String s2 = "hello";
    // s1 жана s2 бир эле объектке шилтемени көрсөтөт
    
  2. new String() конструкторун колдонуу:
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 жана s4 ар башка объекттерге шилтемени көрсөтөт, эгерде маанилери бирдей болсо да.
    // "world" саптын литералы пулда болушу мүмкүн, бирок s3 жана s4 — андан тышкары.
    
  3. 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