Постоянный бассейн Java обычно разделен на два типа: статический постоянный бассейн и постоянный бассейн выполнения.
Статический постоянный пул: постоянный пул в файле класса. Постоянный пул в файле класса включает в себя буквальные значения String (номер), информацию о классе и методе, занимая большую часть места в файле класса.
Постоянный бассейн времени выполнения: после того, как JVM завершает загрузку класса, он загружает постоянный пул в файл класса в память и сохраняет его в области метода. Обычно мы говорим, так это постоянный пул постоянного пула времени выполнения в области метода. Другой важной особенностью его постоянного пула по сравнению с файлом класса является его динамичность. Язык Java не требует, чтобы константы генерировались только в течение периода компиляции, то есть содержимое постоянного пула в файле класса может ввести в пул постоянного времени выполнения метода. Во время пробега новые константы также могут быть помещены в бассейн. Эта функция чаще используется разработчиками. Метод negn () класса строки.
Счетчик программы: это конвейер для выполнения программы, указывающий, какую команду выполнить следующую.
Локальный стек методов: стек, используемый JVM для вызова методов операционной системы.
Стек виртуальных машин: стек, используемый JVM для выполнения кода Java
Куча виртуальной машины: где хранятся объекты, и все объекты, которые являются новыми в программах Java, хранятся в куче.
Область метода: хранить константы, информацию класса и статические переменные, которые можно понимать как место, где файл класса хранится в памяти.
Преимущества постоянного объединения:
Постоянные пулы используются, чтобы избежать частого создания и разрушения объектов, которые влияют на производительность системы, и они осознают обмен объектами.
Например, бассейн с постоянной строки используется для помещения всех струнных литералов в постоянный бассейн на этапе компиляции.
1. Сохранить пространство памяти: все строки константы с одинаковым буквальным значением в постоянном пуле объединяются, занимая только одно пространство
2. Сохраните время выполнения: при выполнении сравнения строк == быстрее, чем equals (). Для двух эталонных переменных просто используйте ==, чтобы определить, равны ли ссылки, чтобы вы могли определить, равны ли фактические значения.
== Значения основных типов данных и представлений объектов различны.
Для основного типа данных: == Сравнение является значением основного типа данных для объекта: == Сравнение - это адрес памяти объекта в памяти
8 Основные классы типов данных обертывания и постоянные пулы
Большинство классов обертки основных типов данных в Java реализуют постоянные технологии объединения, а именно байтовые, короткие, целочисленные, длинные, характерные и логические.
Целое число i1 = 40; целое число i2 = 40; System.out.println (i1 == i2); // true
Байтовые, короткие, целочисленные, длинные, символ, эти пять классов обертки создают данные кэша соответствующего типа [-128, 127] по умолчанию и хранят их в постоянном пуле. Если он превышает этот диапазон, все равно будет создан новый объект.
public static integer value (int i) {assert integercache.high> = 127; if (i> = integerCache.low && i <= integerCache.high) return integerCache.cache [i + (-integerCache.low)]; вернуть новое целое число (i); }Целое число I1 = 400; целое число i2 = 400; System.out.println (i1 == i2); // false
2. Два типа классов упаковки с плавающей точкой плавают и двойные не внедряют технологию постоянного объединения.
Double D1 = 2,5; Double D2 = 2,5; System.out.println (d1 == d2); // false
3. Сценарии для применения постоянных бассейнов
(1) .integeri1 = 40; Поскольку Integer является класс обертки основного типа данных Int и является объектом, Java будет выполнять автоматические операции по боксу при компиляции и непосредственно инкапсулировать код в integeri1 = integer.valueof (40), тем самым используя объекты в постоянном пуле
(2) .integeri1 = newinteger (40); В этом случае будет создан новый объект
Целое число i1 = 40; целое число i2 = новое целое число (40); System.out.println (i1 == i2); // false
В этом случае New Integer не будет выполнять автоматическую справочную ссылку на существующие константы в постоянном пуле, но будет напрямую генерировать новый объект в куче.
4. целочисленные детали
Целое число I1 = 40; Целое число i2 = 40; Целое число i3 = 0; Целое число i4 = новое целое число (40); Целое число i5 = новое целое число (40); Целое число i6 = новое целое число (0); Целое число i7 = 128; Целое число i8 = 128; System.out.println ("i1 = i2" + (i1 == i2)); System.out.println ("i1 = i2 + i3" + (i1 == i2 + i3)); System.out.println ("i1 = i4" + (i1 == i4)); System.out.println ("i4 = i5" + (i4 == i5)); System.out.println ("i4 = i5 + i6" + (i4 == i5 + i6)); System.out.println ("40 = i5 + i6" + (40 == i5 + i6)); System.out.println ("i7 = i8" + (i7 == i8));i1 = i2 truei1 = i2+i3 truei1 = i4 falsei4 = i5 falsei4 = i5+i6 true40 = i5+i6 truei7 = i8 false
Объяснение: Заявление i4 == i5 + i6, потому что оператор + не применим к целочисленным объектам. Во -первых, I5 и I6 выполняют автоматические операции распаковки и добавляют значения, то есть i4 == 40. Тогда целочисленный объект не может быть напрямую сравнить с числовым значением, поэтому i4 автоматически раскатывает его и преобразует его в значение int 40. Наконец, это оператор преобразуется в 40 == 40 для численного сравнения.
Класс струн и постоянный бассейн
1. Как создать строковый объект
String S1 = "abdcd"; string s2 = new String ("abcd"); System.out.println (s1 == s2); // falseСуществуют различия в методах создания этих двух разных способов. Первое - взять объекты в постоянном пуле, а второе - создать новые объекты в пространстве памяти кучи.
Просто используйте новые объекты в куче.
2. Выражаемая экспрессия+
(1). Только новые объекты, сгенерированные подключением «+» между строковыми объектами, созданными с использованием «», содержащего текст, будут добавлены в пул строковых постоянных.
(2). Для других форм, таких как две ссылки на объект, которые напрямую подключены через «+» или объекты, созданные в новом режиме, полученные новые объекты не будут добавлены в пул строковых постоянных.
String str1 = "str"; string str2 = "ing"; String str3 = "str" + "ing"; string str4 = str1 + str2; system.out.println (str3 == str4); // false String str5 = "string"; System.out.println (str3 == str5); // true
Общественная статическая конечная строка a = "ab"; // постоянная апублическая статическая конечная строка b = "cd"; // постоянная Bpublic static void main (string [] args) {string s = a + b; // инициализировать S с + конкатенацией строки t = "abcd"; if (s == t) {System.out.println ("s равно t, они один и тот же объект"); } else {System.out.println ("s не равен t, они не один и тот же объект"); }} s равно t, они один и тот же объектA и B являются постоянными, а значения фиксируются, поэтому значение S также фиксируется, что определяется при составлении класса. Другими словами: строка s = a+b; эквивалентно: string s = ”ab”+”cd»;
Общественная статическая финальная строка A; // постоянная апублическая статическая конечная строка B; // постоянная bstatic {a = "ab"; B = "CD"; } public static void main (string [] args) {// инициализировать s с + string concatenation s = a + b; Строка t = "ABCD"; if (s == t) {System.out.println ("s равно t, они один и тот же объект"); } else {System.out.println ("s не равен t, они не один и тот же объект"); }} s не равен T, они не являются одним и тем же объектомХотя A и B определяются как константы, ни один из них не назначен немедленно. Перед вычислением значения S, когда они назначаются и какое значение им присваивается, являются переменными. Следовательно, до назначения A и B их свойства аналогичны переменной. Тогда S не может быть определен в течение периода компиляции, но может быть создан только во время выполнения.
3.Strings1 = Newstring ("xyz"); Сколько объектов было создано?
Рассмотрим фазу загрузки класса и фактическое выполнение.
(1) Загрузка класса будет выполняться только один раз на классе. «XYZ» создается и проживает при загрузке класса (если строка «XYZ» проживала до загрузки класса, нет необходимости многократно создавать экземпляр «XYZ» для проживания). Проживаемая строка помещается в глобально общий бассейн String Constant.
(2) Когда этот код впоследствии запускается, экземпляр строки, соответствующий литераллу «XYZ», является фиксированным и не будет создаваться неоднократно. Таким образом, этот код копирует копию объекта в постоянном пуле и помещает ее в кучу и вручает ссылку на объект в куче, чтобы удерживать S1.
Это утверждение создает 2 объекта.
4.java.lang.string.intern ()
Другой важной особенностью постоянного пула времени выполнения по сравнению с постоянным пулом файла класса является его динамичность. Язык Java не требует, чтобы константы генерировались только в течение периода компиляции, то есть содержимое постоянного пула в файле класса может войти в область метода. Новые константы также могут быть помещены в бассейн во время выполнения. Эта функция чаще используется разработчиками. Метод negn () класса строки.
Метод строки intern () выяснит, есть ли строка равных в постоянном пуле. Если есть, это вернет ссылку на строку. Если нет, он добавит свою собственную строку в постоянный бассейн.
public static void main (string [] args) {string s1 = new String ("computer"); String S2 = S1.Intern (); String S3 = "Computer"; System.out.println ("s1 == s2?" + (S1 == s2)); System.out.println ("s3 == s2?" + (S3 == s2));}S1 == S2? falses3 == s2? истинный
Суммировать
Вышеуказанное все о изучении постоянных бассейнов Java в глубине. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это.