95
Базовый синтаксис Java Алексей Владыкин 15 сентября 2014 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 1 / 70

Java, осень 2014: Базовый синтаксис Java

Embed Size (px)

DESCRIPTION

Система типов: * Примитивные типы, преобразование типов. * Ссылочные типы. Массивы и строки. Управляющие конструкции: * Условные операторы (if, switch). * Циклы (for, while, do). * Операторы break и continue, метки.

Citation preview

Page 1: Java, осень 2014: Базовый синтаксис Java

Базовый синтаксис Java

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

15 сентября 2014

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 1 / 70

Page 2: Java, осень 2014: Базовый синтаксис Java

1 Система типов JavaПримитивные типыПреобразование типовСсылочные типы

2 Управляющие конструкцииУсловные операторыЦиклы

3 Примеры

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 2 / 70

Page 3: Java, осень 2014: Базовый синтаксис Java

Система типов Java

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

boolean

char

byte, short, int, longfloat, double

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 3 / 70

Page 4: Java, осень 2014: Базовый синтаксис Java

Система типов Java

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

boolean

char

byte, short, int, longfloat, double

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 3 / 70

Page 5: Java, осень 2014: Базовый синтаксис Java

Система типов Java

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 4 / 70

Page 6: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 5 / 70

Page 7: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Тип boolean

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 6 / 70

Page 8: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 7 / 70

Page 9: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 7 / 70

Page 10: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

java.lang.Boolean

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

boolean parseBoolean(String)

String toString(boolean)

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 8 / 70

Page 11: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Тип char

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 9 / 70

Page 12: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

(0 .. 216 − 1)

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70

Page 13: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70

Page 14: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70

Page 15: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70

Page 16: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Суррогаты

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 11 / 70

Page 17: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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 15 сентября 2014 12 / 70

Page 18: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 13 / 70

Page 19: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 14 / 70

Page 20: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 14 / 70

Page 21: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Литералы

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 15 / 70

Page 22: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Литералы

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 15 / 70

Page 23: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

Деление целочисленное

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 16 / 70

Page 24: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

Деление целочисленное

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 16 / 70

Page 25: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 17 / 70

Page 26: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 18 / 70

Page 27: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 18 / 70

Page 28: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

MIN_VALUE

MAX_VALUE

toString(typename)

parseTypename(String)

bitCount(typename)

reverse(typename)

reverseBytes(typename)

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 19 / 70

Page 29: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 20 / 70

Page 30: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 21 / 70

Page 31: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Литералы

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 22 / 70

Page 32: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

Операции

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 23 / 70

Page 33: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70

Page 34: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70

Page 35: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70

Page 36: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

strictfp

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 25 / 70

Page 37: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

strictfp

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 25 / 70

Page 38: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

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

java.lang.Floatjava.lang.Double

MIN_VALUE

MAX_VALUE

POSITIVE_INFINITY

NEGATIVE_INFINITY

NaN

boolean isNaN(typename)

toString(typename)

parseTypename(String)

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 26 / 70

Page 39: Java, осень 2014: Базовый синтаксис Java

Система типов Java Примитивные типы

java.lang.Math

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 27 / 70

Page 40: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 28 / 70

Page 41: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70

Page 42: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70

Page 43: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70

Page 44: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70

Page 45: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70

Page 46: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70

Page 47: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70

Page 48: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70

Page 49: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 31 / 70

Page 50: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

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

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

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

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

n >>>= 1;}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 32 / 70

Page 51: Java, осень 2014: Базовый синтаксис Java

Система типов Java Преобразование типов

Boxing/unboxing

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

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 33 / 70

Page 52: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 34 / 70

Page 53: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

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

Все остальные, кроме примитивныхПередаются по ссылкеЯвляются объектами (наследуют java.lang.Object)Имеют поля и методыСсылка может принимать значение null

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 35 / 70

Page 54: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Массивы

Массив обозначается квадратными скобками

