2013 09 16_java_lecture_02

58
Примитивные типы в Java Алексей Владыкин 16 сентября 2013 Алексей Владыкин Примитивные типы в Java 16 сентября 2013 1 / 39

Upload: cs-center

Post on 15-Jun-2015

3.153 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2013 09 16_java_lecture_02

Примитивные типы в Java

Алексей Владыкин

16 сентября 2013

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 1 / 39

Page 2: 2013 09 16_java_lecture_02

1 Примитивные и ссылочные типы

2 Тип boolean

3 Тип char

4 Целочисленные типы

5 Вещественные типы

6 Преобразование типов

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 2 / 39

Page 3: 2013 09 16_java_lecture_02

Примитивные и ссылочные типы

* примитивный тип

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 3 / 39

Page 4: 2013 09 16_java_lecture_02

Примитивные и ссылочные типы

Примитивные типы

boolean

char

byte, short, int, longfloat, double

Зарезервированные ключевыеслова языкаНе имеют полей и методовПередаются по значению

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 4 / 39

Page 5: 2013 09 16_java_lecture_02

Примитивные и ссылочные типы

Примитивные типы

boolean

char

byte, short, int, longfloat, double

Зарезервированные ключевыеслова языкаНе имеют полей и методовПередаются по значению

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 4 / 39

Page 6: 2013 09 16_java_lecture_02

Примитивные и ссылочные типы

Ссылочные типы

Все остальныеЯвляются объектами (java.lang.Object)Имеют поля и методыПередаются по ссылке

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 5 / 39

Page 7: 2013 09 16_java_lecture_02

Тип boolean

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 6 / 39

Page 8: 2013 09 16_java_lecture_02

Тип boolean

Логические значения

Литералы: false, true

Результат любого сравнения — boolean:< > ==<= >= !=

Нет преобразования между boolean и другимипримитивными типами

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 7 / 39

Page 9: 2013 09 16_java_lecture_02

Тип boolean

Логические операции

and && & &=or || | |=xor ˆ ˆ=not !

&& и || — вычисление по сокращенной схеме& и | — вычисление по полной схеме

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 8 / 39

Page 10: 2013 09 16_java_lecture_02

Тип boolean

Логические операции

and && & &=or || | |=xor ˆ ˆ=not !

&& и || — вычисление по сокращенной схеме& и | — вычисление по полной схеме

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 8 / 39

Page 11: 2013 09 16_java_lecture_02

Тип boolean

Примеры

boolean a = true;boolean b = false;boolean c = (a ^ b) == (a != b);boolean d = c &= !b || a;

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 9 / 39

Page 12: 2013 09 16_java_lecture_02

Тип boolean

Примеры

int m = 0;int n = 10;if (m != 0 & n / m >= 1) {

System.out.println("condition is true");} else {

System.out.println("condition is false");}

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 10 / 39

Page 13: 2013 09 16_java_lecture_02

Тип boolean

java.lang.Boolean

Класс-обертка для boolean

boolean parseBoolean(String)

String toString(boolean)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 11 / 39

Page 14: 2013 09 16_java_lecture_02

Тип char

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 12 / 39

Page 15: 2013 09 16_java_lecture_02

Тип char

Символьные значения

char — 16 бит, беззнаковый

(0 .. 216 − 1)

Представляет номер символа в кодировке Unicode

Литералы:символ в одинарных кавычках: ’a’шестнадцатеричный код символа: ’\u78bc’спецпоследовательности: ’\t’, ’\n’, ’\r’, ’\”, ’\\’

Свободно конвертируется в числовые типы и обратно

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 13 / 39

Page 16: 2013 09 16_java_lecture_02

Тип char

Символьные значения

char — 16 бит, беззнаковый (0 .. 216 − 1)

Представляет номер символа в кодировке Unicode

Литералы:символ в одинарных кавычках: ’a’шестнадцатеричный код символа: ’\u78bc’спецпоследовательности: ’\t’, ’\n’, ’\r’, ’\”, ’\\’

Свободно конвертируется в числовые типы и обратно

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 13 / 39

Page 17: 2013 09 16_java_lecture_02

Тип char

Символьные значения

char — 16 бит, беззнаковый (0 .. 216 − 1)

Представляет номер символа в кодировке Unicode

Литералы:символ в одинарных кавычках: ’a’шестнадцатеричный код символа: ’\u78bc’спецпоследовательности: ’\t’, ’\n’, ’\r’, ’\”, ’\\’

