Главная страница

ответы на ревью. Integer pool. Особенность Integer pool'а в том, что он хранит только числа 128 до 127Для остальных чисел из Integer'а пул не работаетBigInteger в Java


Скачать 0.94 Mb.
НазваниеInteger pool. Особенность Integer pool'а в том, что он хранит только числа 128 до 127Для остальных чисел из Integer'а пул не работаетBigInteger в Java
Анкорответы на ревью
Дата03.09.2022
Размер0.94 Mb.
Формат файлаpdf
Имя файла___________1.docx.pdf
ТипДокументы
#660209
страница1 из 3
  1   2   3


Integer pool.
Особенность Integer pool'а в том, что он хранит только числа -128 до 127
Для остальных чисел из Integer'а пул не работает
BigInteger в Java
Число произвольной длинны, у него нет ограничения в размерах
Константы:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
он полон методов, реализующих стандартные арифметические операции
BigDecimal в Java
вещественное число произвольной длины
Класс
BigDecimal также содержит в себе методы для разнообразных арифметических операций, но методов работы с битами, как у
BigInteger
, у него нет.
В состав примитивных типов восемь типов данных:
целые числа (byte, short, int, long)
числа с плавающей точкой (float, double)
логический (boolean)
символьный (char)
Ссылочные
Класс String обёртки
Размер типа boolean зависит от реализации конкретной виртуальной машины.

Размер типа boolean в массиве зависит от реализации конкретной виртуальной машины.
что происходит при преобразовании int в byte
Происходит явное приведение типов. Из большего в меньшее. Это сужение
Бывает и не явное преобразвание типов. Из меньшего в большее. Явно указывать ничего не надо.
Недостатки рекурсии состоят в следующем:
При вызове рекурсивного метода его параметры копируются в стек.
Также запоминаются временные значения локальных внутренних переменных. При завершении вызова рекурсивной функции предыдущие значения параметров вытягиваются из стека, что приводит к лишним операциям.
Если рекурсивная функция вызывается много раз, то это может привести к чрезмерно большому использованию памяти.
Литералы
Литералы — это явно заданные значения в коде программы — константы определенного типа, которые находятся в коде в момент запуска.
Java byte
И состоит он из 8 бит.
То есть 128 никак не обозначить, т.к. это будет -128.
short
16 бит
Значит, диапазон от -32768 до 32767.
int
Занимает он 32 бита
long
64 бита.
Для обозначения того, что число это long после числа ставят литерал L –
Long.

Float, Double float является 32 битным double 64 битный

Java boolean
Следующий тип – булевский (логический тип). Он может принимать значения только true или false,. Но на самом деле Boolean будет занимать больше памяти и это будет зависеть от конкретной реализации JVM.
Обычно на это тратится столько же, сколько на int. Как вариант –
использовать BitSet.
Java char
Вот мы и добрались до последнего примитивного типа. Итак, данные в char занимают 16 бит и описывают символ. В Java для char используется кодировка Unicode.
Классы-обертки
Примитивы имеют свои классы-обертки, чтобы можно было работать с ними как с объектами. То есть, для каждого примитивного типа существует,
соответствующий ему ссылочный тип.
Классы-обертки являются immutable (неизменяемыми): это означает, что после создания объекта его состояние — значение поля value — не может быть изменено. Классы-обертки задекларированы как final: объекты, так сказать, read-only. Также хотелось бы упомянуть, что от этих классов невозможно наследоваться. Java автоматически делает преобразования между примитивными типами и их обертками:
Integer x =
9
;
// autoboxing
int
n =
new
Integer(
3
); // unboxing для преобразования значения примитивного типа есть статические методы valueOf, например, Integer.valueOf(4) вернёт объект типа Integer. Для обратного преобразования есть методы intValue(), longValue() и т. п.
Компилятор вставляет вызовы valueOf и *Value самостоятельно, это и есть суть autoboxing и unboxing. Как выглядит пример автоупаковки и автораспаковки, представленный выше, на самом деле:
Integer x = Integer.
valueOf
(
9
);
int
n =
new
Integer(
3
).
intValue
();

Класс String
Этот класс представляет собой последовательность символов. Все определенные в программ строковые литералы, вроде "This is String" — это экземпляры класса String. У String есть две фундаментальные
особенности:
• это immutable (неизменный) класс
• это final класс

На самом деле, в силу неизменности класса String, в результате каждой операции создаются новые экземпляры строк, а старые отбрасываются, порождая большое количество мусора.
Что такое строковый пул?
Строковый пул или String pool — это особое место в heap’е, куда попадают объекты типа String после их создания. Он выполняет функцию кеша строк.
Каждый раз, когда Вы создаёте строку, она попадает в строковый пул. Если же на момент создания новой строки пул уже содержит такое же значение, то вместо создания нового объекта возвращается тот, что уже лежит в пуле.
А как тогда сделать так, чтобы строки в пул не попадали?
String text = new String(“text”);
В этом случае, объект типа String будет создан, память под него будет
выделена в heap’е, но в строковый пул он не попадёт.
String text = “Hello World”;
String text2 = new String(“Hello World”);
System.out.println(text == text2);
Результатом работы кода выше будет `false`, потому что теперь ссылки указывают на два разных объекта.
Ну и наконец, как добавить строку в строковый пул после её
создания? Для этого класс String содержит метод под названием `intern()`.