int[] numbers;String [] args;boolean bits [];char[] letters , digits;float rates[], maxRate;

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 36 / 70

Page 55: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Создание

Массив создается оператором new

Все элементы массива инициализируются нулямиРазмер массива фиксируется в момент создания

int[] numbers = new int [100];String [] args = new String [1];boolean [] bits = new boolean [0];

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 37 / 70

Page 56: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Инициализация

Можно перечислить значения всех элементовпри создании массива

int[] numbers = new int[] {1, 2, 3, 4, 5};boolean [] bits = new boolean [] {true , true , false};

// this works only in variable declarationchar[] digits = {

’0’, ’1’, ’2’, ’3’, ’4’,’5’, ’6’, ’7’, ’8’, ’9’};

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 38 / 70

Page 57: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Индексация

Элементы индексируются с нуляДлина массива доступна как array.length

При выходе за границы массива бросается исключение

int[] numbers = {1, 2, 3, 4, 5};// numbers.length -> 5// numbers [0] -> 1// numbers [1] -> 2// numbers [4] -> 5// numbers [5] -> ArrayIndexOutOfBoundsException

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 39 / 70

Page 58: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Многомерные массивы

Многомерный массив — это массив массивов

int [][] matrix0;int [][] matrix1 = new int [2][2];int [][] matrix2 = {{1, 2}, {3, 4}};int[] row = matrix2 [0]

// matrix2 [1][1] -> 4// row[0] -> 1

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 40 / 70

Page 59: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Многомерные массивы

Разрешены ступенчатые массивы

int [][] triangle = {{1, 2, 3, 4, 5},{6, 7, 8, 9},{10, 11, 12},{13, 14},{15}};

// triangle.length -> 5// triangle [0]. length -> 5// triangle [4]. length -> 1

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 41 / 70

Page 60: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Представление в памяти

Одномерный массив занимает непрерывный участок памятиДвумерный массив занимает n + 1 участок в памяти,где n — первая размерность

int [][] a = new int [10][1000];int [][] b = new int [1000][10];

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 42 / 70

Page 61: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Varargs

Специальный синтаксис для массива аргументовПоддерживается с Java 5

int max(int[] numbers );// usage: max(new int[] {1, 2, 3, 4});

int max(int... numbers );// usage: max(1, 2, 3, 4);

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 43 / 70

Page 62: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70

Page 63: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70

Page 64: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70

Page 65: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70

Page 66: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как распечатать массив