Свободно конвертируется в числовые типы и обратно

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 13 / 39

Page 18: 2013 09 16_java_lecture_02

Тип char

Символьные значения

char — 16 бит, беззнаковый (0 .. 216 − 1)

Представляет номер символа в кодировке Unicode

Литералы:символ в одинарных кавычках: ’a’шестнадцатеричный код символа: ’\u78bc’спецпоследовательности: ’\t’, ’\n’, ’\r’, ’\”, ’\\’

Свободно конвертируется в числовые типы и обратно

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 13 / 39

Page 19: 2013 09 16_java_lecture_02

Тип char

Суррогаты

В современном Unicode больше символов,чем влезает в 16 битПоэтому некоторые Unicode-сиволы в Java представляются двумяchar’ами — суррогатной паройТакие символы можно хранить и в int

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 14 / 39

Page 20: 2013 09 16_java_lecture_02

Тип char

java.lang.Character

Класс-обертка для char

char toLowerCase(char)

char toUpperCase(char)

boolean isLowerCase(char)

boolean isUpperCase(char)

boolean isDigit(char)

boolean isLetter(char)

boolean isHighSurrogate(char)

boolean isLowSurrogate(char)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 15 / 39

Page 21: 2013 09 16_java_lecture_02

Целочисленные типы

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 16 / 39

Page 22: 2013 09 16_java_lecture_02

Целочисленные типы

Диапазоны значений

Тип Бит

Диапазон

byte 8

−128 .. + 127

short 16

−215 .. + 215 − 1

int 32

−231 .. + 231 − 1

long 64

−263 .. + 263 − 1

Размер фиксирован, одинаков для всех платформВсе типы знаковые, беззнаковых вариантов нет

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 17 / 39

Page 23: 2013 09 16_java_lecture_02

Целочисленные типы

Диапазоны значений

Тип Бит Диапазонbyte 8 −128 .. + 127short 16 −215 .. + 215 − 1int 32 −231 .. + 231 − 1long 64 −263 .. + 263 − 1

Размер фиксирован, одинаков для всех платформВсе типы знаковые, беззнаковых вариантов нет

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 17 / 39

Page 24: 2013 09 16_java_lecture_02

Целочисленные типы

Литералы

Десятичное число: 123Восьмеричное число: 0123Шестнадцатеричное число: 0x123Двоичное число: 0b101 (с Java 7)

С подчеркиванием: 123_456_789 (с Java 7)С суффиксом L для long

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 18 / 39

Page 25: 2013 09 16_java_lecture_02

Целочисленные типы

Литералы

Десятичное число: 123Восьмеричное число: 0123Шестнадцатеричное число: 0x123Двоичное число: 0b101 (с Java 7)

С подчеркиванием: 123_456_789 (с Java 7)С суффиксом L для long

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 18 / 39

Page 26: 2013 09 16_java_lecture_02

Целочисленные типы

Арифметические операции

сложение + +=вычитание - -=умножение * *=деление / /=остаток % %=инкремент ++декремент --

Деление целочисленноеa == (a / b) * b + (a % b)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 19 / 39

Page 27: 2013 09 16_java_lecture_02

Целочисленные типы

Арифметические операции

сложение + +=вычитание - -=умножение * *=деление / /=остаток % %=инкремент ++декремент --

Деление целочисленноеa == (a / b) * b + (a % b)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 19 / 39

Page 28: 2013 09 16_java_lecture_02

Целочисленные типы

Особые случаи

Деление на ноль — исключительная ситуация,бросается ArithmeticException

Переполнение не является исключительной ситуацией,лишние старшие биты просто выкидываются

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 20 / 39

Page 29: 2013 09 16_java_lecture_02

Целочисленные типы

Побитовые операции

not ~and & &=or | |=xor ˆ ˆ=shr >> >>=shr’ >>> >>>=shl << <<=

>> — арифметический сдвиг>>> — логический сдвиг

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 21 / 39

Page 30: 2013 09 16_java_lecture_02

Целочисленные типы

Побитовые операции

not ~and & &=or | |=xor ˆ ˆ=shr >> >>=shr’ >>> >>>=shl << <<=

>> — арифметический сдвиг>>> — логический сдвиг

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 21 / 39

Page 31: 2013 09 16_java_lecture_02

Целочисленные типы

Классы-обертки

java.lang.Bytejava.lang.Shortjava.lang.Integerjava.lang.Long

MIN_VALUE

MAX_VALUE

