Sobes.tech
Junior

Пули сатрҳо дар Java чист?

sobes.tech AI

Ҷавоб аз AI

Пулҳои сатр (String Pool) минтақае дар heap (халта) JVM мебошад, ки дар он литералҳои сатр нигоҳ дошта мешаванд. Вақте JVM бо литералҳои сатр рӯбарӯ мешавад, аввал ин пулро санҷида мебинад. Агар сатр аллакай вуҷуд дошта бошад, ба объекте, ки аллакай вуҷуд дорад, ишора мекунад. Агар на, объекте нави сатр дар пул сохта мешавад ва ишора ба он баргардонида мешавад.

Манфиатҳо:

  • Эҳтиёт дар ёдгирӣ: чандин ишора метавонад ба як объекти сатр дар пул ишора кунад.
  • Кам кардани вақт: муқоисаи ишораҳо (==) барои сатрҳо дар пул нисбат ба муқоисаи мазмуни сатрҳо (equals()) суръатноктар аст.

Масалан:

// Сохтани сатр дар пул (агар он ҳанӯз вуҷуд надошта бошад)
String s1 = "hello";

// Баргардонидани ишора ба ҳамон объект "hello" аз пул
String s2 = "hello";

// s1 ва s2 ба ҳамон объект ишора мекунанд
System.out.println(s1 == s2); // Мегӯяд true

// Сохтани объект навии сатр "hello" дар heap, на дар пул
String s3 = new String("hello");

// s1 ва s3 ба объектҳои гуногун ишора мекунанд
System.out.println(s1 == s3); // Мегӯяд false

// Мазмуни сатрҳо баробар аст
System.out.println(s1.equals(s3)); // Мегӯяд true

Методи intern() метавонад барои илова кардани равшан ба сатр, ки бо new String() сохта шудааст, ба пул ё барои гирифтани ишора ба сатр дар пул бо мазмуни ҳамин истифода шавад.

// Сохтани объект навии сатр "world" дар heap
String s4 = new String("world");

// Илова кардани "world" ба пул (агар он ҳанӯз дар он набошад) ва баргардонидани ишора
String s5 = s4.intern();

// Сохтани сатр дар пул (ишора ба ҳамон объект, ки ҳоло ба он ишора мекунад s5)
String s6 = "world";

// s5 ва s6 ба ҳамон объект дар пул ишора мекунанд
System.out.println(s5 == s6); // Мегӯяд true