System.out.println(a)выводит «абракадабру» [I@2ce83912

System.out.println(Arrays.toString(a))выводит содержимое

System.out.println(Arrays.deepToString(a))выводит содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70

Page 67: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как распечатать массив

System.out.println(a)выводит «абракадабру» [I@2ce83912

System.out.println(Arrays.toString(a))выводит содержимое

System.out.println(Arrays.deepToString(a))выводит содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70

Page 68: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Как распечатать массив

System.out.println(a)выводит «абракадабру» [I@2ce83912

System.out.println(Arrays.toString(a))выводит содержимое

System.out.println(Arrays.deepToString(a))выводит содержимое многомерных массивов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70

Page 69: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

java.util.Arrays

copyOf, copyOfRangefill

sort

binarySearch

java.lang.System.arraycopy

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 46 / 70

Page 70: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Строки

Класс java.lang.String

Последовательность символов произвольной длиныв кодировке UTF-16

Строка — это не char[], хотя есть способы конвертации

Никаких нулевых символов в конце, длина хранится отдельно

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 47 / 70

Page 71: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Создание строк

Строковые литералы

String zeros = "\u0000\u0000";String hello = "Hello";String specialChars = "\r\n\t\"\\";String unicodeEscapes = "\u0101\u2134\u03ff";

Создание из массива символов

char[] charArray = {’a’, ’b’, ’c’};String string = new String(charArray );

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 48 / 70

Page 72: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Создание строк

Строковые литералы

String zeros = "\u0000\u0000";String hello = "Hello";String specialChars = "\r\n\t\"\\";String unicodeEscapes = "\u0101\u2134\u03ff";

Создание из массива символов

char[] charArray = {’a’, ’b’, ’c’};String string = new String(charArray );

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 48 / 70

Page 73: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Доступ к содержимому строки

Строки неизменяемы

int length()

char charAt(int index)

char[] toCharArray()

String substring(int beginIndex)String substring(int beginIndex, int endIndex)

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 49 / 70

Page 74: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Конкатенация строк

Оператор +

String helloWorld = "Hello" + " World!";

java.lang.StringBuilder

StringBuilder buf = new StringBuilder ();buf.append("Hello");buf.append(" World!");String result = buf.toString ();

Компилятор преобразует + в операции с StringBuilder

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 50 / 70

Page 75: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Конкатенация строк

Оператор +

String helloWorld = "Hello" + " World!";

java.lang.StringBuilder

StringBuilder buf = new StringBuilder ();buf.append("Hello");buf.append(" World!");String result = buf.toString ();

Компилятор преобразует + в операции с StringBuilder

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 50 / 70

Page 76: Java, осень 2014: Базовый синтаксис Java

Система типов Java Ссылочные типы

Сравнение строк

Оператор == сравнивает ссылки, а не содержимое строки

boolean equals(Object anObject)boolean equalsIgnoreCase(String anotherString)

int compareTo(String anotherString)int compareToIgnoreCase(String anotherString)

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 51 / 70

Page 77: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Условные операторы

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 52 / 70

Page 78: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Условные операторы

Оператор if

if (weatherIsGood) {walkInThePark ();

} else {readBooksAtHome ();

}

Есть вариант без else

Условие типа boolean, нельзя написать if (i = 3) { ... }

Фигурные скобки рекомендуется ставить, даже когда онинеобязательны

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 53 / 70

Page 79: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Условные операторы

Оператор ?:

if (weatherIsGood) {System.out.println("Weather is good");

} else {System.out.println("Weather is bad");

}

// same effect , but much shorterSystem.out.println("Weather is "

+ (weatherIsGood ? "good" : "bad"));

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 54 / 70

Page 80: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Условные операторы

Оператор switch

switch (digit) {case 0:

text = "zero";break;

case 1:text = "one";break;

// case 2 - case 9

default:text = "???";

}

Без break исполнениепродолжается

Работает для примитивныхтипов byte, short, char, int,а также для enum

В Java 7 добавлен switchдля String

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 55 / 70

Page 81: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Условные операторы

if (digit == 0) {text = "zero";

} else if (digit == 1) {text = "one";

} else if (digit == 2) {text = "two";

} /* 3 - 9 */else {

text = "???";}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 56 / 70

Page 82: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 57 / 70

Page 83: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Цикл while

while (haveTime () && haveMoney ()) {goShopping ();

}

Цикл с предусловиемУсловие типа boolean

Фигурные скобки рекомендуется ставить, даже когда онинеобязательны

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 58 / 70

Page 84: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Цикл do while

do {goShopping ();

} while (haveTime () && haveMoney ());

Цикл с постусловиемНужна точка с запятой в концеФигурные скобки рекомендуется ставить, даже когда онинеобязательны

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 59 / 70

Page 85: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Цикл for

for (int i = 0; i < args.length; i++) {System.out.println(args[i]);

}

Все части заголовка не обязательныfor (;;) — бесконечный циклФигурные скобки рекомендуется ставить, даже когда онинеобязательны

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 60 / 70

Page 86: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Цикл foreach

for (String arg : args) {System.out.println(arg);

}

Добавлен в Java 5Применим к массивам и классам, реализующиминтерфейс java.lang.Iterable

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 61 / 70

Page 87: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Оператор break

for (String s : haystack) {if (needle.equals(s)) {

found = true;break;

}}

Передает управление на следующий за циклом операторПрименим ко всем видам циклов

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 62 / 70

Page 88: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Оператор continue

for (String s : haystack) {if (! needle.equals(s)) {

continue;}count ++;

}

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

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 63 / 70

Page 89: Java, осень 2014: Базовый синтаксис Java

Управляющие конструкции Циклы

Метки

Операторы break и continue действуют на ближайший циклМожно указать другой цикл при помощи метки

outer:for (int[] row : matrix) {

for (int x : row) {if (x > 100) {

found = true;break outer;

}}

}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 64 / 70

Page 90: Java, осень 2014: Базовый синтаксис Java

Примеры

public class Fibonacci {

public static long getFibonacciNumber(int n) {if (n <= 0) {

return 0;}long prev = 0;long curr = 1;for (int i = 1; i < n; ++i) {

long next = prev + curr;prev = curr;curr = next;

}return curr;

}

public static void main(String [] args) {for (int i = 0; i <= Integer.parseInt(args [0]); ++i) {

System.out.printf("fib(%d) = %d\n",i, getFibonacciNumber(i));

}}

}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 65 / 70

Page 91: Java, осень 2014: Базовый синтаксис Java

Примеры

import java.math.BigInteger;

public class FibonacciBigInteger {

public static BigInteger getFibonacciNumber(int n) {if (n <= 0) {

return BigInteger.ZERO;}BigInteger prev = BigInteger.ZERO;BigInteger curr = BigInteger.ONE;for (int i = 1; i < n; ++i) {

BigInteger next = prev.add(curr);prev = curr;curr = next;

}return curr;

}

public static void main(String [] args) {for (int i = 0; i <= Integer.parseInt(args [0]); ++i) {

System.out.printf("fib(%d) = %d\n",i, getFibonacciNumber(i));

}}

}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 66 / 70

Page 92: Java, осень 2014: Базовый синтаксис Java

Примеры

import java.util.Arrays;

public class Anagrams {

public static boolean areAnagrams(String a, String b) {char[] charsFromA = getSortedChars(a);char[] charsFromB = getSortedChars(b);return Arrays.equals(charsFromA , charsFromB );

}

private static char[] getSortedChars(String s) {char[] chars = s.toCharArray ();Arrays.sort(chars);return chars;

}

public static void main(String [] args) {System.out.println(areAnagrams("silent", "listen")

? "anagrams": "not anagrams");

}}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 67 / 70

Page 93: Java, осень 2014: Базовый синтаксис Java

Примеры

public class Palindromes {

public static boolean isPalindrome(String s) {String normalizedText = normalize(s);return normalizedText.equals(reverse(normalizedText ));

}

private static String normalize(String s) {return s.toLowerCase (). replaceAll("\\W+", "");

}

private static String reverse(String s) {return new StringBuilder(s). reverse (). toString ();

}

public static void main(String [] args) {System.out.println(isPalindrome("Madam , I’m Adam")

? "palindrome" : "not palindrome");}

}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 68 / 70

Page 94: Java, осень 2014: Базовый синтаксис Java

Примеры

public class Polygons {

public static double getArea(double [][] polygon) {int size = polygon.length;double sum = 0;for (int i = 0; i < size; ++i) {

int j = (i + 1) % size;sum += det(polygon[i][0], polygon[i][1],

polygon[j][0], polygon[j][1]);}return Math.abs(sum / 2);

}

private static double det(double x1, double y1,double x2, double y2) {

return x1 * y2 - x2 * y1;}

public static void main(String [] args) {double [][] polygon = new double [][] {

{1, 1}, {1, 2}, {2, 2}, {2, 1}};System.out.printf(

"Polygon area = %1.3f\n", getArea(polygon ));}

}

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 69 / 70

Page 95: Java, осень 2014: Базовый синтаксис Java

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

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

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

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

Как создавать и использовать массивы

Как создавать и использовать строки

Как в Java написать ветвление и цикл,какие есть разновидности

Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 70 / 70