JAVA распаковки коробки

Перепечатано из: микро-канал общедоступного номераСбор веб-проекта

Основные типы данных

  Основной тип, или называемый встроенный тип, отличный от класса Java (класс) специального типа. Они наши программы, наиболее часто используемый тип.

  Java является строго типизированным языком, первым объявил переменные типы данных должны быть указаны, первый называется назначение переменной для инициализации переменных.

 

Java примитивные типы Есть восемь основных типов можно разделить на три категории:

  Типы символов char

  логический boolean

  Целый тип  byte, short, int,long

  С плавающей точкой типа  float, double.

Java числовой тип не существует без знака, их диапазон фиксируется, так как машина не изменяет операционную систему или аппаратная среда изменяется.

На самом деле, Java, есть еще другой базовый тип void, он также имеет соответствующий класс - обертку , но мы не можем работать на них непосредственно. java.lang.Void

Каковы преимущества основных типов данных

  Мы все знаем , что на языке Java, newобъект хранятся в куче, мы используем эти объекты по эталонным стеку, поэтому он сам объект потребляет ресурс.

  Для типа часто используются, например, INT, и т.д. Если каждый раз, когда мы используем это переменные будет требовать нового объекта Java, то это будет довольно громоздким.

  Таким образом, и в C ++, Java предоставляет основные типы данных, переменные, такие данные не требуют использования нового творения, они не будут созданы в куче, но хранятся непосредственно в памяти стека, так что это более эффективно.

 

Диапазон целого числа

  Java, целое число в основном включает в себя byte, short, intи longчетыре цифровых указанном диапазоне от мало до велика, представляет диапазон различных основных причин , почему количество байт занято и когда они хранят данные , относящиеся.

  Во-первых, чтобы короткий ответ науки, 1 байт = 8 бит (бит). Java принадлежит к целому числу символов.

  Первый взгляд на цифровом расчете 8bit может быть представлен следующим образом:

  最小值:10000000 (-128)(-2^7)最大值:01111111(127)(2^7-1)

  Эти целые типы,

  • байт: байт на один байт для хранения, в диапазоне от -128 (7 ^ -2) до 127 (2 ^ 7-1), когда инициализируется переменная, байт 0 является типом по умолчанию.

  • Короче говоря: короткие с 2 байта хранения, -32768 (-2 ^ 15) 32767 (2 ^ 15-1), при инициализации переменной, короткое значение по умолчанию тип 0, в общем случае, так как Java причина самого перехода может быть записана непосредственно к нулю.

  • INT: INT 4 байта сохраняется, в диапазоне от 2,147,483,648 (-2 ^ 31) до 2,147,483,647 (2 ^ 31-1), при инициализации переменной, значение по умолчанию типа INT 0.

  • длинная: длина 8 байт хранения, -9,223,372,036,854,775,808 диапазон (-2 ^ 63) до 9223372036, 854775807 (2 63 -1), при инициализации переменной длиной типа или значения по умолчанию 0L 0L, также может быть запись непосредственно к нулю.

  • байт короткого символа INT длина поплавок двойной 1 2 2 4 8 4 8 

 

За рамками, как это сделать

  Все сказанное выше, целые числа, каждый тип имеет определенный диапазон представления, однако, некоторые вычисления в программе приведет к превышению объема представления, а именно переполнение. В следующем коде:

  int i = Integer.MAX_VALUE;int j = Integer.MAX_VALUE;
  int k = i + j;System.out.println("i (" + i + ") + j (" + j + ") = k (" + k + ")");

  Выход: я (2147483647) + J, (2147483647) = к (-2)

  Это то , что произошло переполнение, время и не бросает исключение, и без каких - либо подсказок. Так что , когда в программе, используя один и тот же тип данных операций, мы должны обратить внимание на проблему переполнения данных.

 

класс Wrapper

Java является объектно-ориентированным языком, но основные типы данных в Java не является объектно-ориентированным, что есть много неудобств в реальных условиях эксплуатации, для того, чтобы решить эту проблему, в категории дизайна для каждого типа данных базовой конструкции Он является представителем соответствующего класса, так что восемь основных типов данных и соответствующий класс называются упаковка (класс обертки).

Пакет java.lang находится упаковка, упаковка из основных типов данных и соответствующая таблица отношений ниже

Основные типы данных класс Wrapper
байт Байт
логический логический
короткая короткий
голец символ
ИНТ целое число
долго Долго
поплавок терка
двойной двойной

Во имя восемь классов, в дополнение к будущему Integer и тип символов, в том же классе шесть другого имени класса и основные типы данных, только первую букву имени класса в верхний регистр.

Зачем нам нужна упаковка

У многих людей есть сомнения, так как Java в целях повышения эффективности, он предлагает восемь основных типов данных, поэтому мы должны обеспечить его упаковку?

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

Для того, чтобы основные типы также объект функции, появился тип пакета, который соответствует фундаментальному типу «завернуть», так что он имеет свойство объекта, а также добавлять свойства и методы, чтобы обогатить основной тип операции ,

Упаковка и распаковка

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

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

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

Перед Java SE5, чтобы быть упаковка, следующим кодом:

Integer i = new Integer(10);

Автоматическая и автоматическая упаковка, распаковка

В Java SE5, для того, чтобы уменьшить работу разработчиков, Java обеспечивает автоматическую упаковку и распаковку автоматической функции.

Autoboxing: автоматически преобразуются в соответствующем элементарные упаковки типа данных.

Автоматическая распаковка: обертка автоматически преобразуются в соответствующие базовые типы данных.

Integer i =10;  //自动装箱int b= i;     //自动拆箱

Integer i=10 Альтернатива , которая должна помочь нам , потому что Java обеспечивает автоматическую функцию упаковки не требуется разработчики вручную новый объект Integer. Integer i = new Integer(10);

Принцип автоматического бокса и авто-распаковки

Теперь, когда Java предоставляет возможность автоматически позволяет мне, тогда мы будем смотреть, в конце концов, это то, что принцип, Java является автоматическая функция позволяет мне, как достичь.

Мы имеем следующий код для автоматической коробки ввода:

public static  void main(String[]args)
{

Integer integer=1; //装箱

int i=integer; //拆箱

}

После того, как приведенный выше код может быть декомпилированы следующий код:

public static  void main(String[]args)
{

Integer integer=Integer.valueOf(1);

int i=integer.intValue();

}

Как видно выше, декомпилирован код, Int Autoboxing через Integer.valueOf()для достижения методы, Целый распаковка через автоматические integer.intValueдостигаются. Если читатели заинтересованы, вы можете попробовать восемь типов снова являются декомпилировать его, вы найдете следующие правила:

При автоматической упаковке классы обрамления valueOf()реализованы метод автоматической распаковки объекта класса, обернув будут xxxValue()достигнуты.

 

Какое место будет автоматически окно ввода

После того, как мы поняли принцип, посмотрите, при каких обстоятельствах, Java поможет нам выполнить автоматическую коробку входа. Инициализация и присвоение переменной сцены, упомянутые выше, не введено, она является самым простой и наиболее легко понять.

В основном мы смотрим на эти сценарии могут быть проигнорированы.

Сценарий, основные типы данных в коллекции

Мы знаем, что классы Java Collection может получить только тип объекта, то следующий код, почему оно не дано?

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i ++)
{

li.add(i);
}

Выше декомпилирован код, следующий код может быть получен:

List<Integer> li = new ArrayList<>();

for (int i = 1; i < 50; i += 2)
{

li.add(Integer.valueOf(i));
}

Выше, мы можем заключить, что, когда мы помещаем основные типы данных в класс коллекции, он будет автоматически паковать.

Второй сценарий, тип пакета и сравнение размеров базовых типов

Кто-нибудь когда-нибудь думали, когда мы сравниваем размер базового типа объекта Integer, на самом деле, это то, что сравнить его? Посмотрите на следующий код:

Integer a=1;System.out.println(a==1?"等于":"不等于");

Boolean bool=false;System.out.println(bool?"真":"假");

Для того, чтобы декомпилировать код, указанный выше, следующие коды:

Integer a=1;System.out.println(a.intValue()==1?"等于":"不等于");

Boolean bool=false;System.out.println(bool.booleanValue?"真":"假");

Это можно увидеть на операции упаковки сравниваются основные типы данных, то основные типы данных в первой упаковки, распаковка, а затем сравниваются.

Сценарий три типа пакетов операций

Кто-нибудь думал о том, когда мы были четыре операции на объекте Integer, как это? Посмотрите на следующий код:

Integer i = 10;Integer j = 20;
System.out.println(i+j);

После того, как декомпилированный код выглядит следующим образом:

Integer i = Integer.valueOf(10);Integer j = Integer.valueOf(20);System.out.println(i.intValue() + j.intValue());

Мы обнаружили, что тип операции упаковки между ними, будет автоматически распаковывать в основных типов.

Сцена четыре, с трехзначным оператором

Это то, что многие люди не знают сцены дела после того, как кровавый узнал ошибка автор линии происходит. См простого кода троичного оператора:

boolean flag = true;Integer i = 0;int j = 1;int k = flag ? i : j;

Многие люди не знают, на самом деле, в int k = flag ? i : j;этой линии, авто-распаковка происходит. После того, как декомпилированный код выглядит следующим образом :

boolean flag = true;Integer i = Integer.valueOf(0);int j = 1;int k = flag ? i.intValue() : j;

Это на самом деле Тернарный оператор Синтаксис спецификация: когда вторые и третьи операнды основные типов и объект, в котором объект будет существенно распаковкой типа операции.

Так , например, в flag ? i : j;сегменте, второй сегмент я является объектом типа упаковки, в то время как третья стадия J представляет собой базовый тип, упаковка будет автоматически распаковка. Если на этот раз я ценю null, так долго NPE будет происходить.

Сцена Пять, функциональные параметры и возвращаемые значения

Это легче понять, непосредственно по коду:

//自动拆箱public int getNum1(Integer num) { return num;}//自动装箱public Integer getNum2(int num) { return num;}

Автоматические коробки ввода и кэш

Java SE автоматический ввод коробки, а также обеспечивает буферные функции, связанные, давайте рассмотрим следующий код, угадайте вывод:

public static void main(String... strings) {
Integer integer1 = 3;
Integer integer2 = 3;

if (integer1 == integer2)
System.out.println("integer1 == integer2");

else

System.out.println("integer1 != integer2");

Integer integer3 = 300;
Integer integer4 = 300;

if (integer3 == integer4)
System.out.println("integer3 == integer4");

else

System.out.println("integer3 != integer4");

}

Как правило, мы считаем, что результаты двух вышеупомянутых решений являются ложными. Хотя значение сравнения равны, а потому, что сравнение является объектом, а ссылки на объекты не то же самое, так что два будет думать, что если суждения являются ложными.

В Java == сравнение целевое приложение, и это значение равно сравнения.

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

Код выше реального объема производства:

integer1 == integer2integer3 != integer4

Причина в кэше и механизмов Integer. В Java 5, на управляющем Integer мы вводим новую функцию , чтобы сохранить память и повысить производительность. Integer объект реализует кэш и повторное использование, используя ту же ссылку на объект.

Применить ко всему диапазону значение -128 до +127.

 

Подходит только для автоматической упаковки. Используйте конструктор для создания объекта не применяется.

Нам просто нужно знать, когда необходимость автоматической упаковки, если число находится в пределах от -128 до 127, будет непосредственно использовать объекты в кэше, а не повторно создать объект.

Отличающееся тем , что подробное описание поддержки процесса автоматической упаковки кэша JavaDoc между -128 до 127. Максимальное значение 127 может -XX:AutoBoxCacheMax=sizeбыть изменено.

В самом деле , когда эта функция введена в Java 5, фиксированный диапазон -128 до +127. Позже в Java 6, вы можете java.lang.Integer.IntegerCache.highустановить максимум.

Это позволяет повысить производительность фактической ситуации применения гибкости для регулировки. В конце концов , что является причиной , чтобы выбрать диапазон -128 до 127 это? Поскольку число в этом диапазоне наиболее широко используется.  В этом процессе, первое использование Integer, также потребуется некоторое дополнительное время , чтобы инициализировать кэш.

В разделе Java Language Specification (JLS) Бокс Conversion предусматривает следующее:

Если значение р переменных являются:

-128至127之间的整数(§3.10.1)
true 和 false的布尔值 (§3.10.3)
‘\u0000’至 ‘\u007f’之间的字符(§3.10.4)

Когда в пределах диапазона, р-упаковано два объекта а и б, могут быть определены непосредственно при помощи == B А и В равны.

Вопрос Box приносит автоматический демонтаж

Конечно, автоматическая коробка записи не приятная особенность, экономя разработчик энергии больше не нужно заботиться о том, в конце концов, когда вам нужно поле ввода. Тем не менее, он также ввести некоторые проблемы.

Численное сравнение обернутый объект, а не просто использовать ==, хотя их количество может быть от -128 до 127, но за пределами этого диапазона по- прежнему необходимо использовать equalsсравнение.

 

Как уже упоминалось ранее, некоторые сцены будут автоматически позволяет мне, но и сказал, что из-за авто-распаковка, если объект упаковки класса имеет нулевое значение, то можно автоматически бросить NPE при распаковке.

 

Если петли для большого числа операции поля ввода, будет тратить много ресурсов.

рекомендация

отwww.cnblogs.com/heyjia/p/11328460.html