Ссылки на целочисленные объекты на Java
В Java нет указателя, но есть также концепции ссылки. Здесь мы хотим поговорить, так это то, является ли целое число одним и тем же объектом.
1. Сначала посмотрим на кусок кода:
public static void main (string [] args) {integer a1 = 100; Целое число B1 = a1; // другой также может быть B1 = 100 Field Field = null; try {field = a1.getClass (). getDeclaredfield ("value"); } catch (nosuchfieldexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (securityException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } field.SetAccessible (true); try {field.set (a1, 5000); } catch (allogalargumentException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (allogalAccessException e) {// todo Автогенерированный блок улова e.printstacktrace (); } System.out.println ("b1 ="+b1); Целое число C1 = 100; System.out.println ("c1 ="+c1); } результат:
B1 = 5000
C1 = 5000
С тех пор, прежде всего, я хочу объяснить несколько вещей здесь.
1) Для целого числа целое число между -128-127 было инициализировано и размещено в IntegerCache. Если он упакован, объект будет взят из него.
2) Является ли B1 = A1 численным назначением или тот же объект? Это можно увидеть из результатов, что B1 и A1 указывают на один и тот же объект, а не на то же числовое значение
3) C1 = 100 означает, что для значений между -128-127 все объекты, полученные из IntegerCache. После изменения целочисленного объекта, соответствующего 100, последующая упаковка 100 будет изменена. Поскольку при получении объектов в кэше используется индекс массива, не используется численные сравнения.
Однако изменение этого кеша будет более опасной, так что не возражайте. Кто знает, какой пакет JAR или платформу упаковывает 100 юаней, но результат не 100 юаней, и в то время он будет терпеть неудачу.
2. Через приведенное выше описание, какой ответ, если он изменился на это
public static void main (string [] args) {integer a1 = 200; Целое число B1 = A1; Полевое поле = null; try {field = a1.getClass (). getDeclaredfield ("value"); } catch (nosuchfieldexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (securityException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } field.SetAccessible (true); try {field.set (a1, 5000); } catch (allogalargumentException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (allogalAccessException e) {// todo Автогенерированный блок улова e.printstacktrace (); } System.out.println ("b1 ="+b1); Целое число C1 = 200; System.out.println ("c1 ="+c1); } 3. Затем измените это
public static void main (string [] args) {integer a1 = new Integer (100); Целое число B1 = A1; Полевое поле = null; try {field = a1.getClass (). getDeclaredfield ("value"); } catch (nosuchfieldexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (securityException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } field.SetAccessible (true); try {field.set (a1, 5000); } catch (allogalargumentException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (allogalAccessException e) {// todo Автогенерированный блок улова e.printstacktrace (); } System.out.println ("b1 ="+b1); Целое число C1 = 100; System.out.println ("c1 ="+c1); } Какой ответ? Для новых операций объекты не являются штучными, но генерируются в куче.
Нетрудно понять, если вы понимаете бокс, кэширование и цитату. Вы можете попробовать сами.
Давайте сначала получим некоторые базовые знания
Переписка основных типов и классов обертки байтовые байтовые короткие короткометражные Intger Long Long Float Float Float Double Double Charm Boolean Boolean
Переписка между основными типами данных в вышеупомянутых восьмерках составляет только int-> integer char-> символ. Два изменения значительны, а остальные просто преобразуют первую букву в нижнюю часть.
Давайте узнаем о новых функциях JDK5: автоматическая упаковка и распаковка
Автоматическое бокс: преобразовать основные типы в типы классов упаковки
Автоматическое распаковка: конвертировать тип класса обертки в основной тип
открытый класс demo_integer {public static void main (string [] args) {// до jdk1.5 int a = 100; Целое число A1 = новое целое число (a); // Оберните основной тип данных в объект, Box int b = a1.intvalue (); // конвертировать объект в основной тип данных и Unbox // после JDK1.5 int x = 100; Целое число x1 = x; // Автоматическое поле, преобразовать основной тип данных в объект int y = x1 + x; // Автоматически распаковать, преобразовать объект в основной тип данных}}Что следует отметить
открытый класс demo_integer {public static void main (string [] args) {integer a = null; int b = a + 100; // нижний слой автоматического распаковки будет вызвать a.intvalue (), a null, а a естественным образом бросит nullpointerexception system.out.println (b); }}Вопросы интервью
открытый класс demo_integer {public static void main (string [] args) {integer i1 = new Integer (97); Целое число i2 = новое целое число (97); System.out.println (i1 == i2); System.out.println (i1.equals (i2)); System.out.println ("-------------"); Целое число i3 = new Integer (197); Целое число i4 = новое целое число (197); System.out.println (i3 == i4); System.out.println (i3.equals (i4)); System.out.println ("----------------"); }}Вывод: Неверно Истина ---------------------------------------
причина:
Новым является открытие места в памяти кучи, а значение адреса естественного сравнения (==) является ложным.
Поскольку целое число переписывает метод Equals, выход равенства верно.
Вы можете чувствовать, что это слишком просто и не имеет технического контента, потому что выше.
открытый класс demo_integer {public static void main (string [] args) {integer i1 = 127; Целое число i2 = 127; System.out.println (i1 == i2); System.out.println (i1.equals (i2)); System.out.println ("--------------"); Целое число i3 = 128; Целое число i4 = 128; System.out.println (i3 == i4); System.out.println (i3.equals (i4)); System.out.println ("---------------"); }}Вывод: True True ----------------------------------------------------------
причина:
Почему два объекта, когда INT больше 127? Число 127 чувствует себя очень знакомым?
-128 до 127 являются диапазоном значений байта. Если он находится в этом диапазоне значений, автоматическое бокс не создаст нового объекта и получит его из постоянного пула
Если диапазон стоимости байта будет превышен, будет создан новый объект.
Автоматически упаковывает базовый уровень и вызовите метод значения (), простой анализ исходного кода (JDK1.8):
public final Class Integer Extends Number реализует сопоставимые <Integer> {public static integer valueof (int i) {// Когда i> = -128 и i <= 127, объект в буфере будет непосредственно извлечен, если (i> = integercache.low && i <= integercache.high) integegarcache. вернуть новое целое число (i); // Если диапазон значений байта превышает диапазон, он будет создан в памяти кучи} // внутренний класс действует как буфер частного статического класса IntegerCache {статический конечный int low = -128; Статический финал int High; Статический конечный целочисленный кеш []; static {// высокое значение может быть настроено Property int h = 127; String integercachehighpropvalue = sun.misc.vm.getsavedproperty ("java.lang.integer.integercache.high"); if (integercachehighpropvalue! = null) {try {int i = parseint (integerCacheHighPropValue); i = math.max (i, 127); // максимальный размер массива IS integer.max_value h = math.min (i, integer.max_value -(-low) -1); } catch (numberFormateXception nfe) {// Если свойство не может быть проанализировано в int, игнорируйте его. }} high = h; cache = new Integer [(High - low) + 1]; int j = низкий; for (int k = 0; k <cache.length; k ++) cache [k] = новое целое число (j ++); // диапазон [-128, 127] должен быть интернализован (JLS7 5.1.7) Assert integerCache.high> = 127; } private integerCache () {}}} 8 основных типов классов обертывания и пулов объектов
Большинство основных типов классов обертки в Java внедряют постоянные технологии объединения. Эти классы - байтовые, короткие, целочисленные, длинные, характерные, логические и два других типа классов обертки с номером плавающей запятой не реализованы. Кроме того, пять целочисленных классов обертки байта, короткого, целочисленного, длинного символа могут использовать пул объектов только тогда, когда соответствующее значение меньше или равно 127, то есть объект не несет ответственности за создание и управление объектами этих классов более 127.
Расширенные знания
В спецификации JVM каждый тип имеет свой собственный постоянный пул. Постоянный пул - это упорядоченный набор констант, используемых определенным типом, включая прямые константы (примитивные типы, строки) и символические ссылки на другие типы, поля и методы. Причина, по которой это символическая ссылка, а не непосредственно указывать другие типы во время компиляции, заключается в том, что Java динамически связана, и только во время выполнения может быть определенные экземпляры зависимости типа в соответствии с определенными правилами. Это основа для Java для реализации полиморфизма.
В JVM весь жизненный цикл класса начинается с загрузки в память виртуальной машины и до тех пор, пока он не будет выгружен из памяти. Весь его жизненный цикл включает в себя: загрузка, проверка, подготовка, анализ, инициализация, использование и разгрузка. Стадия анализа - это процесс виртуальной машины, заменяющей ссылки на символы в постоянном пуле прямыми ссылками.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.