Подробное объяснение упаковки и распаковки Java
Предисловие:
Чтобы понять концепции упаковки и распаковки, вы должны понимать типы данных Java
Вставка: Основные типы пакетов с соответствующими эталонными типами, чтобы они обладали свойствами объектов. Int упаковано в целое число, плавает в Float
Распаковка: в отличие от бокса, упрощает объекты ссылок на данные о типах значений
Integer A = 100;
См. Следующий код
м1
Общедоступный класс { {Integer a = Новое целое число (128); System.out.println ("M12 Result" + (a == b));Каковы результаты печати?
M11 результат False M12 Результат False
«==» сравнивает адрес, в то время как адреса двух объектов A и B разные, то есть они являются двумя объектами, поэтому они оба ложны
SAINGING BYTECODE через JAVAP, содержание следующим образом
Public void M11 (); A/Lang/Integer; Java/Lang/System.out: Ljava/IO/PrintStream; _2 30: IF_ACMPNE 37 33: ICONST_1 34: GOTO 38 37: ICONST_0 38: Invokevirtual #66; Java/Lang/StringBuilder.Append: (z) Ljava/Lang/StringBuilder; V 47: вернуть Public void M12 (); // МЕТОД JAVA/LANG/Integer. 21: Новый #59; infokpecial #63; invokevirtual #74;
м2
Общественный класс DataType {Public void Main (String Args []) {DataType DT = New DataType (); } public void m22 () {integer a = new Integer (128); Integer (128);Результат печати
M21 Результат FALSEM22 Результат ложный
A и B все еще два объекта
Джавап
Public void M21 (); ; // Метод java/lang/integer Java/Lang/System.out: Ljava/IO/PrintStream; : aload_2 34: if_acmpne 41 37: iconst_1 38: goto 42 41: iconst_0 42: Invokevirtual #66; Java/Lang/StringBuilder.Append: (z) Ljava/Lang/StringBuilder; V 51: returnpublic void m22 (); // МЕТОД JAVA/LANG/Integer : Ljava/IO/PrintStream; 25: Новый #59; 47: Invokevirtual #70; Ilder; java/lang/stringbuilder.tostring :() ljava/lang/string;
M3
Общедоступный класс { eger a = 128; }}Результаты печати
M31 Результат Truem32 Результат неверный
Почему первая истинная и вторая ложь? Соблюдайте данные, проанализированные Javap
Джавап
public void (); 2 12: GetStatic #53; Java/Lang/StringBuilder 18: DUP 19: LDC #88; #70; A/lang/integer.valueof: (i) ljava/lang/integer; Java/Lang/Integer.valueof: (i) Ljava/Lang/Integer; IAL #63; // Метод Java/Lang/StringBuilder. " IF_ACMPNE 31: ICONST_1 32: GOTO 36 35: ICONST_0 36: Invokevirtual #66; 42: Invokevirtual #74;
м4
Общедоступный класс { void m42 () {integer a = integer.valueof (128); System.out.println ("M42 Result" + (A == B));Результаты печати
M41 Результат Truem42 Результат неверный
Джавап
public void (); 2 12: GetStatic #53; Java/Lang/StringBuilder 18: DUP 19: LDC #92; #70; A/lang/integer.valueof: (i) ljava/lang/integer; Java/Lang/Integer.valueof: (i) Ljava/Lang/Integer; IAL #63; // Метод Java/Lang/StringBuilder. " IF_ACMPNE 31: ICONST_1 32: GOTO 36 35: ICONST_0 36: Invokevirtual #66; 42: Invokevirtual #74;
анализировать
Javap -это инструмент, который поставляется с Java.
Давайте сначала взглянем на M4.
Но объект A генерируется при вызове integer.valueof (), а B - это объект, генерируемый автоматическим боксом. Давайте снова посмотрим на байт -код.
Метод M41 применяет ValueOf () один раз, но он появляется дважды в байт -коде, что означает, что значение () также вызывается во время автоматического бокса.
Ниже приведена конкретная реализация valueof ()
/** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <code> int </code> значение. }В цифрах между [-128, 127] значение возвращает объект в кэше, поэтому два вызова возвращают один и тот же объект.
Спасибо за чтение, я надеюсь, что это может помочь вам.