что такое пул строк
Java Challengers #2: Сравнение строк
У нас как всегда много опаздывающих к началу курса, так что только вчера провели второе занятие среди нового потока «Разработчик Java». Но это так, мелочи жизни, а пока что мы продолжаем публикацию серии статей Java Challengers, перевод которых подготовили для вас.
Когда вы смотрите на класс String в Java, вы можете увидеть как инкапсулирован массив char :
Чтобы лучше понять инкапсуляцию, представьте физический объект: машину. Нужно ли вам знать, как работает автомобиль под капотом, чтобы управлять им? Конечно, нет, но вы должны знать, что делают интерфейсы автомобиля: педаль газа, тормоза и рулевое колесо. Каждый из этих интерфейсов поддерживает определенные действия: ускорение, торможение, поворот налево, поворот направо. То же самое и в объектно — ориентированном программировании.
Что такое пул строк (String pool)
Строки в пуле строк
Исключение — оператор new
Теперь посмотрите на этот код — он выглядит похожим на предыдущий пример, но здесь есть отличие.
Native-методы в Java — это методы, которые будут компилироваться с использованием языка C, обычно с целью управления памятью и оптимизации производительности.
Пулы строк и метод intern()
Для хранения строк в пуле используется способ, называемый «интернирование строк» (String interning).
Вот, что Javadoc говорит нам о методе intern() :
Метод intern() используется для хранения строк в пуле строк. Во-первых, он проверяет, существует ли уже созданная строка в пуле. Если нет, то создает новую строку в пуле. Логика пула строк основана на паттерне Flyweight.
Теперь, обратите внимание, что происходит, когда мы используем new для создания двух строк:
Метод equals в классе String
Наиболее распространенные методы String
Есть ещё одна вещь, которую вам нужно знать, прежде чем решить задачку на сравнение строк.
Рассмотрим наиболее распространённые методы класса String :
Решите задачку на сравнение строк
Правильный ответ приведён в конце статьи.
Что сейчас произошло? Понимание поведения String
В первой строке мы видим:
Использование new приводит к созданию двух новых строк и не важно равны их значения или нет. В этом случае сравнение будет false даже если значения одинаковые.
Окончательно, мы имеем:
Распространенные ошибки со строками
Бывает трудно определить, указывают ли две строки на один и тот же объект или нет, особенно когда строки содержат одно и то же значение. Полезно помнить, что использование new всегда приводит к созданию нового объекта в памяти, даже если значения строк одинаковые.
Использование методов класса String для сравнения ссылок на объекты также может быть сложным. Особенность в том, что если метод изменяет что-то в строке, то будут разные ссылки на объекты.
Несколько примеров, которые помогут прояснить:
Это сравнение будет истинным, потому что метод trim() не создает новую строку.
В этом случае первый метод trim() генерирует новую строку, так как метод будет выполнять свою работу и поэтому ссылки будут разные.
Наконец, когда trim() выполнит свою работу, он создает новую строку:
Что нужно помнить о строках
Строки не изменяемые, поэтому состояние строки изменить нельзя.
Для экономии памяти JVM хранит строки в пуле строк. При создании новой строки JVM проверяет ее значение и указывает на существующий объект. Если в пуле нет строки с этим значением, то JVM создаёт новую строку.
Оператор » == » сравнивает ссылки на объект. Метод equals() сравнивает значения строк. То же правило будет применяться ко всем объектам.
При использовании оператора new будет создана новая строка в хипе (Прим. переводчика — в оригинале написано, что в пуле, но это не так, спасибо zagayevskiy), даже если есть строка с тем же значением.
Ответ
Ответ на эту задачу — D. Вывод будет 12568.
Строки (String) в Java. Особенности, проблемы, пул строк, создание и работа со строками
Строки в Java — это большая, и не такая уж простая тема. Чтобы разобраться в строках, придется потратить некоторое время. Строки отличаются от обычных объектов в Java и имеют свои особенности. Если вы думаете, что разбираетесь в строках, давайте я задам вам один вопрос.
Что выведет данная программа?
Не уверены в ответе? Давайте разбираться подробно и к концу данной статьи вы точно будете знать, что тут происходит.
Что такое строка (string) в Java?
Почему это вообще важно? Представьте, что вам нужно обработать 100.000 строк (например, разобрать по частям какую-нибудь книгу или большую базу данных). Если вы будете каждый раз соединять строки таким образом, то вы создадите в программе огромное количество объектов. Всё это будет работать медленно. Поэтому, если вам нужно много изменять строку, лучше использовать StringBuffer или StringBuilder (я про них еще не писал, поищите информацию в интернете, если интересно).
Я рекомендую хотя бы пролистать официальную документацию по строкам от Oracle, чтобы узнать, какие методы и возможности поддерживает класс String.
Что такое пул строк (string pool) в Java и зачем он нужен?
Пул строк (string pool) в Java, как понятно из описания, это некий пул (или список) объектов класса String, который хранится в специальном месте кучи (Java Heap). Разработчики Java сделали так, чтобы оптимизировать выделение памяти и хранение строк, ускорить и оптимизировать работу с ними.
Пул строк работает следующим образом: когда мы создаем строку с помощью конструкции
Эта строка попадает в пул строк. Когда мы создаем другую строку с тем же значением:
По этой причине следующая конструкция выведет true (вы же не забыли, что мы работаем не с самими объектами, а со ссылками на них?):
Создание строки как нового объекта
В этом случае объект будет создан, причем будет создан в куче. Таким образом следующий код:
Всё происходящее отлично иллюстрируется следующим изображением, которое я нашел в интернете (кто я такой, чтобы что-то рисовать, хаха):
Метод intern() класса String
При создании объекта для новой строки через оператор new мы можем также попросить JVM поискать эту строку в пуле строк с помощью метода intern(), следующим образом:
В данном случае, если у нас уже есть такая строка в пуле строк, то будет возвращена ссылка на строку из пула строк, и новый объект создан не будет.
Что такое пул строк в Java?
Я запутался в StringPool на Java. Я натолкнулся на это, читая главу String на Java. Пожалуйста, помогите мне понять, с точки зрения непрофессионала, что на самом деле делает StringPool.
ОТВЕТЫ
Ответ 1
Это выводит true (хотя мы не используем метод equals : правильный способ сравнения строк)
Когда компилятор оптимизирует ваши строковые литералы, он видит, что оба s и t имеют одинаковое значение и, следовательно, вам нужен только один строковый объект. Это безопасно, потому что String неизменен в Java.
В результате оба s и t указывают на один и тот же объект и немного сохраненной памяти.
Имя «пул строк» исходит из идеи, что вся уже определенная строка хранится в некотором «пуле» и перед созданием нового компилятора объекта String проверяет, определена ли такая строка.
Ответ 2
Я не думаю, что это на самом деле много, похоже, это просто кеш для строковых литералов. Если у вас несколько строк, значения которых одинаковы, все они укажут на один и тот же строковый литерал в пуле строк.
В случае 1 буквально s1 создается и сохраняется в пуле. Но в случае 2, буква s2 ссылается на s1, вместо этого он не будет создавать новый.
Ответ 3
Начните с цитаты из спецификации виртуальной машины:
Загрузка класса или интерфейса, который содержит строковый литерал, может создать новый объект String (§2.4.8) для представления этого литерала. Это может не произойти, если объект String уже создан для представления предыдущего вхождения этого литерала или если метод String.intern был вызван на объект String, представляющий ту же строку, что и литерал.
Это не тот случай, если мы используем конструктор:
Опять же, «one» создается в пуле, но затем мы создаем новый экземпляр из одного и того же литерала, и в этом случае он приводит к (a == b) && (a.equals(b)) == false
Итак, почему у нас есть пул строк? Строки и особенно строковые литералы широко используются в типичном Java-коде. И они неизменны. И, будучи непреложным, можно кэшировать String для экономии памяти и повышения производительности (меньше усилий для создания, меньше мусора для сбора).
В качестве программистов нам не нужно много заботиться о пуле String, если мы помним:
Ответ 4
Java Challengers #2: Сравнение строк
Сравнение строк – увлекательная тема. Мы не только рассмотрим строки в Java, но также проанализируем популярные приемы и решим задачу.
У нас как всегда много опаздывающих к началу курса, так что только вчера провели второе занятие среди нового потока «Разработчик Java». Но это так, мелочи жизни, а пока что мы продолжаем публикацию серии статей Java Challengers, перевод которых подготовили для вас.
Когда вы смотрите на класс String в Java, вы можете увидеть, как инкапсулирован массив char :
Чтобы лучше понять инкапсуляцию, представьте физический объект: машину. Нужно ли вам знать, как работает автомобиль под капотом, чтобы управлять им? Конечно, нет, но вы должны знать, что делают интерфейсы автомобиля: педаль газа, тормоза и рулевое колесо. Каждый из этих интерфейсов поддерживает определенные действия: ускорение, торможение, поворот налево, поворот направо. То же самое и в объектно-ориентированном программировании.
Что такое пул строк (String pool)
Строки в пуле строк
Напомним, что в Java оператор » == » используется для сравнения двух объектов и определения того, один и тот же это объект или нет.
Исключение – оператор new
Теперь посмотрите на этот код – он выглядит похожим на предыдущий пример, но здесь есть отличие.
Native-методы
Native-методы в Java – это методы, которые будут компилироваться с использованием языка C, обычно с целью управления памятью и оптимизации производительности.
Пулы строк и метод intern()
Для хранения строк в пуле используется способ, называемый «интернирование строк» (String interning).
Вот, что Javadoc говорит нам о методе intern() :
Метод intern() используется для хранения строк в пуле строк. Во-первых, он проверяет, существует ли уже созданная строка в пуле. Если нет, то создает новую строку в пуле. Логика пула строк основана на паттерне Flyweight.
Теперь обратите внимание, что происходит, когда мы используем new для создания двух строк:
Метод equals в классе String
Наиболее распространенные методы String
Есть ещё одна вещь, которую вам нужно знать, прежде чем решить задачку на сравнение строк.
Рассмотрим наиболее распространённые методы класса String :
Решите задачку на сравнение строк
Правильный ответ приведён в конце статьи.
Что сейчас произошло? Понимание поведения String
В первой строке мы видим:
Использование new приводит к созданию двух новых строк, и не важно, равны их значения или нет. В этом случае сравнение будет false даже если значения одинаковые.
Распространенные ошибки со строками
Бывает трудно определить, указывают ли две строки на один и тот же объект или нет, особенно когда строки содержат одно и то же значение. Полезно помнить, что использование new всегда приводит к созданию нового объекта в памяти, даже если значения строк одинаковые.
Использование методов класса String для сравнения ссылок на объекты также может быть сложным. Особенность в том, что если метод изменяет что-то в строке, то будут разные ссылки на объекты.
Несколько примеров, которые помогут прояснить:
Это сравнение будет истинным, потому что метод trim() не создает новую строку.
В этом случае первый метод trim() генерирует новую строку, так как метод будет выполнять свою работу, и поэтому ссылки разные.
Наконец, когда trim() выполнит свою работу, он создает новую строку:
Что нужно помнить о строках
Ответ
Ответ на эту задачу – D. Вывод будет 12568.
Что такое пул строк в Java?
Я запутался в StringPool на Java. Я натолкнулся на это, читая главу String на Java. Пожалуйста, помогите мне понять, с точки зрения непрофессионала, что на самом деле делает StringPool.
ОТВЕТЫ
Ответ 1
Это выводит true (хотя мы не используем метод equals : правильный способ сравнения строк)
Когда компилятор оптимизирует ваши строковые литералы, он видит, что оба s и t имеют одинаковое значение и, следовательно, вам нужен только один строковый объект. Это безопасно, потому что String неизменен в Java.
В результате оба s и t указывают на один и тот же объект и немного сохраненной памяти.
Имя «пул строк» исходит из идеи, что вся уже определенная строка хранится в некотором «пуле» и перед созданием нового компилятора объекта String проверяет, определена ли такая строка.
Ответ 2
Я не думаю, что это на самом деле много, похоже, это просто кеш для строковых литералов. Если у вас несколько строк, значения которых одинаковы, все они укажут на один и тот же строковый литерал в пуле строк.
В случае 1 буквально s1 создается и сохраняется в пуле. Но в случае 2, буква s2 ссылается на s1, вместо этого он не будет создавать новый.
Ответ 3
Начните с цитаты из спецификации виртуальной машины:
Загрузка класса или интерфейса, который содержит строковый литерал, может создать новый объект String (§2.4.8) для представления этого литерала. Это может не произойти, если объект String уже создан для представления предыдущего вхождения этого литерала или если метод String.intern был вызван на объект String, представляющий ту же строку, что и литерал.
Это не тот случай, если мы используем конструктор:
Опять же, «one» создается в пуле, но затем мы создаем новый экземпляр из одного и того же литерала, и в этом случае он приводит к (a == b) && (a.equals(b)) == false
Итак, почему у нас есть пул строк? Строки и особенно строковые литералы широко используются в типичном Java-коде. И они неизменны. И, будучи непреложным, можно кэшировать String для экономии памяти и повышения производительности (меньше усилий для создания, меньше мусора для сбора).
В качестве программистов нам не нужно много заботиться о пуле String, если мы помним: