да. Вопросы к ревью 1 Какая размерность у boolean
Скачать 153.74 Kb.
|
Вопросы к ревью №1 Какая размерность у boolean? 8 (при использовании в массивах), 32 (при использовании не в массивах). Но на самом деле Boolean будет занимать больше памяти и это будет зависеть от конкретной реализации JVM. Обычно на это тратится столько же, сколько на int. Переведи число X (любое) из десятичной в двоичную, и число Y (любое) из двоичной в десятичную … Какие классы-обертки знаешь? Обертка — это специальный класс, который хранит внутри себя значение примитива(объекты классов-оберток являются неизменяемыми (Immutable)). Нужны для реализации дженериков (в коллекциях). ______ Расскажи про pool строк и pool примитивов StringPool. Это такое место, где хранятся строки, можно назвать это кэшем строк.Строки сравниваются быстрее, чем через equals(но так делать не надо). == сравнивает по ссылке, а кешированные строки находятся в одном месте. При кешировании Integer.Целочисленное кэширование работает только при автоупаковке. При создании целочисленного объекта с помощью конструктора кэширование не работает. Автоупаковка (autoboxing) – это автоматическое преобразование, выполненное компилятором Java из примитива в соответствующий ему тип класса оболочки Java. При создании в пуле идет поиск строки: -если НЕ находит - создается строка, возвращается ссылка -если находит - возвращает ссылку найденной строки. При этом использование оператора new заставляет класс String создать новый объект, даже если такая строка уже есть в пуле. После этого можем использовать метод intern(), чтобы поместить этот объект в пул строк. Пул примитивов (пул интов) - Integer хранится в heap, но ссылки на объекты хранятся в stack. Разница между String, StringBuilder и StringBuffer? String - неизменяемый, потокобезопасный; StringBuffer - изменяемый, потокобезопасный (используется в многопоточке); StringBuilder - изменяемый, потоконебезопасный. ______________ Класс String – последовательность символов. Он неизменяемый(Immutableи finalкласс). Объекты любых классов можно привести к строковому представлению через toString. Для изменения объектов String есть класс StringBuilder (изменяемый). Объект класса StringBuffer может содержать в себе определенный набор символов, длину и значение которого можно изменить через вызов определенных методов. Конкатенация строк через StringBuilderв Java выполняется с помощью метода append (может принимать в себя практически любой тип данных).appendвозвращает объект, на котором был вызван. 6. Какая максимальная длина массива? Массив – объект, который может хранить много значенийодного типа,расположенных в памяти непосредственно друг за другом. Размерность массива — это количество индексов. Максимальный размер массива ограничивается памятью jvm. Но есть ограничение на число индексов (элементов): Integer.MAX_VALUE-2 (?) –в jvmhotspot–примерно 2 млрд записей. 7. Почему 0.1 + 0.7! = 0.8? Подобно тому, как в десятичной системе нельзя точно представить результат деления 1/3, так и в двоичной системе невозможно точно представить 1/10. Если вам нужно исключить ошибки округления, следует использовать класс BigDecimal 8. При сложении char short какой результирующий тип получим? byte не преобразуется автоматически (не явно) в тип char, хотя тип byte имеет ширину 8 бит, а char 16, тоже самое касается и преобразования типа short в char. Это происходит потому, что byte и short - знаковые типы данных, а char - беззнаковый. Поэтому в данном случае требуется использовать явное приведение типов. ____ Любые арифметические операции над типом short на выходе дают int (результат автоматически кастуется в int). В случае же с x1 += x2 по факту происходит x1 = (short) (x1 + x2) При вычислении выражения (a @ b) аргументы a и b преобразуются в числа, имеющие одинаковый тип: если одно из чисел double, то в double иначе, если одно из чисел float, то в float иначе, если одно из чисел long, то в long иначе, оба числа преобразуются в int То есть, все целочисленные литералы в выражениях, а так же типы byte, short и char расширяются до int. 9. Отличие сокращенных логических операторов и полных Логические операторы работают только с операндами типа boolean. Все логические операторы с двумя операндами объединяют два логических значения, образуя результирующее логическое значения. _____________ Кроме стандартных операторов AND (&) и OR (|) существуют сокращённые операторы && и || В отличие от двойных, одиночные & и | называются операторами полной схемы вычислений. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях). В чём разница В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости. То есть иногда результат выражения однозначно определён уже по первому операнду: Если первый операнд && равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false. Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true. && и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях. 10. Максимальная размерность многомерного массива Спецификация виртуальной машины Java устанавливает ограничение размерности не более 255 (ограничение по памяти). Т.е. объявление массива с размерностью 256 вызовет ошибку. 11. Все примитивные типы и их размеры 12. Потери при неявных приведениях Неявное приведение может произойти при условии, что типы совместимы, и размер “принимающего” типа больше чем у того, который преобразуется (так называемое “преобразование с расширением” Явное приведение – сужение - применяется операция преобразования типов. Обычно это сужающие преобразования от типа с большей разрядностью к типу с меньшей разрядностью:
Нужно указать тип явно. У дробных float и double при сужении к целочисленному типу будет отброшена дробная часть. 13. Какие данные мы рискуем потерять при явных приведениях? При повышении типа byte>short; short>int; int>long; float>double; char>int информация не потеряется. При сужении возможна потеря информации. 14. Что такое Autoboxing, unboxing и когда они происходят автоматически? Java автоматически делает преобразования между примитивными типами и их обертками. Процесс преобразования примитивных типов в ссылочные (int->Integer) называется autoboxing (автоупаковкой), а обратный ему — unboxing (автораспаковкой). 15. Что такое continue и break? Расширенная версия? К операторам перехода в java относят три оператора: break, continue и return. break; – выход из цикла (не затрагивает внешний цикл). continue; – заканчивает выполнение кода в этом теле цикла. Переход к следующей итерации. Расширенный break – это break метка. Метка - это как правило любое подходящее из пространства имен java имя, предваряющее блок кода. При этом после применения этом блоке кода break с меткой приведет к тому, что код продолжит выполняться с места после блока с соответствующей меткой. firstBlock:{ secondBlock:{ thirdBlock:{ System.out.println("We will see it always"); if(bool) { breaksecondBlock; } 16. Чем отличается метод от функции? Метод - это функция или процедура, принадлежащая какому-то классу или объекту.Функция - фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. 17. Что такое массив и какие на нём есть ограничения? Массив – объект, который может хранить много значений одного типа, расположенных в памяти непосредственно друг за другом. Размерность массива — это количество индексов. Максимальный размер массива ограничивается памятью jvm. Но есть ограничение на число индексов (элементов): Integer.MAX_VALUE-2 (?) –в jvm hotspot–примерно 2 млрд записей. 18. Отличия for от for each For-each — это разновидность цикла for, которая используется, когда нужно обработать все элементы массива или коллекции (пройтись по каждому элемементу). Cчётчик в такой конструкции не применяется, итерационная переменная перебирает элементы массива или коллекции, а не значения индекса. При выполнении такого цикла, итерационной переменной последовательно присваивается значение каждого элемента массива или коллекции, после чего выполняется указанный блок операторов (или оператор). 19. Инкременты, декременты, отличия. Инкремент – увеличение п. на единицу, декремент – уменьшение. Если ++ стоит до п., то оператор вернет знач-е после изменения, а если ++ стоит после п., то вернет значение до изменения. 20. Что такое рекурсия? Недостатки и преимущества? Рекурсия – многократный вызов метода в теле этого же метода для перехода к следующему шагу рекурсии. Часто применяется при расчете факториала (есть соглашение, что 0! = 1), или при вызове файла с поддиректориями (чтобы их обойти). Недостатки – рекурсия выполняется медленнее, чем цикл с итерациями, и занимает больше места в стеке (все параметры копируются в стек). Есть риск переполнения стека (при бесконечной рекурсии). Требует больше памяти. Преимущества – простой наглядный алгоритм для обхода древовидных структур, замена большого числа вложенных циклов. Алгоритм легче читается (человеком). 21. Циклы В Java используются циклы for, while, do-while do-while всегда выполнится хотя бы один раз, т.к. проверка идет после тела цикла. 22. Условные операторы Условные операторы (if, if-else) реализуют нелинейную логику выполнения программы (в зависимости от условий). 23. Неизменяемые типы String и все классы – обертки. От них невозможно наследоваться. |