toString(typename)

parseTypename(String)

bitCount(typename)

reverse(typename)

reverseBytes(typename)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 22 / 39

Page 32: 2013 09 16_java_lecture_02

Целочисленные типы

Примеры

int i = 2_000_000_000;long j = 10 _000_000_000L;long k = j++ + ++i;k /= i;

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 23 / 39

Page 33: 2013 09 16_java_lecture_02

Целочисленные типы

Примеры

int mask = 0xFF000000;int i = mask >>> 16;int j = mask >>> 24;int k = mask >>> 32;

for (byte b = 0; b < 200; b++) {// do something

}

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 24 / 39

Page 34: 2013 09 16_java_lecture_02

Целочисленные типы

Примеры

int mask = 0xFF000000;int i = mask >>> 16;int j = mask >>> 24;int k = mask >>> 32;

for (byte b = 0; b < 200; b++) {// do something

}

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 24 / 39

Page 35: 2013 09 16_java_lecture_02

Вещественные типы

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 25 / 39

Page 36: 2013 09 16_java_lecture_02

Вещественные типы

Тип Бит Знак Мантисса Экспонентаfloat 32 1 23 8double 64 1 52 11

Стандарт IEEE754Число в представлено в виде ±m · 2e

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 26 / 39

Page 37: 2013 09 16_java_lecture_02

Вещественные типы

Литералы

Обычная запись: -1.234

Экспоненциальная запись: -123.4e-2 (−123.4 · 10−2)

Шестнадцатеричная запись: 0xFFFFpFF (FFFF · 2FF )

С суффиксом типа:38f3e19d123.4e-2f444.444d

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 27 / 39

Page 38: 2013 09 16_java_lecture_02

Вещественные типы

Операции

сложение + +=вычитание - -=умножение * *=деление / /=остаток % %=инкремент ++декремент --

a == ((long) (a / b)) * b + (a % b)

Побитовые операции не поддерживаются

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 28 / 39

Page 39: 2013 09 16_java_lecture_02

Вещественные типы

Особые случаи

Деление положительного числа на 0 дает +∞Деление отрицательного числа на 0 дает −∞Деление 0 на 0 дает NaN

Переполнение дает +∞ или −∞,в зависимости от направления

Любая арифметическая операция с NaN дает NaNNaN != NaN

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 29 / 39

Page 40: 2013 09 16_java_lecture_02

Вещественные типы

Особые случаи

Деление положительного числа на 0 дает +∞Деление отрицательного числа на 0 дает −∞Деление 0 на 0 дает NaN

Переполнение дает +∞ или −∞,в зависимости от направления

Любая арифметическая операция с NaN дает NaNNaN != NaN

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 29 / 39

Page 41: 2013 09 16_java_lecture_02

Вещественные типы

Особые случаи

Деление положительного числа на 0 дает +∞Деление отрицательного числа на 0 дает −∞Деление 0 на 0 дает NaN

Переполнение дает +∞ или −∞,в зависимости от направления

Любая арифметическая операция с NaN дает NaNNaN != NaN

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 29 / 39

Page 42: 2013 09 16_java_lecture_02

Вещественные типы

strictfp

Java использует FPU для вычислений с плавающей точкойРегистры FPU могут быть шире 64 битРезультаты вычислений могут отличаться

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

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 30 / 39

Page 43: 2013 09 16_java_lecture_02

Вещественные типы

strictfp

Java использует FPU для вычислений с плавающей точкойРегистры FPU могут быть шире 64 битРезультаты вычислений могут отличаться

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

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 30 / 39

Page 44: 2013 09 16_java_lecture_02

Вещественные типы

Классы-обертки

java.lang.Floatjava.lang.Double

MIN_VALUE

MAX_VALUE

POSITIVE_INFINITY

NEGATIVE_INFINITY

NaN

boolean isNaN(typename)

toString(typename)

parseTypename(String)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 31 / 39

Page 45: 2013 09 16_java_lecture_02

Вещественные типы

java.lang.Math

константы: E, PIтригонометрия: sin, cosстепени: sqrt, pow, expmin, max. . .

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 32 / 39

Page 46: 2013 09 16_java_lecture_02

Преобразование типов

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 33 / 39

Page 47: 2013 09 16_java_lecture_02

Преобразование типов

Неявное преобразование типов

Преобразование целочисленных типов в более емкие(byte → short → int → long)

Преобразование char в int и long

Преобразование целочисленные типов в типы с плавающей точкой(возможна потеря точности)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 34 / 39

