: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метод.