- •Глава 2 3
- •Глава 3 11
- •Глава 10 117
- •Глава 2 Автоупаковка и автораспаковка
- •Обзор оболочек типов и упаковки значений
- •Основы автоупаковки/распаковки
- •Автоупаковка и методы
- •Автоупаковка/распаковка в выражениях
- •Автоупаковка/распаковка логических и символьных значений
- •Помощь автоупаковки/распаковки в предупреждении ошибок
- •Предостережения
- •Глава 3 Настраиваемые типы
- •Что такое настраиваемые типы
- •Простой пример применения настраиваемых типов
- •Средства настройки типов работают только с объектами
- •Различия настраиваемых типов, основанных на разных аргументах типа
- •Как настраиваемые типы улучшают типовую безопасность
- •Настраиваемый класс с двумя параметрами типа
- •Общий вид объявления настраиваемого класса
- •Ограниченные типы
- •Применение метасимвольных аргументов
- •Ограниченные метасимвольные аргументы
- •Создание настраиваемого метода
- •Настраиваемые конструкторы
- •Настраиваемые интерфейсы
- •Типы raw и разработанный ранее код
- •Иерархии настраиваемых классов
- •Использование настраиваемого суперкласса
- •Настраиваемый подкласс
- •Сравнения типов настраиваемой иерархии во время выполнения программы
- •Переопределенные методы в настраиваемом классе
- •Настраиваемые типы и коллекции
- •Стирание
- •Методы-подставки
- •Ошибки неоднозначности
- •Некоторые ограничения применения настраиваемых типов
- •Нельзя создавать объекты, используя параметры типа
- •Ограничения для статических членов класса
- •Ограничения для настраиваемого массива
- •Ограничение настраиваемых исключений
- •Заключительные замечания
- •Глава 4 Вариант For-Each цикла for
- •Описание цикла for-each
- •Обработка многомерных массивов в цикле
- •Область применения цикла for в стиле for-each
- •Использование цикла for в стиле for-each для обработки коллекций
- •Создание объектов, реализующих интерфейс Iterable
- •Глава 5 Аргументы переменной длины
- •Средство формирования списка с переменным числом аргументов
- •Перегрузка методов с аргументом переменной длины
- •Аргументы переменной длины и неоднозначность
- •Глава 6 Перечислимые типы
- •Описание перечислимого типа
- •Методы values() и valueOf()
- •Перечислимый тип в Java — это класс
- •Перечислимые типы, наследующие тип enum
- •Глава 7 Метаданные
- •Описание средства "метаданные"
- •Задание правил сохранения
- •Получение аннотаций во время выполнения программы с помощью рефлексии
- •Листинг 7.3. Получение всех аннотаций для класса и метода
- •Интерфейс AnnotatedElement
- •Использование значений по умолчанию
- •Аннотации-маркеры
- •Одночленные аннотации
- •Встроенные аннотации
- •Несколько ограничений
- •Глава 8 Статический импорт
- •Описание статического импорта
- •Общий вид оператора статического импорта
- •Импорт статических членов классов, созданных Вами
- •Неоднозначность
- •Предупреждение
- •Глава 9 Форматированный ввод/вывод
- •Форматирование вывода с помощью класса Formatter
- •Конструкторы класса Formatter
- •Методы класса Formatter
- •Основы форматирования
- •Форматирование строк и символов
- •Форматирование чисел
- •Форматирование времени и даты
- •Спецификаторы %n и %%
- •Задание минимальной ширины поля
- •Задание точности представления
- •Применение флагов форматирования
- •Выравнивание вывода
- •Флаг запятая
- •Применение верхнего регистра
- •Использование порядкового номера аргумента
- •Применение метода printf() языка Java
- •Класс Scanner
- •Конструкторы класса Scanner
- •Описание форматирования входных данных
- •Несколько примеров применения класса Scanner
- •Установка разделителей
- •Другие свойства класса Scanner
- •Глава 10 Изменения в api
- •Возможность применения настраиваемых типов при работе с коллекциями
- •Обновление класса Collections
- •Почему настраиваемые коллекции
- •Модернизация других классов и интерфейсов для применения настраиваемых типов
- •Новые классы и интерфейсы, добавленные в пакет java.Lang
- •Класс ProcessBulider
- •Класс StringBuilder
- •Интерфейс Appendable
- •Интерфейс Iterable
- •Интерфейс Readable
- •Новые методы побитной обработки классов Integer и Long
- •Методы signum() u reverseBytes()
- •Поддержка 32-битных кодовых точек для символов Unicode
- •Новые подпакеты пакета java.Lang
- •Классы Formatter и Scanner
Обработка многомерных массивов в цикле
Улучшенная версия цикла for может применяться для обработки многомерных массивов (multidimensional array).
Напоминаю, что в языке Java многомерные массивы представляют собой массивы массивов (arrays of arrays) (например двухмерный массив — это массив из одномерных массивов). Это важно при циклической обработке многомерного массива, так как в каждом проходе цикла извлекается следующий массив, а не отдельный элемент. Более того, тип переменной цикла в цикле for должен быть совместим с типом получаемого массива. Например, в случае двухмерного массива переменная цикла должна быть ссылкой на одномерный массив. Вообще при использовании цикла for в стиле for-each для обработки массива с N измерениями получаемые объекты должны быть массивами с N-1 измерениями. Для того чтобы лучше понять смысл этого рассмотрим программу, приведенную в листинге 4.4. В ней применены вложенные циклы for для получения всех элементов двухмерного массива в порядке их следования в строках
Листинг 4.4. Использование цикла for в стиле for-each для обработки двухмерного массива
class ForEach3 {
public static void main(String args[]) {
int sum = 0;
int nums[][] = new int[3][5];
// give nums some values
for(int i = 0; i < 3; i++)
for(int j=0; j < 5; j++)
nums[i][j] = (i+1)*(j+1);
// use for-each for to display and sum the values
for(int x[] : nums) {
for(int y : x) {
System.out.println("Value is: " + y);
sum += y;
}
}
System.out.println("Summation: " + sum);
}
}
Далее приведен вывод результатов работы программы из листинга 4.4:
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Value is: 2
Value is: 4
Value is: 6
Value is: 8
Value is: 10
Value is: 3
Value is: 6
Value is: 9
Value is: 12
Value is: 15
Summation: 90
В листинге 4.4 обратите особое внимание на следующую строку:
for(int x[] : nums) {
Посмотрите, как определена переменная цикла, х. Это ссылка на одномерный массив целых чисел. Подобное объявление необходимо, так как в каждом проходе цикла for извлекается следующий массив из двухмерного массива nums, начиная с массива заданного как nums[0]. Внутренний цикл for затем просматривает каждый из этих массивов, отображая значения каждого элемента.
Область применения цикла for в стиле for-each
Поскольку цикл for в стиле for-each может обрабатывать массив только последовательно от начала к концу, Вы можете подумать, что область его применения ограничена, но это неверно. Множество алгоритмов нуждается именно в такой обработке. Один из наиболее общих примеров — поиск. В программе, приведенной в листинге 4.5, цикл for используется для поиска значения в не отсортированном массиве. Цикл прерывается, когда искомое значение найдено.
Листинг 4.5. Поиск в массиве с помощью цикла for в стиле for - each
class Search {
public static void main(String args[]) {
int nums[] = { 6, 8, 3, 7, 5, 6, 1, 4 };
int val = 5;
boolean found = false;
// use for-each style for to search nums for val
for(int x : nums) {
if(x == val) {
found = true;
break;
}
}
if(found)
System.out.println("Value found!");
}
}
Цикл for в стиле for-each — отличный выбор для приложения из листинга 4.5, поскольку поиск в не отсортированном массиве подразумевает последовательную проверку каждого элемента (конечно, если массив отсортирован, можно применить двоичный поиск, который потребует применения цикла другого стиля). К другим типам приложений, выигрывающих от использования цикла for в стиле for-each, относятся вычисление среднего арифметического, поиск минимального или максимального значения в наборе, поиск дублирующих значений и т. д.
