Глубокое понимание основных типов данных Java.

Java

: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Сравнение производится, и поскольку значения одинаковы, результаты равны.

Примечания по упаковке и распаковке приложений

  1. Операции упаковки будут создавать объекты, а частые операции упаковки приведут к ненужному потреблению памяти и повлияют на производительность. такБокс следует избегать, насколько это возможно.
  2. Использование операций сравнения примитивных типов данных==, операция сравнения класса-оболочки используетequalsметод.

резюме



использованная литература