Immutable
Какие типы еще относятся к Immutable? Из того, что тебе железобетонно нужно запомнить уже сейчас — все классы-обертки над примитивными типами — неизменяемые.
Integer
,
Byte
,
Character
,
Short
,
Boolean
,
Long
,
Double
,
Float
— все эти классы создают Immutable объекты. Сюда же относятся и классы, используемые для создания больших чисел —
BigInteger и
BigDecimal
Класс StringBuffer
Чтобы справиться с созданием временного мусора из-за модификаций объекта String, можно использовать класс StringBuffer. Это mutable класс,
т.е. изменяемый. Объект класса StringBuffer может содержать в себе определенный набор символов, длину и значение которого можно изменить через вызов определенных методов.
Конкатенация строк через StringBuffer в Java выполняется с помощью метода append
Для работы со строками у класса StringBuffer есть ряд методов. Перечислим основные:

delete(int start, int end)
— удаляет подстроку символов начиная с позиции start
, заканчивая end

deleteCharAt(int index)
— удаляет символ в позиции index

insert(int offset, String str)
— вставляет строку str в позицию offset
Метод insert также перегружен и может принимать различные аргументы

replace(int start, int end, String str)
— заменит все символы начиная с позиции start до позиции end на str

reverse()
— меняет порядок всех символов на противоположный substring(int start)
— вернет подстроку, начиная с позиции start

substring(int start, int end)
— вернет подстроку, начиная с позиции start до позиции end
Преимущества:
• Как уже сказано, StringBuffer — изменяемый класс, поэтому при работе с ним не возникает такого же количества мусора в памяти, как
со String. Поэтому если над строками проводится много модификаций,
лучше использовать
StringBuffer
• StringBuffer — потокобезопасный класс. Его методы синхронизированы, а экземпляры могут быть использованы несколькими потоками одновременно.
Недостатки:
С одной стороны, потокобезопасность — преимущество класса, а другой —
недостаток. Синхронизированные методы работают медленнее не синхронизированных. И здесь в игру вступает StringBuilder. Давайте разберемся, что это за класс Java — StringBuilder, какие методы есть и в чем его особенности.
Класс StringBuilder
StringBuilder в Java — класс, представляющий последовательность символов. Он очень похож на StringBuffer во всем, кроме потокобезопасности. StringBuilder предоставляет API, аналогичный API
StringBuffer’a.
Разница лишь в том, что StringBuffer потокобезопасен, и все его методы синхронизированы, а StringBuilder — нет. Это единственная особенность.
StringBuilder в Java работает быстрее StringBuffer’а благодаря несинхронизированности методов. Поэтому в большинстве случаев, кроме многопоточной среды, лучше использовать для программы на Java
St r
ingBuilder.
append
(...)
Добавляет строковое представление booleanаргумента к последовательности.

Логические операции в Java
В Java доступны следующие логические операции:
Логическое отрицание, оно же
NOT
или инверсия. В Java обозначается символом “
!
” перед операндом. Применяется к одному операнду.
Логическое и, оно же
AND
или конъюнкция. Обозначается символом

&
” между двумя операндами, к которым применяется.
Логическое или в Java, оно же —
OR
, оно же — дизъюнкция. В Java обозначается символом “
|
” между двумя операндами.
Исключающее или,
XOR
, строгая дизъюнкция. В Java обозначается символом “
^
” между двумя операндами.

• В Java к логическим операторам можно отнести условное или,
обозначаемое как
||
, а также условное и
&&
Полные и сокращённые версии AND и OR
&& и || называются сокращёнными логическими операторами AND
и OR соответственно, или операторами короткой схемы вычислений.
В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа.
В отличие от двойных, одиночные & и | называются операторами полной
схемы вычислений. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях).
В чём разница
В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости.
Приоритет логических операций

!

&

^

|

&&

||
Поразрядные (побитовые) операторы
В начале статьи мы упомянули, что операторы
&
,
|
и
^
можно употреблять по отношению к целочисленным типам Java. В таком случае они являются поразрядными операторами. Их также называют побитовыми, поскольку один разряд — это и есть один бит, а эти операции работают именно с битами.
Остатки от деления на каждом шагу, записанные в обратном порядке, и дадут нам искомое двоичное число. Вот, например, перевод десятичного числа 103 в двоичное представление:

