Рубрики
Без рубрики

Преобразования Java Primitive

Наиболее полезные преобразования примитивных типов Java.

Автор оригинала: baeldung.

Преобразования Java Primitive

1. Введение

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

  1. примитивные типы данных
  2. абстрактные типы данных.

В этой статье мы сосредоточимся на преобразовании примитивных типов.

2. Обзор примитивов

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

  • byte – 8 битов и подписано

  • короткие – 16 битов и подписано

  • char – 16 битов и неподписанными, так что он может представлять символы Unicode

  • int – 32 бита и подписано

  • долго – 64 бита и подписано

  • поплавок – 32 бита и подписано

  • двойной – 64 бита и подписано

  • булеан – это не числовая, возможно, только истинное или ложные Значения

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

3. Расширение примитивных конверсий

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

int myInt = 127;
long myLong = myInt;

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

float myFloat = myLong;
double myDouble = myLong;

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

4. Сужение примитивного преобразования

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

В этом случае, мы должны прямо выразить, что мы знаем о ситуации, и мы согласны с этим, используя литые:

int myInt = (int) myDouble;
byte myByte = (byte) myInt;

5. Расширение и сужение примитивного преобразования

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

Пример прояснит этот момент:

byte myLargeValueByte = (byte) 130;   //0b10000010 -126

Двоичное представление 130 то же самое для -126, разница в интерпретации сигнального бита. Давайте теперь конвертировать из byte char :

char myLargeValueChar = (char) myLargeValueByte;
  //0b11111111 10000010 unsigned value
int myLargeValueInt = myLargeValueChar; //0b11111111 10000010 65410

char представление является значением Unicode, но преобразуется в int показал нам очень большое значение, которое имеет более низкие 8 бит точно так же, как -126.

Если мы преобразуем его снова в byte мы получаем:

byte myOtherByte = (byte) myLargeValueInt; //0b10000010 -126

Исходное значение, которое мы использовали. Если весь код начинался с char значения будут отличаться:

char myLargeValueChar2 = 130; //This is an int not a byte! 
  //0b 00000000 10000010 unsigned value
        
int myLargeValueInt2 = myLargeValueChar2; //0b00000000 10000010  130
        
byte myOtherByte2 = (byte) myLargeValueInt2; //0b10000010 -126

Хотя byte представительство то же самое, что -126, char представление дает нам два разных символа.

6. Бокс/Распаковки преобразования

В Java у нас есть класс Wrapper для каждого примитивного типа, это умный способ предоставления программистам полезных методов обработки, без накладных расходов, имеющих все в качестве супертяжелом ссылки объекта. С Java 1.5 была включена возможность автоматического преобразования в/из примитива в объект и обратно, и ее достигается простой атрибуции:

Integer myIntegerReference = myInt;
int myOtherInt = myIntegerReference;

7. Преобразование струн

Все примитивные типы могут быть преобразованы в Струнные через их классы wrapper, которые переопределяют toString () метод:

String myString = myIntegerReference.toString();

Если нам нужно вернуться к примитивному типу, нам необходимо использовать метод разбора, определяемый соответствующим классом Wrapper:

byte  myNewByte   = Byte.parseByte(myString);
short myNewShort  = Short.parseShort(myString);
int   myNewInt    = Integer.parseInt(myString);
long  myNewLong   = Long.parseLong(myString);

float  myNewFloat  = Float.parseFloat(myString);
double myNewDouble = Double.parseDouble(myString);
boolean myNewBoolean = Boolean.parseBoolean(myString);

Единственным исключением здесь является Характер Класс, потому что Струнные состоит из char s в любом случае, таким образом, учитывая, что, вероятно, Струнные состоит из одного char , мы можем использовать charAt() метод Струнные класс:

char myNewChar = myString.charAt(0);

8. Нумерические акции

Для выполнения двоичной операции необходимо, чтобы оба опера были совместимы с точки зрения размера.

Существует набор простых правил, которые применяются:

  1. Если один из оперных – это двойной , другой повышен до двойной
  2. В противном случае, если один из оперных поплавок , другой повышен до плавать
  3. В противном случае, если один из оперных долго , другой повышен до длинный
  4. В противном случае оба считаются int

Рассмотрим пример:

byte op1 = 4;
byte op2 = 5;
byte myResultingByte = (byte) (op1 + op2);

Оба оперных были повышены до int и результат должен быть подавлен до byte снова.

9. Заключение

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

Код, используемый в этой статье, можно найти более на GitHub .