Page 48: 2013 09 16_java_lecture_02

Преобразование типов

Неявное преобразование типов

Преобразование целочисленных типов в более емкие(byte → short → int → long)

Преобразование char в int и long

Преобразование целочисленные типов в типы с плавающей точкой(возможна потеря точности)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 34 / 39

Page 49: 2013 09 16_java_lecture_02

Преобразование типов

Неявное преобразование типов

Преобразование целочисленных типов в более емкие(byte → short → int → long)

Преобразование char в int и long

Преобразование целочисленные типов в типы с плавающей точкой(возможна потеря точности)

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 34 / 39

Page 50: 2013 09 16_java_lecture_02

Преобразование типов

Явное преобразование типов

Оператор приведения типа: (typename)

При приведении более емкого целого типа к менее емкомустаршие биты просто отбрасываются

При приведении типа с плавающей точкой к целому типудробная часть отбрасывается (никакого округления)

Слишком большое дробное число при приведении к целомупревращается в MAX_VALUE или MIN_VALUE

Слишком большой double при приведении к float превращаетсяв Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 35 / 39

Page 51: 2013 09 16_java_lecture_02

Преобразование типов

Явное преобразование типов

Оператор приведения типа: (typename)

При приведении более емкого целого типа к менее емкомустаршие биты просто отбрасываются

При приведении типа с плавающей точкой к целому типудробная часть отбрасывается (никакого округления)

Слишком большое дробное число при приведении к целомупревращается в MAX_VALUE или MIN_VALUE

Слишком большой double при приведении к float превращаетсяв Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 35 / 39

Page 52: 2013 09 16_java_lecture_02

Преобразование типов

Явное преобразование типов

Оператор приведения типа: (typename)

При приведении более емкого целого типа к менее емкомустаршие биты просто отбрасываются

При приведении типа с плавающей точкой к целому типудробная часть отбрасывается (никакого округления)

Слишком большое дробное число при приведении к целомупревращается в MAX_VALUE или MIN_VALUE

Слишком большой double при приведении к float превращаетсяв Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 35 / 39

Page 53: 2013 09 16_java_lecture_02

Преобразование типов

Явное преобразование типов

Оператор приведения типа: (typename)

При приведении более емкого целого типа к менее емкомустаршие биты просто отбрасываются

При приведении типа с плавающей точкой к целому типудробная часть отбрасывается (никакого округления)

Слишком большое дробное число при приведении к целомупревращается в MAX_VALUE или MIN_VALUE

Слишком большой double при приведении к float превращаетсяв Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 35 / 39

Page 54: 2013 09 16_java_lecture_02

Преобразование типов

Явное преобразование типов

Оператор приведения типа: (typename)

При приведении более емкого целого типа к менее емкомустаршие биты просто отбрасываются

При приведении типа с плавающей точкой к целому типудробная часть отбрасывается (никакого округления)

Слишком большое дробное число при приведении к целомупревращается в MAX_VALUE или MIN_VALUE

Слишком большой double при приведении к float превращаетсяв Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 35 / 39

Page 55: 2013 09 16_java_lecture_02

Преобразование типов

Автоматическое расширение

При вычислении выражения (a @ b) аргументы a и bпреобразовываются в числа, имеющие одинаковый тип:

если одно из чисел double, то в double;иначе, если одно из чисел float, то в float;иначе, если одно из чисел long, то в long;иначе оба числа преобразуются в int.

byte b = 1;byte c = b + 1; // compilation error

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 36 / 39

Page 56: 2013 09 16_java_lecture_02

Преобразование типов

Неявное приведение с потерей данных

Сокращенная запись var @= exprраскрывается в var = (typename) (var @ (expr))

Неявно срабатывает приведение типа, в том числе с потерейданных

short n = -1;while (n != 0) {

n >>>= 1;}

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 37 / 39

Page 57: 2013 09 16_java_lecture_02

Преобразование типов

Boxing/unboxing

Autoboxing: примитивное значение → объект-оберткаAutounboxing: объект-обертка → примитивное значение

Integer i = 1;Integer j = i + 1;int k = i + j;

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 38 / 39

Page 58: 2013 09 16_java_lecture_02

Что сегодня узнали

Что такое «примитивные типы»

Какие примитивные типы есть в языке Java

Как на Java производить логические и арифметическиевычисления

Какие есть подводные камни

Алексей Владыкин Примитивные типы в Java 16 сентября 2013 39 / 39