Помимо
&
,
|
и
^
в Java также используются поразрядные операторы:


поразрядный оператор отрицания

>>
побитовый сдвиг вправо

>>>
беззнаковый побитовый сдвиг вправо

<<
побитовый сдвиг влево
Та же логика прослеживается в случае с
|
и
^

Итак, рассмотрим их работу на примере.
int a = 13 a << 1
смещает все биты двоичного представления числа a влево на 1 бит.

Побитовый оператор отрицания
Этот унарный оператор работает очень просто: он меняет каждый бит бинарного представления целого числа на противоположный. Возьмем число
-13
:
11111111 11111111 11111111 11110011
Операция побитового отрицания
13
просто изменит значение каждого бита на противоположное. В результате мы получим:
00000000 00000000 00000000 00001100
char
Среди примитивных типов в Java есть еще один, который заслуживает особого внимания — тип char
. Используется для того, чтобы хранить символы.
char
— это и числовой тип тоже! Так сказать, тип двойного назначения.
char хранит не символы, а
коды символов
из кодировки Unicode. Каждому символу соответствует число — числовой код символа.

Каждая переменная типа char занимает в памяти два байта. Но в отличие от типа short
, целочисленный тип char
— беззнаковый, и может хранить значения от
0
до
65,535
Тип char
— гибридный тип. Его значения можно интерпретировать и как числа (их можно складывать и умножать), и как символы. Так было сделано потому, что хоть символы и имеют визуальное представление, для компьютера они в первую очередь просто числа. И работать с ними как с числами гораздо удобнее.
JAVA ЛОГИЧЕСКИЕ И УСЛОВНЫЕ ОПЕРАТОРЫ (IF, IF-ELSE И
SWITCH)
22 декабря 2013
Мария (admin)
Для того, чтобы изменить последовательность выполнения фрагментов программы, в языке Java применяются конструкции if, if-else и switch.
Любой класс-обертка со значением null будет выбрасывать java.lang.NullPointerException когда Java распакует(
unbox
) его в примитивную переменную. Некоторые программисты делают ошибку допуская, что авто упаковка(
autoboxing
) позаботится о конвертации null в значение по умолчанию для соответствующего примитивного типа,
например, 0 для int
, false для boolean и т.д., но это не верно, в чем можно убедиться ниже:
какая максимальная мерность массивов?
ответ: 255
Максимальная длинна массива?
Integer.MAX_VALUE
Как добавить String’у в pool строк?
Ответ: метод .intern();

Нередки ситуации, когда приходится применять различные операции,
например, сложение и произведение, над значениями разных типов. Здесь также действуют некоторые правила:
если один из операндов операции относится к типу double, то и второй операнд преобразуется к типу double если предыдущее условие не соблюдено, а один из операндов операции относится к типу float, то и второй операнд преобразуется к типу float если предыдущие условия не соблюдены, один из операндов операции относится к типу long, то и второй операнд преобразуется к типу long иначе все операнды операции преобразуются к типу int плюс бесконечность public static final double POSITIVE_INFINITY = 1.0
/ 0.0;
минус бесконечность плюс бесконечность public static final double NEGATIVE_INFINITY =
-1.0 / 0.0;
минус бесконечность
NaN
Строку конвертируем в число, а в ней есть буквы. Ответ — NaN
Бесконечность минус бесконечность. Ответ — NaN
Многие другие ситуации, где в ответе ждут число, а получается неизвестно что.
Как добавить String’у в pool строк?
В Java существует возможность вручную выполнить интернирование строки в пул путем вызова метода intern() у объекта типа String

Циклы в Java
Теперь рассмотрим циклы в Java. В этом ЯП их есть несколько типов:

while
— цикл с предусловием;

do..while
— цикл с постусловием;

for
— цикл со счетчиком (цикл для);

for each..
— цикл “для каждого…” — разновидность for для перебора коллекции элементов.
Что такое рекурсия?
означающий вызов функцией самой себя
2 условия рекурсии:
выход из рекурсии и уменьшение шага
Чем отличается метод от функции
Простой способ запомнить: F unction → F ree (Свободные означает не принадлежность к объекту или классу) M ethod → M ember (член объекта или класса)
Где находятся параметры и аргументы метода
Параметры
– это переменные которые описываются в круглых скобках при объявлении метода.
Аргументы – это значения которые передаются в метод при его вызове из другого кода.
Зачем нужны классы обертки
- для того чтобы использовать методы классов оберток, у примитивов их нету.

Вопросы на ревью
1. Какие примитивные типы есть в Java
Ответ: В Java существует четыре типа целочисленных данных: byte,
short, int и long, Для работы с действительными числами используются типы float и double (на практике обычно используется тип double), помощью этих типов реализуется формат числа с плавающей точкой(
вещественным типам)
,
для символьных данных используется тип char, а что касается логического типа boolean, то переменные этого типа могут принимать всего два значения: true (истина) и false (ложь).
2. Размерность примитивных типов

