Рубрики
Без рубрики

Пул строк Java

Мы знаем, что в Java строки хранятся в области кучи памяти. Внутри этой кучи памяти находится spe… Помеченный java, string, jvm, 100daysofcode.

Мы знаем, что в Java строки хранятся в области памяти heap . Внутри этой кучи памяти есть определенная область памяти, называемая String Pool . Когда мы создаем строковые примитивы, они будут храниться в области памяти пула строк благодаря неизменяемости java string.

Обратитесь к следующему коду.

public class StringPoolDemo{
    public static void main(String[] args){
        String a = "hello";
        String b = "hello";
    }
}

Оба строковых примитива a и b одинаковы. Таким образом, без создания двух строковых объектов в куче JVM может создать только одну строку и подключить обе ссылочные переменные к одному и тому же строковому объекту. Когда это произойдет, строковые объекты будут созданы внутри специальной области памяти, называемой stringpool кучи.

Этот пул строк представляет собой большую хэш-карту . Все строки будут сохранены как элементы хэш-карты.

Но история немного отличается, когда дело доходит до создания строк с помощью конструктора. Потому что в это время строка будет вести себя как объект, а не как примитив. Таким образом, строковый объект будет создан внутри кучи. Не в пуле строк.

Кроме того, мы можем добавлять строки в область памяти пула строк вручную с помощью функции String.intern() .

public class StringPoolDemo{
  public static void main(String[] args){
    String s = "hello world";
    s.intern();
  }
}

При выполнении этого кода s будет сохранен в памяти пула строк.

Давайте напишем какой-нибудь код, чтобы проверить это.

public class StringPoolDemo{
  public static void main(String[] args){
    String a = "hello";
    String b = "hello";

    System.out.println(a.equals(b));  // true
    System.out.println(a == b);       // true
  }
}

В обоих выходных данных мы получаем true в качестве выходных данных. Таким образом, мы можем сказать, что оба a и b ссылка на один и тот же строковый объект.

Вы можете использовать -XX:+PrintStringTableStatistics флаг JVM, чтобы увидеть, сколько сегментов доступно в вашем пуле строк JVM и сколько из них используется.

Если ваше приложение содержит огромное количество строковых примитивов, вы можете добиться значительной эффективности, увеличив размер пула строк с помощью -XX: StringTableSize= .

Обязательно используйте простое число в качестве значения для достижения наилучшей производительности.

Оригинал: “https://dev.to/buddhikac96/java-string-pool-2j56”