:notebook: Эта статья была заархивирована в: "blog"
Классификация типов данных
В Java существует два типа типов данных:
- Типы значений (также называемые встроенными типами данных, примитивными типами данных)
- Ссылочные типы (кроме типов значений, все ссылочные типы, включая
String
, множество)
тип значения
Язык Java обеспечивает8основные типы, условно разделенные на4своего рода
-
Целое число
-
byte
- 8 бит. -
short
- 16 бит. -
int
- 32 бита. -
long
- 64 бита, обычно добавляют после номера при присвоенииl
илиL
.
-
-
плавающая точка
-
float
- 32 бита, необходимо добавить после номера при прямом назначенииf
илиF
. -
double
- 64 бита, обычно добавляют после номера при присвоенииd
илиD
.
-
-
тип персонажа
-
char
- 16 бит, хранить код Unicode, присваивать значение в одинарных кавычках.
-
-
логический
-
boolean
- Есть только два значения true и false.
-
Разница между типом значения и ссылочным типом
- Концептуально
- Базовый тип: имя переменной указывает на определенное значение.
- Тип ссылки: имя переменной указывает на адрес памяти, где хранится объект данных.
- С точки зрения памяти
- Базовый тип: после объявления переменной Java немедленно выделяет место в памяти.
- Тип ссылки: Он обращается к сущности объекта (конкретному значению) особым образом (аналогично указателям C. Этот тип объявления переменной не выделяет память, а только сохраняет адрес памяти.
- С точки зрения использования
- Базовый тип: вам нужно присвоить определенное значение при его использовании и использовать его при оценке
==
Нет. - Тип ссылки: null может быть назначен при использовании и использован при оценке
equals
метод.
- Базовый тип: вам нужно присвоить определенное значение при его использовании и использовать его при оценке
:point_right: дальнейшее чтение:Примитивные типы данных Java и ссылочные типы
В этой статье более подробно рассказывается о хранении в памяти базовых типов данных и ссылочных типов.
конверсия данных
В Java есть два способа преобразования типов данных:
- автоматическое преобразование
- В ролях
автоматическое преобразование
В обычных условиях, если определена переменная определенного типа данных, ее нельзя преобразовать по желанию. Но JAVA позволяет пользователям делатьограниченноепреобразование типов.
Если выполняются следующие условия, JAVA автоматически выполнит преобразование типов:
-
Преобразование малых данных в большие данные
Очевидно, что диапазон числового представления «малого» типа данных меньше диапазона числового представления «большого» типа данных, то есть точность меньше, чем у «большого» типа данных.
Поэтому, если «большие» данные преобразуются в «маленькие», точность данных будет потеряна. Например, если long преобразуется в int, данные за пределами диапазона, представленного int, будут потеряны, что приведет к неопределенности результата.
И наоборот, когда «маленькие» данные преобразуются в «большие», потери данных не происходит. По этой причине это преобразование типа также известно какРасширить конверсию.
Эти типы от «маленьких» до «больших»: (byte, short, char)
«Большой» и «маленький», о которых мы здесь говорим, относятся не к количеству занятых байтов, а к размеру диапазона, представляющего значение.
-
Типы данных до и после преобразования должны быть совместимы
Поскольку логический тип может хранить только значение true или false, что несовместимо с целыми числами или символами, преобразование типов невозможно.
-
После вычисления интегрального типа и типа с плавающей запятой результат будет преобразован в тип с плавающей запятой.
Пример:
long x = 30;
float y = 14.3f;
System.out.println("x/y = " + x/y);
вывод:
x/y = 1.9607843
Можно видеть, что, хотя точность типа long выше, чем у типа float, результатом является число с плавающей запятой.
В ролях
Когда условия автоматического преобразования не выполняются или в соответствии с потребностями пользователя, тип данных может быть преобразован принудительно.
Приведение с использованием круглых скобок()
.
Ссылочные типы также могут использовать приведения типов.
Пример:
float f = 25.5f;
int x = (int)f;
System.out.println("x = " + x);
Бокс и распаковка
Упаковка, упаковка, распаковка
Java предоставляет соответствующий класс-оболочку для каждого базового типа данных следующим образом:
Byte <-> byte
Short <-> short
Integer <-> int
Long <-> long
Float <-> float
Double <-> double
Character <-> char
Boolean <-> boolean
Цель введения классов-оболочекТо есть: обеспечить такой механизм,Базовые типы данных могут быть преобразованы в ссылочные типы и из них..
Преобразование примитивных типов данных в классы-оболочки называется装箱
и拆箱
.
-
装箱
(бокс) заключается в преобразовании типа значения в ссылочный тип. Например:int
изменятьInteger
- Процесс упаковки выполняется путем вызова класса-оболочки
valueOf
метод реализован.
- Процесс упаковки выполняется путем вызова класса-оболочки
-
拆箱
(распаковка) преобразует ссылочный тип в тип значения. Например:Integer
изменятьint
- Процесс распаковки выполняется путем вызова класса-оболочки
xxxValue
метод реализован. (xxx представляет соответствующий базовый тип данных).
- Процесс распаковки выполняется путем вызова класса-оболочки
Автоматическая упаковка, автоматическая распаковка
Примитивное автоупаковывание Распаковка — это функция, предоставляемая начиная с JDK 5.
Механизм автоупаковки и распаковки позволяет нам более просто и напрямую использовать примитивные типы или типы объектов в назначениях переменных или вызовах методов Java. Поскольку автоупаковка неявно создает объекты, если в теле цикла будут созданы бесполезные промежуточные объекты, что увеличит нагрузку на сборщик мусора и снизит производительность программы. Поэтому обязательно обращайте внимание на код при написании циклов, чтобы избежать ненужных операций автоупаковки.
Форма до JDK 5:
Integer i1 = new Integer(10); // 非自动装箱
После JDK 5:
Integer i2 = 10; // 自动装箱
Для проектирования автоматической упаковки и распаковки в Java он опирается на шаблон проектирования, называемый шаблоном Flyweight (заинтересованные друзья могут перейти, чтобы понять исходный код, и шаблон проектирования не будет здесь подробно описываться).
👉 Дальнейшее чтение:Глубокое погружение в упаковку и распаковку в Java
В сочетании с примерами принципы упаковки и распаковки объясняются шаг за шагом.
Упаковка и распаковка приложений и меры предосторожности
Упаковка и распаковка сценариев приложений
- Один из наиболее распространенных сценариев: вызовСодержит тип как
Object
метод параметра,ДолженObject
может поддерживать любой тип (потому чтоObject
является родительским классом для всех классов) общего назначения. Когда вам нужно передать тип значения (например, int), вам нужно использоватьInteger
В коробке. - Другое использование: aнеуниверсальный контейнер, а также для обеспечения универсальности тип элемента определяется как
Object
. Поэтому при добавлении данных типа значения в контейнер требуется упаковка. - когда
==
Две операции оператора, один операнд — класс-обертка, а другой операнд — выражение (то есть содержит арифметические операции), которое сравнивает значения (то есть запускает процесс автоматической распаковки).
Пример:
Integer i1 = 10; // 自动装箱
Integer i2 = new Integer(10); // 非自动装箱
Integer i3 = Integer.valueOf(10); // 非自动装箱
int i4 = new Integer(10); // 自动拆箱
int i5 = i2.intValue(); // 非自动拆箱
System.out.println("i1 = [" + i1 + "]");
System.out.println("i2 = [" + i2 + "]");
System.out.println("i3 = [" + i3 + "]");
System.out.println("i4 = [" + i4 + "]");
System.out.println("i5 = [" + i5 + "]");
System.out.println("i1 == i2 is [" + (i1 == i2) + "]");
System.out.println("i1 == i4 is [" + (i1 == i4) + "]"); // 自动拆箱
// Output:
// i1 = [10]
// i2 = [10]
// i3 = [10]
// i4 = [10]
// i5 = [10]
// i1 == i2 is [false]
// i1 == i4 is [true]
Пример описания:
Приведенный выше пример, хотя и простой, скрывает применение автоупаковки, распаковки и неавтоупаковки и распаковки. Как видно из примера, явно все переменные инициализированы значением 10, но почему оно появляется?
i1 == i2 is [false
иi1 == i4 is [true]
?причина в следующем:
- i1 и i2 являются классами-оболочками, используйте
==
, Java сравнивает их как два объекта, а не как два значения int, поэтому два объекта, естественно, не равны. Правильная операция сравнения должна использоватьequals
метод.- i1 — класс-оболочка, i4 — базовый тип данных, используйте
==
, Java автоматически распакует два объекта класса-оболочки i1 в одинint
значение, а затем подставить в==
Вычисляется в арифметическом выражении, в конечном счете эквивалентно двумint
Сравнение производится, и поскольку значения одинаковы, результаты равны.
Примечания по упаковке и распаковке приложений
- Операции упаковки будут создавать объекты, а частые операции упаковки приведут к ненужному потреблению памяти и повлияют на производительность. такБокс следует избегать, насколько это возможно.
- Использование операций сравнения примитивных типов данных
==
, операция сравнения класса-оболочки используетequals
метод.