ревью 1. Ревью 1. Все примитивные типы и их размеры. Целочисленные byte
![]()
|
Все примитивные типы и их размеры. Целочисленные 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? Что такое рекурсия? Недостатки и преимущества? |