Основы Java. 2-е изд. (Николай Прохоренок)
Описан базовый синтаксис языка Java: типы данных, операторы, условия, циклы, регулярные выражения, лямбда-выражения, ссылки на методы, объектно-ориентированное программирование. Рассмотрены основные классы стандартной библиотеки, получение данных из сети Интернет, работа с базой данных MySQL. Книга содержит большое количество практических примеров, помогающих начать программировать на языке Java самостоятельно. Весь материал тщательно подобран, хорошо структурирован и компактно изложен, что позволяет использовать книгу как удобный справочник.
Во втором издании добавлена глава по Java 11 и описано большинство нововведений: модули, интерактивная оболочка JShell, инструкция var и др.
Электронный архив с примерами находится на сайте издательства.
Введение 13
Глава 1. Первые шаги 17
1.1. Установка Java SE Development Kit (JDK) 17
1.2. Первая программа 21
1.3. Установка и настройка редактора Eclipse 24
1.4. Структура программы 34
1.5. Комментарии в программе 38
1.6. Вывод данных 43
1.7. Ввод данных 46
1.8. Получение данных из командной строки 48
1.9. Преждевременное завершение выполнения программы 49
1.10. Интерактивная оболочка JShell 50
Глава 2. Переменные и типы данных 55
2.1. Объявление переменной внутри метода 55
2.2. Именование переменных 56
2.3. Типы данных 57
2.4. Инициализация переменных 58
2.5. Константы 61
2.6. Статические переменные и константы класса 61
2.7. Области видимости переменных 62
2.8. Преобразование и приведение типов 65
2.9. Инструкция var 67
2.10. Перечисления 68
Глава 3. Операторы и циклы 70
3.1. Математические операторы 70
3.2. Побитовые операторы 72
3.3. Операторы присваивания 75
3.4. Операторы сравнения 76
3.5. Приоритет выполнения операторов 77
3.6. Оператор ветвления if 78
3.7. Оператор ?: 82
3.8. Оператор выбора switch 83
3.9. Цикл for 86
3.10. Цикл for each 88
3.11. Цикл while 89
3.12. Цикл do while 89
3.13. Оператор continue: переход на следующую итерацию цикла 90
3.14. Оператор break: прерывание цикла 90
Глава 4. Числа 93
4.1. Математические константы 96
4.2. Основные методы для работы с числами 96
4.3. Округление чисел 98
4.4. Тригонометрические методы 98
4.5. Преобразование строки в число 99
4.6. Преобразование числа в строку 101
4.7. Генерация псевдослучайных чисел 103
4.8. Бесконечность и значение NaN 107
Глава 5. Массивы 109
5.1. Объявление и инициализация массива 109
5.2. Определение размера массива 111
5.3. Получение и изменение значения элемента массива 112
5.4. Перебор элементов массива 113
5.5. Многомерные массивы 114
5.6. Поиск минимального и максимального значений 116
5.7. Заполнение массива значениями 117
5.8. Сортировка массива 118
5.9. Проверка наличия значения в массиве 122
5.10. Переворачивание и перемешивание массива 123
5.11. Заполнение массива случайными числами 124
5.12. Копирование элементов из одного массива в другой 125
5.13. Сравнение массивов 128
5.14. Преобразование массива в строку 130
Глава 6. Символы и строки 131
6.1. Объявление и инициализация отдельного символа 131
6.2. Создание строки 132
6.3. Определение длины строки 134
6.4. Доступ к отдельным символам 135
6.5. Получение фрагмента строки 135
6.6. Конкатенация строк 135
6.7. Настройка локали 136
6.8. Изменение регистра символов 137
6.9. Сравнение строк 138
6.10. Поиск и замена в строке 140
6.11. Преобразование строки в массив и обратно 141
6.12. Преобразование кодировок 143
6.13. Форматирование строки 147
Глава 7. Регулярные выражения 153
7.1. Создание шаблона и проверка полного соответствия шаблону 153
7.2. Модификаторы 154
7.3. Синтаксис регулярных выражений 156
7.4. Поиск всех совпадений с шаблоном 166
7.5. Замена в строке 171
7.6. Разбиение строки по шаблону: метод split() 172
Глава 8. Работа с датой и временем (классический способ) 174
8.1. Класс Date: получение количества миллисекунд, прошедших с 1 января 1970 года 174
8.1.1. Создание экземпляра класса Date 174
8.1.2. Форматирование даты и времени 176
8.2. Класс Calendar: получение доступа к отдельным компонентам даты и времени 180
8.2.1. Создание объекта: метод getInstance() 180
8.2.2. Получение компонентов даты и времени 180
8.2.3. Установка компонентов даты и времени 184
8.2.4. Сравнение объектов 186
8.3. Класс GregorianCalendar: реализация григорианского и юлианского календарей 187
8.3.1. Создание экземпляра класса GregorianCalendar 187
8.3.2. Установка и получение компонентов даты и времени 188
8.3.3. Изменение компонентов даты и времени 191
8.3.4. Сравнение объектов 192
8.4. Класс SimpleDateFormat: форматирование даты и времени 192
на языке, соответствующем указанной локали 195
8.6. «Засыпание» программы и измерение времени ее выполнения 198
Глава 9. Работа с датой и временем (в версиях Java SE 8 и выше) 200
9.1. Класс LocalDate: дата 200
9.1.1. Создание экземпляра класса LocalDate 200
9.1.2. Установка и получение компонентов даты 202
9.1.3. Прибавление и вычитание значений 204
9.1.4. Преобразование объекта класса LocalDate в объект класса LocalDateTime 205
9.1.5. Сравнение объектов 206
9.1.6. Преобразование даты в строку 207
9.1.7. Создание календаря на месяц и год 207
9.2. Класс LocalTime: время 216
9.2.1. Создание экземпляра класса LocalTime 217
9.2.2. Установка и получение компонентов времени 218
9.2.3. Прибавление и вычитание значений 219
9.2.4. Преобразование объекта класса LocalTime в объект класса LocalDateTime 221
9.2.5. Сравнение объектов 221
9.2.6. Преобразование времени в строку 222
9.3. Класс LocalDateTime: дата и время 222
9.3.1. Создание экземпляра класса LocalDateTime 223
9.3.2. Установка и получение компонентов даты и времени 225
9.3.3. Прибавление и вычитание значений 228
9.3.4. Сравнение объектов 229
9.3.5. Преобразование даты и времени в строку 231
9.4. Класс Instant: представление времени в наносекундах, прошедших с 1 января 1970 года 231
9.4.1. Создание экземпляра класса Instant 231
9.4.2. Получение компонентов времени 233
9.4.3. Прибавление и вычитание значений 233
9.4.4. Сравнение объектов 234
9.4.5. Преобразование объекта класса Instant в объект класса LocalDateTime 235
9.5. Класс DateTimeFormatter: форматирование даты и времени 236
9.5.1. Создание экземпляра класса DateTimeFormatter 236
9.5.2. Специальные символы в строке шаблона 238
9.6. Класс Period: разница между двумя датами 242
9.7. Получение количества дней между двумя датами 246
9.8. Получение времени в разных часовых поясах 247
Глава 10. Пользовательские методы 252
10.1. Создание статического метода 252
10.2. Вызов статического метода 255
10.3. Перегрузка методов 256
10.4. Способы передачи параметров в метод 258
10.5. Передача и возвращение массивов 260
10.6. Передача произвольного количества значений 262
10.7. Рекурсия 264
Глава 11. Объектно-ориентированное программирование 265
11.1. Основные понятия 265
11.2. Создание класса и экземпляра класса 267
11.3. Объявление полей внутри класса 269
11.4. Определение методов внутри класса 271
11.5. Конструкторы класса 273
11.6. Явная инициализация полей класса 274
11.7. Инициализационные блоки 275
11.8. Вызов одного конструктора из другого 276
11.9. Создание констант класса 277
11.10. Статические члены класса 279
11.11. Методы-фабрики 281
11.12. Наследование 281
11.13. Переопределение методов базового класса 284
11.14. Финальные классы и методы 285
11.15. Абстрактные классы и методы 285
11.16. Вложенные классы 286
11.16.1. Обычные вложенные классы 286
11.16.2. Статические вложенные классы 288
11.16.3. Локальные вложенные классы 289
11.16.4. Анонимные вложенные классы 290
11.17. Приведение типов 291
11.18. Класс Object 293
11.19. Массивы объектов 296
11.20. Передача объектов в метод и возврат объектов 298
11.21. Классы-«обертки» над элементарными типами 301
Глава 12. Интерфейсы 303
12.1. Создание интерфейса 304
12.2. Реализация нескольких интерфейсов 309
12.3. Расширение интерфейсов 310
12.4. Создание статических констант внутри интерфейса 310
12.5. Создание статических методов внутри интерфейса 311
12.6. Методы по умолчанию и закрытые методы 312
12.7. Интерфейсы и обратный вызов 314
12.8. Функциональные интерфейсы и лямбда-выражения 317
12.9. Область видимости лямбда-выражений 322
12.10. Ссылки на методы 324
12.11. Интерфейс Comparable 327
12.12. Интерфейс Cloneable 329
Глава 13. Обобщенные типы 332
13.1. Зачем нужны обобщенные типы? 333
13.2. Обобщенные классы 335
13.3. Ограничение обобщенного типа 337
13.4. Обобщенные методы 339
13.5. Маски типов 341
13.6. Наследование обобщенных классов 343
13.7. Обобщенные интерфейсы 346
13.8. Ограничения на использование обобщенных типов 348
Глава 14. Коллекции. Списки и очереди 351
14.1. Интерфейс Collection
14.2. Интерфейсы Iterable
14.3. Интерфейсы Comparable
14.4. Интерфейс List
14.5. Класс ArrayList
14.5.1. Создание объекта 359
14.5.2. Вставка элементов 362
14.5.3. Определение количества элементов 364
14.5.4. Удаление элементов 365
14.5.5. Доступ к элементам 367
14.5.6. Поиск и замена элементов в списке 368
14.5.7. Поиск минимального и максимального значений в списке 371
14.5.8. Преобразование массива в список и списка в массив 373
14.5.9. Перемешивание и переворачивание списка 375
14.5.10. Сортировка элементов списка 376
14.5.11. Перебор элементов списка 378
14.5.12. Интерфейс ListIterator
14.6. Интерфейсы Queue
14.7. Класс ArrayDeque
14.7.1. Создание объекта 383
14.7.2. Вставка элементов 383
14.7.3. Определение количества элементов 385
14.7.4. Удаление элементов 386
14.7.5. Получение элементов из очереди 388
14.7.6. Проверка существования элементов в очереди 392
14.7.7. Поиск минимального и максимального значений в очереди 392
14.7.8. Преобразование массива в очередь и очереди в массив 394
14.7.9. Перебор элементов очереди 395
14.8. Класс PriorityQueue
14.9. Класс LinkedList
14.10. Класс Vector
14.10.1. Создание объекта 403
14.10.2. Методы класса Vector
14.10.3. Интерфейс Enumeration
14.11. Класс Stack
14.12. Класс BitSet: набор битов 411
Глава 15. Коллекции. Множества и словари 415
15.1. Интерфейс Set
15.2. Класс HashSet
15.2.1. Создание объекта 417
15.2.2. Вставка элементов 419
15.2.3. Определение количества элементов 420
15.2.4. Удаление элементов 420
15.2.5. Проверка существования элементов 422
15.2.6. Преобразование массива во множество и множества в массив 422
15.2.7. Перебор элементов множества 424
15.3. Класс LinkedHashSet
15.4. Интерфейсы SortedSet
15.5. Класс TreeSet
15.5.1. Создание объекта 426
15.5.2. Методы из интерфейса SortedSet
15.5.3. Методы из интерфейса NavigableSet
15.6. Интерфейс Map
15.7. Класс HashMap
15.7.1. Создание объекта 434
15.7.2. Вставка элементов 436
15.7.3. Определение количества элементов 437
15.7.4. Удаление элементов 437
15.7.5. Доступ к элементам 438
15.7.6. Изменение значений элементов 440
15.7.7. Проверка существования элементов 441
15.7.8. Перебор элементов словаря 442
15.8. Класс LinkedHashMap
15.9. Интерфейсы SortedMap
15.10. Класс TreeMap
15.10.1. Создание объекта 445
15.10.2. Методы из интерфейса SortedMap
15.10.3. Методы из интерфейса NavigableMap
15.11. Класс Hashtable
15.12. Класс Properties: словарь, состоящий из конфигурационных данных 456
Глава 16. Пакеты, JAR-архивы и модули 462
16.1. Инструкция import 462
16.2. Импорт статических членов класса 464
16.3. Инструкция package 464
16.4. Пути поиска классов 467
16.5. JAR-архивы 472
16.5.1. Создание JAR-архива 472
16.5.2. Исполняемые JAR-архивы 474
16.5.3. Редактирование JAR-архивов 475
16.5.4. Создание JAR-архива в редакторе Eclipse 476
16.6. Модули 478
16.6.1. Безымянные модули 479
16.6.2. Автоматические модули 479
16.6.3. Создание модуля из командной строки 479
16.6.4. Файл module-info 483
16.6.5. Создание модульного JAR-архива 485
16.6.6. Создание модуля в редакторе Eclipse 486
Глава 17. Обработка ошибок 493
17.1. Типы ошибок 493
17.2. Инструкция try catch finally 495
17.3. Оператор throw: генерация исключений 501
17.4. Иерархия классов исключений 501
17.5. Типы исключений 505
17.6. Пользовательские классы исключений 506
17.7. Способы поиска ошибок в программе 507
17.8. Протоколирование 509
17.9. Инструкция assert 511
17.10. Отладка программы в редакторе Eclipse 512
Глава 18. Работа с файлами и каталогами 518
18.1. Класс File 519
18.1.1. Создание объекта 519
18.1.2. Преобразование пути к файлу или каталогу 520
18.1.3. Работа с дисками 525
18.1.4. Работа с каталогами 526
18.1.5. Работа с файлами 529
18.1.6. Права доступа к файлам и каталогам 531
18.2. Класс Files 533
18.2.1. Класс Paths и интерфейс Path 533
18.2.2. Работа с дисками 539
18.2.3. Работа с каталогами 541
18.2.4. Обход дерева каталогов 545
18.2.5. Работа с файлами 549
18.2.6. Права доступа к файлам и каталогам 553
18.2.7. Атрибуты файлов и каталогов 553
18.2.8. Копирование и перемещение файлов и каталогов 557
18.2.9. Чтение и запись файлов 558
18.3. Получение сведений об операционной системе 562
Глава 19. Байтовые потоки ввода/вывода 565
19.1. Базовые классы байтовых потоков ввода/вывода 565
19.1.1. Класс OutputStream 566
19.1.2. Класс FileOutputStream 567
19.1.3. Класс InputStream 569
19.1.4. Класс FileInputStream 573
19.2. Интерфейс AutoCloseable и инструкция try-with-resources 574
19.3. Буферизованные байтовые потоки 576
19.3.1. Класс BufferedOutputStream 576
19.3.2. Класс BufferedInputStream 577
19.4. Класс PushbackInputStream 578
19.5. Запись и чтение двоичных данных 579
19.5.1. Класс DataOutputStream 579
19.5.2. Интерфейс DataOutput 579
19.5.3. Класс DataInputStream 580
19.5.4. Интерфейс DataInput 581
19.6. Сериализация объектов 582
19.6.1. Класс ObjectOutputStream 583
19.6.2. Интерфейс ObjectOutput 584
19.6.3. Класс ObjectInputStream 584
19.6.4. Интерфейс ObjectInput 584
19.7. Файлы с произвольным доступом 586
Глава 20. Символьные потоки ввода/вывода 589
20.1. Базовые классы символьных потоков ввода/вывода 589
20.1.1. Класс Writer 589
20.1.2. Класс OutputStreamWriter 591
20.1.3. Класс Reader 593
20.1.4. Класс InputStreamReader 596
20.2. Буферизованные символьные потоки ввода/вывода 598
20.2.1. Класс BufferedWriter 598
20.2.2. Класс BufferedReader 600
20.3. Класс PushbackReader 602
20.4. Классы PrintWriter и PrintStream 603
20.4.1. Класс PrintWriter 603
20.4.2. Класс PrintStream 607
20.4.3. Перенаправление стандартных потоков вывода 608
20.5. Класс Scanner 609
20.6. Класс Console 617
Глава 21. Работа с потоками данных: Stream API 621
21.1. Создание потока данных 621
21.1.1. Создание потока из коллекции 621
21.1.2. Создание потока из массива или списка значений 623
21.1.3. Создание потока из строки 625
21.1.4. Создание потока из файла или каталога 626
21.1.5. Создание потока с помощью итератора или генератора 627
21.1.6. Создание потока случайных чисел 629
21.1.7. Создание пустого потока 630
21.2. Промежуточные операции 630
21.2.1. Основные методы 630
21.2.2. Преобразование типа потока 634
21.2.3. Объединение и добавление потоков 636
21.3. Терминальные операции 637
21.3.1. Основные методы 637
21.3.2. Класс Optional
21.3.3. Преобразование потока в коллекцию, массив или в другой объект 647
Глава 22. Взаимодействие с сетью Интернет 650
22.1. Класс URI 653
22.2. Класс URL 657
22.2.1. Разбор URL-адреса 658
22.2.2. Кодирование и декодирование строки запроса 660
22.2.3. Получение данных из сети Интернет 661
22.3. Классы URLConnection и HttpURLConnection 662
22.3.1. Установка тайм-аута 662
22.3.2. Получение заголовков ответа сервера 663
22.3.3. Отправка заголовков запроса 665
22.3.4. Отправка запроса методом GET 666
22.3.5. Отправка запроса методом POST 668
22.3.6. Отправка файла методом POST 670
22.3.7. Обработка перенаправлений 672
22.3.8. Обработка кодов ошибок 673
Глава 23. Работа с базой данных MySQL 674
23.1. Установка JDBC-драйвера 674
23.2. Регистрация JDBC-драйвера и подключение к базе данных 676
23.3. Создание базы данных 677
23.4. Создание таблицы 678
23.5. Добавление записей 679
23.6. Обновление и удаление записей 682
23.7. Получение записей 682
23.8. Метод execute() 684
23.9. Получение информации о структуре набора ResultSet 686
23.10. Транзакции 687
23.11. Получение информации об ошибках 688
Глава 24. Многопоточные приложения 690
24.1. Создание и прерывание потока 690
24.2. Потоки-демоны 694
24.3. Состояния потоков 694
24.4. Приоритеты потоков 695
24.5. Метод join() 695
24.6. Синхронизация 696
24.6.1. Ключевое слово volatile 698
24.6.2. Ключевое слово synchronized 698
24.6.3. Синхронизированные блоки 699
24.6.4. Методы wait(), notify() и notifyAll() 699
24.7. Пакет java.util.concurrent.locks 702
24.7.1. Интерфейс Lock 702
24.7.2. Интерфейс Condition 703
24.8. Пакет java.util.concurrent 704
24.8.1. Интерфейс BlockingQueue
24.8.2. Интерфейс BlockingDeque
24.8.3. Класс PriorityBlockingQueue
24.8.4. Интерфейсы Callable
24.8.5. Пулы потоков 713
24.9. Синхронизация коллекций 715
Глава 25. Java SE 11 717
25.1. Установка OpenJDK 11 717
25.2. Установка и настройка редактора Eclipse 719
25.3. Компиляция и запуск программы в Java 11 724
25.4. Инструкция var в лямбда-выражениях 725
25.5. Новые методы в классе String 726
25.6. Новый метод of() в интерфейсе Path 728
25.7. Новые методы в классе Files 728
25.8. Новый формат метода toArray() в интерфейсе Collection
25.9. Новый метод not() в интерфейсе Predicate
25.10. Модуль java.net.http 731
25.10.1. Класс HttpRequest: описание параметров запроса 731
25.10.2. Класс HttpClient: отправка запроса и получение ответа сервера 732
25.10.3. Интерфейс HttpResponse
25.10.4. Отправка запроса методом GET 736
25.10.5. Отправка запроса методом POST 738
Заключение 741
Приложение. Описание электронного архива 743
Предметный указатель 745