ревью 1. Ревью 1. Все примитивные типы и их размеры. Целочисленные byte
Скачать 280.55 Kb.
|
Все примитивные типы и их размеры. Целочисленные byte – 8 бит хранит целое число от -128 до 127. short – 16 бит хранит целое число от -32768 до 32767. int - 32 бит хранит целое число от -2147483648 до 2147483647. long – 64 бит хранит целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Вещественные float - 32 бит хранит число с плавающей точкой от -3.4*1038 до 3.4*1038. double – 64 бит хранит число с плавающей точкой от -3.4*1038 до 3.4*1038. Логический boolean – true/false – в теории может занимать 1 бит, но обычно в зависимости от виртуальной машины JVM занимает 32 бит. Символьный char – псевдоцелочисленный тип, размерность 16 бит, можно записать используя систему unicode, либо в десятичной системе. Какая размерность у boolean? boolean – true/false – в теории может занимать 1 бит, но обычно в зависимости от виртуальной машины JVM занимает 32 бит. Что такое char? Почему над ним можно выполнять арифметические операции? char – псевдоцелочисленный тип, размерность 16 бит, можно записать используя систему unicode, либо в десятичной системе. Т.К. представление данного типа можно в 10 системе счисления, поэтому и можно производить арифметические операции. Какие есть виды приведения типов? Что такое явные и неявные приведения, с чем связано их наличие? Есть явные и не явные преобразования Неявные преобразования происходят автоматически, если выполнены условия: а) оба типа совместимы б) Длина целевого типа больше или равна длине исходного типа Во всех остальных случаях должно использоваться явное преобразование типов. Так же существуют два типа преобразований: Расширяющее преобразование-выполняется автоматически при преобразовании меньшего по размеру типа в больший: byte в short в char в int в long в float в double Сужающее преобразование-выполняется вручную при преобразовании большего по размеру типа в меньший: double в float в long в int в char в short в byte Java выполняет расширяющие преобразования автоматически, например, если вы присвоили литерал типа int переменной типа double или значение переменной типа char переменной типа int Сплошные линии обозначают преобразования, выполняемые без потери данных. Штриховые линии говорят о том, что при преобразовании может произойти потеря точности. Стоит немного пояснить почему, к примеру тип byte не преобразуется автоматически (не явно) в тип char, хотя тип byte имеет ширину 8 бит, а char 16, тоже самое касается и преобразования типа short в char. Это происходит потому, что byte и short знаковые типы данных, а char беззнаковый. Поэтому в данном случае требуется использовать явное приведение типов, поскольку компилятору надо явно указать что вы знаете чего хотите и как будет обрабатываться знаковый бит типов byte и short при преобразовании к типу char. Сужающее преобразование (narrowing conversion) происходит, если значение преобразуется в значение типа, диапазон которого не шире изначального. Сужающие преобразования не всегда безопасны: например, преобразование целого значения 13 в byte имеет смысл, а преобразование 13000 в byte неразумно, поскольку byte может хранить только числа от −128 до 127. Поскольку во время сужающего преобразования могут быть потеряны данные, Java компилятор возражает против любого такого преобразования, даже если преобразуемое значение укладывается в более узкий диапазон указанного типа Оператором явного преобразования типов или точнее говоря приведения типов являются круглые скобки, внутри которых указан тип, к которому происходит преобразование – (type). Какие могут быть потери данных при явных приведениях? (ДОП) a)преобразовании вещественного в целочисленный тип теряется дробная часть, б) из большего в меньшее Какие потери могут быть при неявных приведениях? (Потери при неявных приведениях возможны потери точности при преобразовании целочисленных в вещественные а именно из long -> float Какие потери будут при приведении short в char? не преобразуется автоматически (не явно) в тип char, хотя тип byte имеет ширину 8 бит, а char 16, тоже самое касается и преобразования типа short в char. Это происходит потому, что byte и short знаковые типы данных, а char беззнаковый. Поэтому в данном случае требуется использовать явное приведение типов, поскольку компилятору надо явно указать что вы знаете чего хотите и как будет обрабатываться знаковый бит типов byte и short при преобразовании к типу char. Какой тип получим при сложении char + short? (int) Что такое литерал? Литерал - это по факту значение, которое мы присваиваем переменной. Например int i = 5; 5 - литерал переменной int. Что такое операнд? Операнд — это сущность, с которой оператор выполняет какие-либо действия. Что такое NaN?Что такое infinity? Nan (англ. Not-a-Number) – неизвестное значение. Получим, если попробуем вычислить квадратный корень отрицательного числа infinity – бесконечность. Получим если попробуем поделить на 0 Тип переменной var var используется в объявлении локальной переменной без явного указания типа. При использовании var компилятор Java определяет тип переменной во время компиляции, используя информацию о типе, полученную от инициализатора переменной. Далее выведенный тип используется как статический тип этой переменной. Какие классы-обертки знаешь? Все братья близнецы примитивных типов, только с заглавной буквы. Кроме int и char. для них Integer и Character соответственно. Классы – обертки нужны для хранения примитивов в коллекциях, либо выразить в программе факт отсутствия значения, делается это с помощью null. 1/ Позволяют не нарушать принцип “все является объектом”, благодаря чему числа, символы и булевы значения true/false не выпадают из этой концепции 2/ Расширяют возможности работы с этими значениями, предоставляя удобные методы и поля 3/ Необходимы, когда какой-то метод может работать исключительно с объектами Расскажи про unboxing, autoboxing в обертках? Преобразования примитивных типов в ссылочные типы. Autoboxing – это автоматическая инкапсуляция примитивного типа в аналог класс – обертку. Character ch = 'a'; Integer i1 = 220; Double d1 = 300.0; Boolean b1 = false; Autoboxingпроисходит в двух случаях а) При присвоении значения примитивного типа переменной класса – обертки б) При передачи примитивного типа в параметр метода, класса обертки метода valueOF(тип) Unboxing – преобразование класса – обертки в примитивный тип. Используется метод Пример: intValue Unboxingпроисходит а) При присвоении экземпляра класса – обертки переменной соответствующего типа б) В выражениях, в которых один или оба аргумента являются экземплярами класса – оберток (кроме операции на == и !=) в) При передаче объекта класса обертки в метод ожидающий соответствующий тип Double d1 = 2.3; Double d2 = 3.3; double d3 = i1 + d1 + d2; // распаковка System.out.println(d3); Расскажи про pool строк и pool примитивов? Очень подробная статья про пул строк: https://topjava.ru/blog/rukovodstvo-po-string-pool-v-java Pool строк – это специальное хранилище в куче строк. Пул строк помогает экономить большой объем памяти, но с другой стороны занимает больше времени. Pool примитивов – у примитивов тоже есть свой pool, но максимальное значение которое они могут хранить от -128 до 127, это сделано для более быстрого доступа, все числа которые превышают значение, помещаться в другое хранилище. Как у byte. Как добавить String’у в pool строк? Для помещения строки в pool используется метод intern Разницамежду String, StringBuilder и StringBuffer? String – строковый неизменяемый тип данных, любые действия со строкой приведут к созданию новой строки и т.к. данные действия являются ресурсоемкими, для манипуляции со строками используется StringBuilder и StringBuffer. StringBuilder – изменяемая строка, обладает высокой производительностью, но менее потокобезопасна. StringBuffer – изменяемая строка, обладает высокой безопасностью, но менее производительна, потому что обременена синхронизацией Почему не рекомендуються множественные конкартенации(склейка) строк(“Привет”+”Привет”+”Привет”)? Каждый раз будет создаваться новая строка, для этого нужно использовать StringBuilder и StringBuffer Неизменяемые типы? Все классы – обертки (Byte,Short,Integer,Long,Float,Double,Boolean,Character), String, BigInteger, BigDecimal Что такое массив и какие на нём есть ограничения? Массив – структура данных, в которых хранятся элементы одного типа. Инициализация массива ограничена int-овым значением Какая максимальная длина массива? Максимальная длина вложенных массивов 255 С какого числа начинается индекс массива? С 0 Можно ли создать массив отрицательной длины? Нет, вы не можете использовать отрицательное целое число в качестве размера, размер массива представляет количество элементов в нем, – количество элементов в массиве не имеет смысла.Тем не менее, если вы это сделаете, программа будет скомпилирована без проблем, но при ее выполнении генерируется исключение времени выполнения типа NegativeArraySizeException А со значением null? нет Как создать многомерный массив? int[][] twoDimArray = new int[3][4]; Какая максимальная многомерность? 255 Что такое метод, возвращаемое значение, аргументы метода? Метод – блок кода объявлен внутри класса, который содержит некоторую последовательность действий, направленных на решение задачи, метод можно использовать многократно Возвращаемое значение – это данные которые приходят на место, после вызова метода. Аргумент метода – параметр который передаться в метод и с которым метод будет работать Отличие метода от функции? Функция самостоятельная сущность и может существовать без класса, метод может быть только в классе. В java не предусмотрены функции только методы Что такое инкремент и декремент? Инкремент – оператор который увеличивает целочисленную переменную на 1 Дикремент – уменьшает на 1 Префиксная форма ++а; Сначала прибавит 1 Постфиксаная форма а++; Cначала выполнит действие, а потом изменит переменную На собеседовании спрашивали int a = 5; a++ + ++a Чему будет равно? После всех операции, будет 12, а= 7 Какие логические операции знаешь? Таблица истинности операторов? ! (не) – меняет true на false и наоборот &(и) - Логическое и, оно же AND или конъюнкция. Обозначается символом “&” между двумя операндами, к которым применяется. ^ - Исключающее или, XOR, строгая дизъюнкция. В Java обозначается символом “^” между двумя операндами. По сути выдает true если одно значение false - Если подряд идут true XOR true XOR true какой будет результат? false | -(или) в Java, оно же — OR, оно же — дизъюнкция. В Java обозначается символом “|” между двумя операндами. && - сокращение и || - сокращённое или && - это укороченный вариант &. Отличия в том, что в укороченной версии (&&), если первый операнд false, то второй даже не проверяется, сразу ясно что выражения false. Так же и с || и |, в укороченной версии (||) если первый операнд true, то второй даже не рассматривается. Это довольно удобно, если например имеем 1 func1() & func2() в этом случае вызываются обе функции, даже если первая false, а это уже значит результат ясен, все выражение false, а func2() все равно проверяется (а это лишние затраты). А вот так 2 func1() && func2() если первое выражение false, то func2() даже не вызывается для проверки, т.к результат уже ясен. (a & b) - будет проверено и a, и b (a | b) - будет проверено и а, и b (a && b) - если а=false, то b проверено не будет (a || b) - если а=true, то b проверено не будет Какие есть условные операторы? if/else switch case тернарный оператор (условие?значение1: значение2) (String securityAnswer = man.getAge() >= 18 ? "Все в порядке, проходите!" : "Этот фильм не подходит) Можно ли в switch case использовать String, Enum? да Какие есть циклы в Java? Чем отличаются друг от друга? while – цикл с предусловием. do while – цикл с постусловием. выполниться один раз, а потом проверит условие for – цикл со счетчиком foreach – цикл для перебора коллекций и элементов массива Что такое continue и break? continue – continue используется для выхода из текущего выполнения (итерации) и передачи управления обратно в начало цикла. при вызове этого оператора цикл прекращает текущую итерацию, выполняет <действие после итерации> и проверяет условие цикла. Если проверка вернула true, то переходит к следующей итерации, а иначе — заканчивается. break – Оператор применяется для прерывания текущей итерации . С его помощью происходит выход из блока фигурных скобок оператора цикла либо оператора switch с дальнейшей передачей управления следующему оператору. Если задействуются вложенные операторы, break обеспечивает выход из самого внутреннего оператора. ?Почему не рек операторы break и continue (c метками?) неоправданно усложняют текст программы омендуется их использовать? ?)Если в case не поставить break что будет? Если не использовать оператор break, то, сразу после того, как выполнится один блок кода, программа переключится на выполнения следующего case, Что такое рекурсия? Недостатки и преимущества? Рекурсия – вызов функции самой себя. + некоторые алгоритмы проще, короче и понятнее написать через рекурсию, чем через циклы - скорость работы, нужно больше памяти основные принципы рекурсии 1)Рекурсия должна заканчиваться 2) Рекурсия должна двигаться(иметь шаг) Почему 2.0 - 1.1 != 0.9? Для вещественных чисел нельзя использовать проверку на равенство при помощи == • Это связано с ошибками округления – компьютер имеет ограниченную точность при работе с вещественными числами • System.out.println(2.0 - 1.1); // 0.8999999999999999 • System.out.println(2.0 - 1.1 == 0.9); // false Проверка на равенство вещ-х чисел • Поэтому проверку на равенство нужно заменять на проверку, что число лежит в некотором небольшом диапазоне • 𝑎 = 𝑏 • 𝑎 − 𝑏 = 0 • Теперь позволяем разности отклоняться от 0 в диапазоне от −𝜀 до 𝜀 • −𝜀 ≤ 𝑎 − 𝑏 ≤ 𝜀 • 𝑎 − 𝑏 ≤ 𝜀 Проверка на равенство вещ-х чисел • 𝑎 − 𝑏 ≤ 𝜀 • В коде: • double epsilon = 1.0e-10; if (Math.abs(a - b) <= epsilon) { // a примерно равен b } • Команда Math.abs(x) выдает модуль вещественного числа • В качестве epsilon можно брать любое маленькое положительное число Перевод в двоичную систему? Integer.toBinaryString(100) – перевод в двоичную систему 100 Результат: 1100100 Integer.parseInt("1100110",2) – перевод в десятичную систему 1100110 Результат: 102 char + short = type? Получим тип int BigInteger и BigDecimal? BigInteger – аналог целочисленных значений произвольной длины, у которого нет ограничения в 64 бит как у long. Существует множество методов. BigDecimal – тоже самое что и BigInteger, только с вещественными числами. В банковской сфере используеться BigDecimal вместо double, т.к обладает большими настройками. byte a = 1; byte b = 2; byte c = a + b; Будут ли какие-то проблемы? Компилятор будет выдавать ошибку.Т.к. по умолчанию тип будет int, а он не входит в byte, нужно явное преобразование типов Что будет, если попытаться присвоить нулевую обертку (ссылка null) обратно в примитив? Будет выброшено исключение NullPointerException, не может примитив иметь нулевую ссылку Integer a = 100; Integer b = 100; a == b ? Почему? Потому что создастся один объект в pool примитивов, и у них будет одна и таже ссылка. Что такое null? он служил, чтобы обозначить отсутствие чего-либо, например, пользователя, ресурса и т. п. - Что такое null? любые ссылочные переменные в Java по умолчанию будут равны null каждый примитив имеет значение по умолчанию, например, у int это 0, у boolean это false Что будет, если попытаться присвоить нулевую обертку (ссылка null) обратно в примитив? – компилятор не отреагирует, но мы будем вознаграждены null pointer exception во время выполнения. Это происходит из-за авто упаковки (autoboxing) Integer a = 100; Integer b = 100; a == b ? Почему? Целые числа между -128 и 127 кэшируются (целые числа одного и того же значения ссылаются на один и тот же Object) - Размер элемента массива – Все примитивные типы и их размеры Какая размерность у boolean? Что такое char? Почему над ним можно выполнять арифметические операции? Какие есть виды приведения типов? Что такое явные и неявные приведения, с чем связано их наличие? Какие классы-обертки знаешь? Расскажи про unboxing, autoboxing в обертках Расскажи про pool строк и pool примитивов Как добавить String’у в pool строк? Разница между String, StringBuilder и StringBuffer? Что такое массив и какие на нём есть ограничения? Какая максимальная длина массива? Что такое метод, возвращаемое значение, аргументы метода? Что такое инкремент и декремент? Какие логические операции знаешь? Таблица истинности операторов. Какие есть условные операторы? Какие есть циклы в Java? Чем отличаются друг от друга? Что такое continue и break? Что такое рекурсия? Недостатки и преимущества? |