Тип данных
(название)
Количество битов
Описание byte
8
Целые числа в диапазоне от –128 до 127
short
16
Целые числа в диапазоне от –32 768 до 32 767
int
32
Целые числа в диапазоне от –2147483648 до
2147483647
long
64
Целые числа в диапазоне от
–9223372036854775808 до 9223372036854775807
float
32
Действительные числа. Минимальный шаг дискретности (точность) составляет величину 3,4 ×
10–38, максимальное значение (по модулю) — 3,4 ×
1038
double
64
Действительные числа (двойной точности).
Минимальный шаг дискретности (точность)
составляет величину 1,7 × 10–308, максимальное значение (по модулю) — 1,7 × 10308
char
16
Тип для представления символьных значений.
Реализуются символы с кодами от 0 до 65 536
boolean
Зависит от виртуальной машины
Логический тип данных. Переменная этого типа может принимать два значения: true (истина) и false
(ложь)
3. Что такое явные и неявные приведения, с чем
связано их наличие?
И так, Что значит привидение типа? А значит - это, преобразование одного типа в другой, к примеру из целочисленного в вещественный.
В Java имеется два вида преобразований явное и неявное и два типа преобразования расширяющее и сужающее. Начнем с неявного. Неявное - это автоматическое преобразование, которое Java делает сама. Что для этого нужно:
Обязательно, совместимость обоих типов.
Размерность преобразуемого типа должна быть равна или быть меньше результирующего типа.
Неявное преобразование.

На картинке показаны типы данных которые без проблем автоматически преобразуются в другие типы, ну кроме некоторых, которые имеют возможность потери точности.
Вероятность потерь - это возможная потеря точности или даже данных,
чаще при преобразовании вещественного в целочисленный тип теряется дробная часть, а хуже когда потеря происходит именно данных, к примеру попытка преобразовать значение типа "double" выходящее за рамки диапазона типа "long".
Java автоматически преобразовывает из типа в тип, неявное преобразование.
Расширяющее преобразование типа - это преобразование меньшего типа в больший, как в примерах на картинке выше, то есть переменная с типом данных меньшим диапазоном значений, перевоплощается в больший
диапазон. Из этого следует вывод, что неявное преобразование, всегда имеет расширяющий тип.
Если в выражении присутствуют значения или переменные типов "char",
"byte", "short" они преобразуются в тип "int", а если есть хотя бы один операнд с типом "long", то все выражение преобразуется в "long".
Неявное преобразование.
Примитивный тип "boolean" нельзя преобразовать в любой другой тип данных, аналогично и любой другой тип в "boolean" так же нельзя преобразовать.
Явное преобразование типов - это указание конкретного типа к которому мы хотим привести значение. Как правило, явное преобразование имеет сужающий тип, получается что мы из большего диапазона делаем меньший.
Указывается с помощью целевого типа обрамленного в круглые скобки
(byte), (int), (float) и так далее.
4. Какие данные мы рискуем потерять при
явных приведениях?
Ответ: При применении явных преобразований мы можем столкнуться с потерей данных. Например int a = 258;
byte b = (byte) a;
System.out.println(b); // 2
Результатом будет число 2. В данном случае число 258 вне диапазона для типа byte (от -128 до 127), поэтому произойдет усечение значения.
Почему результатом будет именно число 2?
Число a, которое равно 258, в двоичном системе будет равно 00000000 00000000 00000001 00000010. Значения типа byte занимают в памяти только 8 бит. Поэтому двоичное представление числа int усекается до
8 правых разрядов, то есть 00000010, что в десятичной системе дает число 2.

5. При сложении char short какой
результирующий тип получим?
Ответ:
•если один из операндов операции относится к типу double, то и второй операнд преобразуется к типу double
•если предыдущее условие не соблюдено, а один из операндов операции относится к типу float, то и второй операнд преобразуется к типу float
•если предыдущие условия не соблюдены, один из операндов операции относится к типу long, то и второй операнд преобразуется к типу long
•иначе все операнды операции преобразуются к типу int
Значит при сложении char short мы получим тип int.
6. StringBuilder.
Ответ: StringBuilder – это изменяемая последовательность символов. Этот класс предоставляет API, совместимый с StringBuffer, но без гарантии синхронизации.
Основными операциями над a StringBuilder являются методы append и insert,
которые перегружены, чтобы принимать данные любого типа. Каждый из них эффективно преобразует данные в строку, а затем добавляет или вставляет символы этой строки в построитель строк. Метод append всегда добавляет эти символы в конец построителя; метод insert добавляет символы в указанную точку.
Например, если z ссылается на объект построителя строк, текущим содержимым которого является " start", то вызов метода z.append("le")приведет к тому, что построитель строк будет содержать "
startle", тогда z.insert(4, "le")как построитель строк будет содержать " starlet".
В общем, если sb ссылается на экземпляр a StringBuilder, то sb.append(x)имеет тот же эффект, что и sb.insert(sb.length(), x). У каждого
StringBuilder есть емкость. Пока длина последовательности символов,
содержащейся в построителе строк, не превышает емкости, нет необходимости выделять новый внутренний буфер. Если внутренний буфер переполняется, он автоматически увеличивается.

7. Разница между String, StringBuilder и
StringBuffer?
Ответ:
Если метод, вызываемый объектом StringBuilder, производит изменения в его содержимом, то это не приводит к созданию нового объекта, как в случае объекта String, а изменяет текущий объект StringBuilder. Экземпляры
StringBuilder не безопасны для использования несколькими потоками. Если такая синхронизация требуется, то рекомендуется использовать StringBuffer.
StringBuilder рекомендуется использовать, только в случаях где стороковый буфер используется одним потоком, так как он быстрее в большинстве реализаций, чем класс StringBuffer.
8. Как добавить String’у в pool строк?
Ответ: метод .intern();
9. Pool примитивов
Ответ:
В Java есть пул(pool) целых чисел в промежутке [-128;127]. Т.е. если мы создаем Integer в этом промежутке, то вместо того, чтобы каждый раз создавать новый объект, JVM берет их из пула. Стоит заметить, что при использовалось ключевое слово new мы создаем новый объект и тогда уже создается новая ссылка
10.Неизменяемые типы
Ответ:
Если переменную объявить и инициализировать с ключевым словом final, то такая переменная становится константой. Изменить значение константы в процессе выполнения программы нельзя.
11.Логические операторы
Ответ:

Оператор
Описание
&
Логическое
AND (И)
&&
Сокращённое
AND
|
Логическое
OR (ИЛИ)
||
Сокращённое
OR
^
Логическое
XOR (исключающее OR (ИЛИ))
!
Логическое унарное
NOT (НЕ)
12.Отличие операторов сокращенных логических
операторов и полных
Ответ:
В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости.
То есть иногда результат выражения однозначно определён уже по первому операнду:
1. Если первый операнд && равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false.
2. Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true. && и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.

13.Оператор XOR. Представить таблицу
истинности для него
Ответ:
Исключающее «ИЛИ»
(XOR): строгая дизъюнкция, логическое вычитание
^
true ^ true false ^ false true ^ false false ^ true false false true true
14.Что такое char? Почему над ним можно
выполнять арифметические операции?
Ответ:
Для хранения символов Java использует специальный тип char.
Переменной можно присвоить код символа или непосредственно сам символ, который следует окружить одинарными кавычками.
Стандартные символы ASCII можно выводить сразу. Если нужно вывести специальный символ из Unicode, то можно воспользоваться шестнадцатеричным представлением кода в escape-последовательности - надо указать обратную наклонную черту и четыре цифры после u.
Например:
char myChar = '\u0054';
Хотя тип char используется для хранения Unicode-символов, его можно использовать как целочисленный тип, используя сложение или вычитание.
15.Какая размерность у boolean

Следующий тип – булевский (логический тип). Он может принимать значения только true или false,. Но на самом деле Boolean будет занимать больше памяти и это будет зависеть от конкретной реализации JVM.
Обычно на это тратится столько же, сколько на int. Как вариант –
использовать BitSet.
16.Размер boolean-значенией в массиве типов
boolean
Размер типа boolean в массиве зависит от реализации конкретной виртуальной машины.
17.Какие есть циклы в Java?
Ответ:
Для управления конструкциями, которые обычно называются циклами, в
Java предоставляются операторы for, while и do-while. Вам, должно быть,
известно, что циклы многократно выполняют один и тот же набор инструкций до тех пор, пока не будет удовлетворено условие завершения цикла.

while
— цикл с предусловием;

do..while
— цикл с постусловием;

for
— цикл со счетчиком (цикл для);

