Ревью 1. Все примитивные типы и их размеры. Целочисленные byte
Скачать 274.91 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). Что такое литерал? Литерал - это по факту значение, которое мы присваиваем переменной. Например int i = 5; 5 - литерал переменной int. Что такое операнд? Операнд — это сущность, с которой оператор выполняет какие-либо действия. Что такое NaN?Что такое infinity? Nan (англ. Not-a-Number) – неизвестное значение. Получим, если попробуем вычислить квадратный корень отрицательного числа infinity – бесконечность. Получим если попробуем поделить на 0 Тип переменной var var используется в объявлении локальной переменной без явного указания типа. При использовании var компилятор Java определяет тип переменной во время компиляции, используя информацию о типе, полученную от инициализатора переменной. Далее выведенный тип используется как статический тип этой переменной. Какие классы-обертки знаешь? Все братья близнецы примитивных типов, только с заглавной буквы. Кроме int и char. для них Integer и Character соответственно. Классы – обертки нужны для хранения примитивов в коллекциях, либо выразить в программе факт отсутствия значения, делается это с помощью null. Расскажи про unboxing, autoboxing в обертках? Преобразования примитивных типов в ссылочные типы. Autoboxing – это автоматическая инкапсуляция примитивного типа в аналог класс – обертку. Используется метод .valueOF Пример: Integer.valueOF(); Autoboxingпроисходит в двух случаях а) При присвоении значения примитивного типа переменной класса – обертки б) При передачи примитивного типа в параметр метода, класса обертки метода valueOF(тип) Unboxing – преобразование класса – обертки в примитивный тип. Используется метод Пример: intValue Unboxingпроисходит а) При присвоении экземпляра класса – обертки переменной соответствующего типа б) В выражениях, в которых один или оба аргумента являются экземплярами класса – оберток (кроме операции на == и !=) в) При передаче объекта класса обертки в метод ожидающий соответствующий тип Метод типValue Пример: intValue Расскажи про 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 Что такое метод, возвращаемое значение, аргументы метода? Метод – блок кода объявлен внутри класса, который содержит некоторую последовательность действий, направленных на решение задачи, метод можно использовать многократно Возвращаемое значение – это данные которые приходят на место, после вызова метода. Аргумент метода – параметр который передаться в метод и с которым метод будет работать Отличие метода от функции? Функция самостоятельная сущность и может существовать без класса, метод может быть только в классе. В java не предусмотрены функции только методы Что такое инкремент и декремент? Инкремент – оператор который увеличивает целочисленную переменную на 1 Дикремент – уменьшает на 1 Префиксная форма ++а; Сначала прибавит 1 Постфиксаная форма а++; Cначала выполнит действие, а потом изменит переменную На собеседовании спрашивали int a = 5; a++ + ++a Чему будет равно? После всех операции, будет 12, а= 7 Какие логические операции знаешь? Таблица истинности операторов? ! (не) – меняет true на false и наоборот &(и) - Логическое и, оно же AND или конъюнкция. Обозначается символом “&” между двумя операндами, к которым применяется. ^ - Исключающее или, XOR, строгая дизъюнкция. В Java обозначается символом “^” между двумя операндами. По сути выдает 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) Какие есть циклы в Java? Чем отличаются друг от друга? while – цикл с предусловием. do while – цикл с постусловием. выполниться один раз, а потом проверит условие for – цикл со счетчиком foreach – цикл для перебора коллекций и элементов массива Что такое continue и break? continue – используется когда нужно пропустить итерацию в цикле break – используется когда нужно завершить цикл, так же для прекращения действия в switch 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? он служил, чтобы обозначить отсутствие чего-либо, например, пользователя, ресурса и т. п. |