ответы на ревью. Integer pool. Особенность Integer pool'а в том, что он хранит только числа 128 до 127Для остальных чисел из Integer'а пул не работаетBigInteger в Java
Скачать 0.94 Mb.
|
часть оператора инициализирует переменную b, вторая ее проверяет, а третья выводит на консоль сообщение. По существу эта программа делает то же приветствие аргументов, если они есть. Если их нет, то ни чего не выводит. Сразу же приведу пример ее вывода: Как видно из вывода этой программы, итерационная часть выполняется, как уже и говорилось, после выполнения тела цикла. В данном случае это оператор println в строке 9. Оператор for в данном коде растянулся на две строки 9 и 10, поскольку он достаточно длинный. Я это сделал для демонстрации того, что каждая часть оператора for может быть применена в разных целях. Стоит еще заметить, что приращение переменной i происходит в строке 12 и там же задается условие для продолжения или выхода из цикла, которое проверяется в строке 9. Еще один подобный пример, цикл for можно задействовать для прохождения по элементам связного списка: Стоит, так же, отметить, что любую из частей цикла for (инициализацию, условие и итерационную) или даже все можно пропустить. Например, можно создать таким образом бесконечный цикл: for ( ;; ){ //бесконечный цикл } Инициализационное или итерационное выражения либо они оба могут отсутствовать: В этом примере инициализационное и итерационное выражения вынесены за пределы определения оператора for. В результате соответствующие части оператора for пусты. Чтобы последовательность выполнения частей оператора for стала более наглядный я приведу небольшой пример. Хотя методы мы еще не изучали, но я надеюсь идея этой программы будет вам понята. Смысл ее в том, чтобы наглядно показать последовательность выполнения всех частей оператора for. Из вывода программы видно, что инициализационная часть программы (метод initTest()) выполняется только один раз. Затем выполняется проверка условия, представленная методом condTest(). После проверки условия, выполняется тело цикла. И уже после этого выполняется часть повторение, представленная методом recTest(). В методе condTest() выполняется проверка условия продолжения цикла. В данном случае переменная i сравнивается c 4, и пока переменная i меньше 4, то тело цикла выполняется. Тело цикла выполняется четыре раза так как переменная i была по умолчанию проинициализирована нулем. Оператор foreach Начиная с версии JDK 5 в Java можно использовать вторую форму цикла for, реализующую цикл в стиле foreach (“для каждого”). Цикл в стиле foreach предназначен для строго последовательного выполнения повторяющихся действий по отношению к коллекциям объектов, например, таких как массивы. В Java возможность применения цикла foreach реализована за счет усовершенствования цикла for. Общая форма версии foreach цикла for имеет следующий вид: for (тип итерационная переменная : коллекция) блок-операторов Тип это тип переменной, итерационная переменная — имя итерационной переменной, которая последовательно будет принимать значения из коллекции, от первого до последнего. Элемент коллекция указывает коллекцию, по которой должен выполняться цикл. С циклом for можно применять различные типы коллекций, но пока мы будем использовать только массивы, кстати которые тоже пока не проходили, но по крайней мере уже было много примеров с приветствиями из массива строк, куда попадают аргументы командной строки. На заметку: оператор foreach применим к массивам и классам, реализующим интерфейс java.lang.Iterable. На каждой итерации цикла программа извлекает следующий элемент коллекции и сохраняет его в итерационной переменной. Цикл выполняется до тех пор, пока не будут получены все элементы коллекции. Хотя повторение цикла for в стиле foreach выполняется до тех пор, пока не будут обработаны все элементы массива (коллекции), цикл можно прервать и раньше, используя оператор break. Поскольку итерационная переменная получает значения из коллекции, ее тип должен совпадать (или быть совместимым) с типом элементов, хранящихся в коллекции. Таким образом, при выполнении цикла по массивам тип должен быть совместим с базовым типом массива. Чтобы понять побудительные причины применения циклов в стиле foreach, рассмотрим тип цикла for, для замены которого предназначен этот стиль. Возьмем опять наш пример с приветствием аргументов из командной строки: Не правда ли, это куда элегантней, чем применение других операторов цикла, для этой цели? Собственно у этой программы простой вывод: Мы его уже много раз видели в разных вариантах, но повторенье – мать ученья. Для полной ясности рассмотрим еще несколько примеров. При каждом прохождении цикла переменной x автоматически присваивается значение, равное значению следующего элемента массива nums. Таким образом, на первой итерации x содержит 1, на второй — 2 и т.д. При этом упрощается синтаксис программы, и исключается возможность выхода за пределы массива. Вывод этой части программы такой: Хотя повторение цикла for в стиле foreach выполняется до тех пор, пока не будут обработаны все элементы массива, цикл можно прервать и раньше, используя оператор break. Например: В данном примере цикл отработает только три итерации, после чего произойдет выход из цикла по условию оператора if, который вызовет срабатывание оператора break. Важно, так же, понимать, что итерационная переменная получает значения из коллекции (массива), на каждой итерации, поэтому, даже если ее значение изменить в теле цикла, то на следующей итерации она снова примет следующее значение из коллекции. И тем более ее изменения ни как не влияют на значения коллекции (элементы массива в данном примере). Данный код выведет следующее: Любой метод, возвращающий массив, может использоваться с foreach. Например класс String содержит метод toCharArray, возвращающий массив char. Пример: Данный код просто выведет посимвольно строку Привет Мир! На этом с данными операторами можно закончить. Единственное что стоит еще упомянуть, это то, что в инициализационной части можно объявлять только переменные одного типа, или же инициализировать переменные разных типов, но такие которые могут быть приведены к одному общему типу по правилу приведения типов, которые мы рассматривали раньше. На последок, приведу еще пару примеров продвинутого оператора for. По большому счету, это просто отрефактореный код того примера что я уже приводил. Не правда ли, что этот код стал более читаем и понятен, чем тот, что я уже приводил? Или же не понятно? Ну тогда смотрим на другой пример кода, который делает тоже самое. Неужели опять не понятно? Оба этих кода делают одинаковый вывод: Конечно при условии что аргументами в командной строке были Вася и Петя. На этом с оператором for и его тенью foreach закончим. 35. Расширенный break 1. Оператор break . Особенности применения. Общая форма Оператор break осуществляет выход из блока фигурных скобок { } оператора цикла или оператора switch и передает управление следующему оператору в программе. Если используются вложенные операторы, то оператор break осуществляет выход из самого внутреннего оператора. Общая форма оператора break следующая break ; ⇑ 2. Оператор break с меткой. Особенности применения. Ключевое слово goto Оператор break с меткой может применяться как аналог оператора goto , который присутствует в других языках программирования. В языке Java оператор goto не используется. Однако, ключевое слово goto есть зарезервированным. Общая форма оператора break с меткой имеет следующий вид: break labelName; где labelName – это метка, которая соответствует кодовому блоку. Кодовый блок – это набор операторов, взятых в фигурные скобки { } . Если в программе встречается оператор break с меткой, то происходит переход к метке, которая должна быть реализована в программе. Общая форма объявления метки следующая labelName: { // последовательность операторов // ... } где labelName – имя метки. Имя метки задается также как и для любого идентификатора. ⇑ 3. В каких операторах можно использовать оператор break ? Оператор break можно использовать во всех операторах цикла и операторе switch . Другими словами, оператор break не может быть использован за пределами цикла или оператора switch . ⇑ 4. Оператор continue . Особенности применения. Общая форма Оператор continue применяется в циклах . Оператор continue обеспечивает переход к следующей итерации в цикле. Общая форма оператора continue имеет вид: continue ; Чаще всего оператор continue вызывается при достижении некоторого условия в теле цикла. ⇑ 5. Оператор continue с меткой Оператор continue может быть реализован с меткой. В этом случае общая форма оператора continue следующая continue labelName; где labelName – имя метки, которая соответствует циклу, в котором реализован вызов с помощью оператора continue . ⇑ 6. В каких операторах можно применять оператор continue ? Оператор continue можно применять только в циклах. Другими словами, оператор continue нельзя применять за пределами цикла. ⇑ 7. Примеры решения задач, в которых используется оператор break Пример 1. Определение наличия отрицательного числа в одномерном массиве. // Определение наличия отрицательного числа в одномерном массиве int A[] = { 3, 5, -7, 20, 39, 12 }; boolean f_is = false ; for ( int i=0; i length ; i++) if (A[i]<0) // есть ли отрицательное число в массиве? { f_is = true ; // если есть, то решение найдено break ; // выход из цикла, дальнейшее выполнение цикла не имеет смысла } if (f_is) System. out .println( "Отрицательное число есть в массиве." ); else System. out .println( "Отрицательного числа нет в массиве." ); Пример 2. Определение наличия заданного числа n в двумерном массиве размером 2*3. В данном примере оператор break вызывается два раза. Первый раз, когда нужно выйти из внутреннего цикла, в котором переменная j есть итератором. Второй раз, когда нужно выйти из внешнего цикла, в котором переменная i есть итератором. // Определение наличия отрицательного числа в одномерном массиве int A[][] = { { 3, 5, -3 }, { 2, 8, 0 } }; boolean f_is = false ; int n = 5; for ( int i=0; i length ; i++) { for ( int j=0; j length ; j++) if (A[i][j]==n) { f_is = true ; // если число найдено, то выход из внутреннего цикла break ; // дальнейшее выполнение не имеет смысла } if (f_is) break ; // выход из внешнего цикла } if (f_is) System. out .println( "Число есть в массиве." ); else System. out .println( "Числа нет в массиве." ); Если двумерный массив есть большим по размеру, то использование оператора break повышает скорость выполнения цикла. ⇑ 8. Пример использования оператора break с меткой Оператор break с меткой работает так же, как и оператор goto в других языках программирования. В языке Java оператор goto не используется. Однако, ключевое слово goto зарезервировано. Вместо goto используется оператор break с меткой с некоторыми ограничениями. Задан двумерный массив целых чисел. Определить, есть ли в массиве отрицательные элементы. Ниже приведен фрагмент кода, решающий данную задачу. // Оператор break с меткой int [][] A = { { 2, 5, 8, }, { 3, -7, 4 }, { -2, 1, 3 }, { -4, 2, 3 } }; boolean f_is = false ; // метка с именем M1 M1: for ( int i=0; i length ; i++) for ( int j=0; j length ; j++) { k++; if (A[i][j]<0) { f_is = true ; break M1; // полное завершение цикла, переход к следующему оператору // continue M1; - переход к следующей итерации внешнего цикла (счетчик i) } } if (f_is) System. out .println( "В массиве A есть положительные элементы." ); else System. out .println( "В массиве A положительных элементов нет" ); Перебор всех элементов двумерного массива осуществляется в двух вложенных циклах. Перед вызовом циклов помещена метка с именем M1 . Если в цикле нижнего уровня (счетчик j ) встречается команда break M1; то происходит выход с обоих циклов и переход к следующему оператору программы: ... if (f_is) System. out .println( "В массиве A есть положительные элементы." ); else System. out .println( "В массиве A положительных элементов нет" ); Если метку M1 разместить перед оператором if , например: ... M1: if (f_is) System.out.println( "В массиве A есть положительные элементы." ); else System.out.println( "В массиве A положительных элементов нет" ); то компилятор Java сгенерирует ошибку Unresolved compilation problem: The label M1 is missing так как в операторе break с меткой, метка может размещаться только перед циклом, в котором она используется. ⇑ 9. Примеры решения задач, в которых используется оператор continue |