for each..
— цикл “для каждого…” — разновидность for для перебора коллекции элементов.
18.Чем отличаются друг от друга?
Ответ:
Оператор цикла while является самым простым для организации циклов в Java. В начале цикла while вычисляется условное выражение, поэтому тело цикла не будет выполнено ни разу, если в самом начале условие оказывается ложным.
while (условие) {
// тело цикла
}
Возможны случаи, когда проверку условия прерывания цикла желательно выполнять в конце цикла, а не в начале.
Для этой цели в Java предоставляется цикл, который называется do-while.
do {

// тело цикла
} while (условие)
Общая форма традиционной разновидности оператора цикла f or выглядит следующим образом:
fоr (инициализация; условие; итерация) {
// тело цикла
}
Или for (a=l, Ь=4; а<Ь; а++, Ь--)
Цикл повторяется, и на каждом его шаге сначала вычисляется условное выражение,
потом выполняется тело цикла, а после этого вычисляется итерационное выражение.
Этот процесс повторяется до тех пор, пока результат вычисления итерационного выражения не станет ложным.
оператор цикла for в стиле for each автоматически перебирает элементы массива, от наименьшего индекса к наибольшему.
Повторение цикла for в стиле for each выполняется до тех пор, пока не будут перебраны все элементы массива, но этот цикл можно прервать и раньше, используя оператор break.
int sum = О;
int nums[J = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
/!использовать цикл for в стиле for each для
// вывода и суммирования значений из части массива for(int х : nums) {
System.out.println("Знaчeниe равно: " + х);
sum += х;
if(x == 5) break; //прервать цикл после
//получения 5 значений
System.out.println(
"Сумма пяти первых элементов равна: " + sum);
19.Что такое рекурсия?
означающий вызов функцией самой себя
20.Недостатки и преимущества?
Можно выделить следующие взаимосвязанные преимущества рекурсии:
естественность (натуральность) выражения сложных, на первый взгляд,
алгоритмов. Рекурсивный алгоритм более читабелен в сравнении с итерационным; для многих распространенных задач рекурсию более легче реализовать чем итерацию. Рекурсия хорошо подходит для реализации алгоритмов обхода списков, деревьев, графов и т.д.
Недостатки рекурсии состоят в следующем: по сравнению с итерацией многократный вызов рекурсивной функции работает дольше. Это связано с тем, что при вызове рекурсивного метода его параметры копируются в стек.
Также запоминаются временные значения локальных внутренних
переменных. При завершении вызова рекурсивной функции предыдущие значения параметров вытягиваются из стека, что приводит к лишним операциям. Итерационный алгоритм для такой же задачи работает быстрее;
для рекурсивного процесса нужно больше памяти чем для итерации. Это связано с тем, что при рекурсивном вызове нужно сохранять предыдущее значение внутренних переменных вызывающей функции, чтобы по завершении рекурсивного вызова восстановить ее выполнение. Таким образом, если рекурсивная функция вызывается много раз, то это может привести к чрезмерно большому использованию памяти.
21. 2 случая (правила/условия) в рекурсивном
алгоритме?
выход из рекурсии и уменьшение шага
22.Какие классы-обертки знаешь?
Примитивный тип
Класс-обертка
byte
Byte short
Short char
Character int
Integer long
Long float
Float double
Double boolean
Boolean
23.Что такое Autoboxing, unboxing и когда они
происходят автоматически?
Автоупаковка и автораспаковка объектов

Автоупаковка (autoboxing) – это автоматическое преобразование, выполненное компилятором Java из примитива в соответствующий ему тип класса оболочки Java.
Это все равно, что использовать valueOf следующим образом :
// Автоупаковка
Integer integer1
=
3
;
Integer integer2
=
Integer valueOf
(
3
);
Автораспаковка
(unboxing) – это преобразование класса-обёртки в соответствующий ему примитивный тип. Если при распаковке класс-обёртка был равен null, произойдет исключение java.lang.NullPointerException.
Поскольку арифметические операторы и операторы сравнения (исключение == и !=)
применяются только к примитивным типам, приходилось делать распаковку вручную,
что заметно снижало читабельность выражений, делая их громоздкими.
Integer i1
=
new
Integer
(
14
);
Integer i2
=
new
Integer
(
28
);
System out println
(
i1
intValue
() >
i2
intValue
());
Благодаря автораспаковке можно смело использовать выражения, пренебрегая методами конвертации. Теперь это контролирует компилятор Java.
System out println
(
i1
>
i2
);
24.Какая максимальная длина массива?
255
25.Что такое массив и какие на нём есть
ограничения?
Массив - это группа однотипных переменных, для обращения к которым используется общее имя. В языке Java допускается создание массивов любого типа и разной размерности. Доступ к конкретному элементу массива осуществляется по его индексу. Массивы предоставляют удобный способ группирования связанной вместе информации.
По существу, одномерные массивы представляют собой список однотипных переменных. Чтобы создать массив, нужно сначала объявить переменную массива требуемого типа. Общая форма объявления одномерного массива выглядит следующим образом:
тип имя_переменной[];
month_days = new int[12];
Подведем краткий итог: процесс создания массива происходит в два этапа.
Во-первых, следует объявить переменную нужного типа массива. Во-вторых, с помощью операции new необходимо зарезервировать память для хранения массива и присвоить ее переменной массива

26.Максимальная размерность многомерного
массива
Integer.MAX_VALUE (размер положительной части int)
27.Переведи число X (любое) из десятичной в
двоичную, и число Y (любое) из двоичной в
десятичную
Java из двоичной системы в десятичную и обратно
Раньше, чтобы переводить числа из одной системы счисления в другую я писал методы с циклами и т.п.
Нужно делать так:
1 2
3 4
5
int i = 232;
//число 232 в двоичной системе
System.out.println(Integer.toBinaryString(i));
//обратыный перевод из двоичной системы в десятичную
System.out.println(Integer.parseInt("11101000", 2));
Вывод на консоль:
11101000 232
Также есть перевод в восьмиричную систему ( метод toOctalString) и шестнадцатиричную ( метод toHexString)
28.Инкременты, декременты, отличия.
Инкремент — это операция во многих языках программирования, которая выполняет увеличение переменной. Чаще всего под инкрементом подразумевается увеличение переменной на 1 единицу. Обратной операцией называют декремент.
Декремент — это уменьшение переменной. Чаще всего также на единицу.
В Java инкремент и декремент — это в первую очередь унарные операторы,
которые применяются к какой-либо числовой переменной.

Инкремент: обозначается двумя знаками плюс "++" и увеличивает значение переменной на 1.
Декремент: обозначается двумя знаками минус "--" и уменьшает значение переменной на 1.
У инкремента и декремента есть 2 формы — prefix и postfix. О боже что это, подумали вы?) Не пугайтесь: тут тоже все легко.
Prefix, или Префиксная форма, описывается перед переменной "
++x или
--x
", изначально икрементирует или декрементирует переменную.
Postfix, или Постфиксная форма, описывается после переменной "
x++
или x--
", икрементирует или декрементирует переменную после вычисления. Если вы обратили внимание на слово вычисления, то сделали это не зря, так как обе формы работают одинаково, если не используются в вычислениях.
29.Почему 0.1 + 0.7 != 0.8 ?
Почему мои числа, такие как 0,1 + 0,2, не складываются в хороший округлый 0,3, а вместо этого я получаю странный результат, например
0,300000000000000004?
Потому что внутренне компьютеры используют формат (двоичный с плавающей запятой), который вообще не может точно представить число вроде 0,1, 0,2 или 0,3.
Когда код компилируется или интерпретируется, ваше «0,1» уже округляется до ближайшего числа в этом формате, что приводит к небольшой ошибке округления еще до того, как произойдет вычисление.
Почему компьютеры используют такую дурацкую систему?
Это не глупо, просто другое. Десятичные числа не могут точно представлять такое число, как 1/3, поэтому вам нужно округлить что-то вроде 0,33 — и вы также не ожидаете, что 0,33 + 0,33 + 0,33 дадут в сумме 1, не так ли?
Компьютеры используют двоичные числа, потому что они быстрее справляются с ними, и потому что для большинства вычислений крошечная
ошибка в 17-м десятичном разряде не имеет никакого значения, поскольку числа, с которыми вы работаете, в любом случае не являются круглыми (или такими точными). .
30.Что такое continue и break?
В языке Java оператор break находит три применения. Во-первых, он завершает последовательность операторов в операторе swi t ch. Во-вторых, его можно использовать для выхода из цикла. И, в-третьих, этот оператор можно применять в качестве "цивилизованной" формы оператора безусловного перехода goto.
Иногда требуется, чтобы повторение цикла осуществлялось с более раннего оператора в его теле. Это означает, что на данном конкретном шаге может воз- никнуть потребность продолжить цикл, не выполняя остальной код в его теле.
По существу, это означает непосредственный переход в конец цикла, минуя часть его тела. Для выполнения этого действия служит оператор continue. В циклах while и do-while оператор continue вызывает передачу управления непосредственно условному выражению, управляющему циклом. В цикле for управление передается вначале итерационной части цикла for, а затем условному выражению.
Во всех трех разновидностях циклов любой промежуточный код пропускается.
31.Где находятся параметры и аргументы метода
Параметры
– это переменные которые описываются в круглых скобках при объявлении метода.
Аргументы – это значения которые передаются в метод при его вызове из другого кода.
32.Чем отличается метод от функции
Простой способ запомнить: F unction → F ree (Свободные означает не принадлежность к объекту или классу) M ethod → M ember (член объекта или класса)
33. byte a = 1; byte b = 2; byte c = a + b; Будут ли
какие-то проблемы?

Если умножить byte на short, будет int. Если умножить byte на byte, будет int.
Даже если сложить byte и byte, будет int.
Тому есть несколько причин. Примеры:
Код
Описание byte a = 110;
byte b = 120;
byte c = a * b; // ошибка
110 * 120 будет 13,200, что несколько больше, чем максимальное значение типа byte: 127
byte a = 110;
byte b = 120;
byte c = a + b; // ошибка
110 + 120 будет 230, что тоже несколько больше, чем максимальное значение типа byte: 127
В общем случае при умножении числа длиной в 8 бит (1 байт) на число длиной в 8 бит (1 байт), мы получим число длиной 16 бит (2 байта)
Поэтому все операции с целыми типами, меньшими чем int, всегда сразу преобразовываются в тип int. И поэтому если вы захотите сохранить результат вычисления в переменную типа, меньше чем int, вам всегда нужно будет явно указывать операцию приведения типа.
Примеры:
Код
Описание byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
выражение byte * byte будет иметь тип int
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
выражение byte + byte будет иметь тип int byte a = 1;
byte b = (byte) (a + 1);
выражение byte + int будет иметь тип int единица – это литерал типа int.
5. Важный нюанс
Операция приведения типа имеет довольно высокий приоритет.
Поэтому если в выражении есть, допустим, сложение и операция приведения типа, она будет выполнена до сложения.
Пример:
Код
Описание byte a = 1;
byte b = 2;
byte c = (byte) a * b;
Оператор приведения типа будет применен только к переменной a, которая и так имеет тип byte. Код не скомпилируется.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
Вот так правильно.
Если вы хотите преобразовать к определенному типу все выражение, а не только один его элемент, то оборачивайте все выражение в круглые скобки и перед ними ставьте оператор приведения типа.

34. Отличия for от for each?
Операторы for и foreach
Начиная с версии JDK 5, в Java существуют две формы цикла for. Первая
— традиционная форма, используемая начиная с исходной версии Java.
Вторая — новая форма “for-each”. Мы рассмотрим оба типа цикла for,
начиная с традиционной формы.
Общая форма традиционного оператора for выглядит следующим
образом:
Если в цикле будет повторяться только один оператор, фигурные скобки
можно опустить.
Цикл for действует следующим образом. При первом запуске цикла
программа выполняет инициализационную часть цикла. В общем случае
это выражение, устанавливающее значение управляющей переменной
цикла, которая действует в качестве счетчика, управляющего циклом.
Важно понимать, что выражение инициализации выполняется только
один раз. Затем программа вычисляет условие, которое должно быть
булевским выражением. Как правило, выражение условия сравнивает
значение управляющей переменной с целевым значением. Если это
значение истинно, программа выполняет тело цикла. Если оно ложно,
выполнение цикла прерывается. Затем программа выполняет тело цикла
и только после этого выполняется часть повторение цикла. Повторение
это обычно выражение, которое увеличивает или уменьшает значение
управляющей переменной. Затем программа повторяет цикл, при каждом
прохождении вначале вычисляя условное выражение, затем выполняя
тело цикла и выполняя выражение повторения. Процесс повторяется до
тех пор, пока значение выражения условия не станет ложным.
Поскольку большинство циклов применяют свои переменные только
внутри цикла, цикл for допускает, чтобы выражение инициализации было
полным объявлением переменной. Таким образом, переменная
ограничена телом цикла и невидима извне.
Приведем пару примеров поясняющих все вышесказанное:

В этом примере переменная i объявлена вне цикла (строка 7), поэтому
она так же доступна после его завершения (строка 12).
Из вывода выполнения данной программы видно, что выражение
повторения цикла, а именно префиксный инкремент (++i) переменной i
выполняется после выполнения тела цикла, то есть после выполнения
строки 10, которая выводит приветствие.
Этот момент очень важно понимать, чтобы иметь правильное
представление о работе цикла for.
Теперь посмотрим на вывод этой программы с аргументами командной
строки и без них:
Как видно из вывода данной программы приращение переменной i
происходит после выполнения последней команды цикла, которая
выводит приветствие (строка 10).

А теперь объявим переменную внутри цикла (оператора for):
Как видно Eclipse нам сразу же указал на ошибку, что переменная j,
объявленная в строке 15, не видна вне цикла, так как ее область действия
или область видимости распространяется только на тело цикла, в котором
она была объявлена.
Чтобы программа заработала необходимо закомментировать строку 19.
Вывод этого кода, аналогичен выводу, кода который мы только что
рассмотрели, за исключением того, что вместо “Привет” выводится
“Hello”. Ну и то что после цикла не возможно вывести значение
переменной j.
При объявлении переменной внутри цикла for необходимо помнить о
следующем важном обстоятельстве: область и время существования этой
переменной полностью совпадают с областью и временем существования
оператора for.
Синтаксис цикла for не ограничивается циклами с единственной
переменной. Как в выражении инициализации, так и в выражении
повторения можно использовать запятую для разделения нескольких
выражений инициализации и повторения.
Например:

В этом примере в инициализационной части цикла мы устанавливаем
начальные значения обеих управляющих переменных a и b. Оба
разделенных запятой оператора в итерационной части выполняются при
каждом повторении цикла.
Данный код генерирует следующий вывод:
Цикл for поддерживает несколько разновидностей, которые увеличивают
его возможности и повышают применимость. Гибкость этого цикла
обусловлена тем, что его три части: инициализацию, проверку условий и
итерационную не обязательно использовать только по прямому
назначению. Фактически каждый из разделов оператора for можно
применять в любых целях. Например:
Пример конечно немного головоломный, но по сути он прост. Первая
  1   2   3


написать администратору сайта