Ревью модуль 1. Какие примитивные типы есть в Java
Скачать 50.5 Kb.
|
Какие примитивные типы есть в Java: в Java определены следующие примитивные типы: целые типы (byte, short, int, long, char) все эти переменные кроме CHAR являются знаковыми; вещественные типы (float, double) с “плавающей” точкой; булевский тип (boolean) логический тип. Целочисленные типы: BYTE: -128…127 8 бит SHORT: -32768…32767 16 бит INT: -2x1031 до 2x1031– 1 32 бита LONG: -2x1063 до 2x1063– 1 64 бита CHAR: 65536 16 бит - 2 байта (кодировка UTF-16!) Целочисленные константы могут задаваться в программе одним из способов: в виде десятичных, шестнадцатеричных (с символами“0x” или “0X”) и восьмеричных (начинаются с символа “0”) или двоичных (начинаются с символа “0b”) значений. По умолчанию все числа интерпретируются как десятичные и относятся к типу int Явно указать принадлежность к типу long можно, добавив в конце числа букву “l” или букву “L” Символы определяются с помощью ключевого слова char и реализованы с использованием стандарта Unicode. Символы также можно задавать с помощью escape-последовательностей, содержащих символ "\", за которым следует буквенный символ, идентифицирующий escape-последовательность. Вещественные типы: FLOAT: -3.4x1038 до 3.4x1038– 1, “NaN”, “Infinity” 32 бита DOUBLE: -1.7x10308 до 1.7x10308– 1, “NaN”, “Infinity” 64 бит Явно указать принадлежность к типу float можно, добавив в конце числа букву “f” или букву “F” запись переменной v=3.71 дает v – double, а v=3.71f v – float! Булевские типы: Переменные булевского типа (логические переменные) могут принимать одно из двух значений: «истина» (true) или «ложь» (false) и используются в языках программирования в операциях отношения (сравнения) и логических операциях. Объявление и инициализация переменных Переменная представляет именованную область памяти, которая хранит значение определенного типа. Каждая переменная имеет тип, имя и значение. Тип определяет, какую информацию может хранить переменная или диапазон допустимых значений. В качестве имени переменной может выступать любое произвольное название, которое удовлетворяет следующим требованиям: имя может содержать любые алфавитно-цифровые символы, а также знак подчеркивания, при этом первый символ в имени не должен быть цифрой в имени не должно быть знаков пунктуации и пробелов имя не может быть ключевым словом языка Java Объявив переменную, мы можем присвоить ей значение – инициализировать. Неинициализированные переменные получают значения по-умолчанию: для примитивных числовых типов равно 0 (0 для целочисленных, 0.0d и 0.0f для double и float соответственно), для boolean — false, а для типа char — \u0000. Для классов-оберток значение по умолчанию равно null. Кроме переменных, в Java для хранения данных можно использовать константы. В отличие от переменных константам можно присвоить значение только один раз. Константа объявляется также, как и переменная, только вначале идет ключевое слово final. Константы имеют имена в верхнем регистре. Что такое литерал Литералы — это явно заданные значения в коде программы — константы определенного типа, которые находятся в коде в момент запуска. Любое целочисленное значение является числовым литералом. Что такое явные и неявные приведения, с чем связано их наличие? Преобразование типов в Java бывает двух видов: неявное и явное. Неявное (автоматическое) преобразование типов выполняется в случае если выполняются условия: Оба типа совместимы Длина целевого типа больше или равна длине исходного типа Стрелками на рисунке показано, какие преобразования типов могут выполняться не явно. Пунктирными стрелками показаны неявные преобразования с потерей точности. Неявно без каких-либо проблем производятся расширяющие преобразования (widening) - они расширяют представление объекта в памяти. Расширяющие неявные преобразования представлены следующими цепочками: byte -> short -> int -> long int -> double short -> float -> double char -> int Некоторые преобразования могут производиться неявно между типами данных одинаковой разрядности или даже от типа данных с большей разрядностью к типа с меньшей разрядностью. Это следующие цепочки преобразований: int -> float long -> float long -> double. Они производятся без ошибок, но при преобразовании мы можем столкнуться с потерей информации. Явные преобразования Во всех остальных преобразованиях примитивных типов явным образом применяется операция преобразования типов. Обычно это сужающие преобразования (narrowing) от типа с большей разрядностью к типу с меньшей разрядностью (например, int -> byte). Происходят различные потери (усечение дробной части, потери старших разрядов байт при переводе в двоичную систему и прочее) При операциях над различными типами данных действуют правила: если один из операндов операции относится к типу double, то и второй операнд преобразуется к типу double если предыдущее условие не соблюдено, а один из операндов операции относится к типу float, то и второй операнд преобразуется к типу float если предыдущие условия не соблюдены, один из операндов операции относится к типу long, то и второй операнд преобразуется к типу long иначе все операнды операции преобразуются к типу int byte a = 1; byte b = 2; byte c = (byte) (a + b); char ch = 'v'; short sh = 30000; short x = (short) (sh + ch); NaN (англ. Not-a-Number) — одно из особых состояний числа с плавающей запятой. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом, или если в ячейку памяти попало не удовлетворяющее условиям число. В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение 11…11, а мантиссы — во что угодно, кроме 0 (зарезервированное значение для машинной бесконечности). Знак и мантисса могут нести какую-то дополнительную информацию: многие библиотеки «отрицательный» NaN выводят как -NaN. К операциям, приводящим к появлению NaN в качестве ответа, относятся: все математические операции, содержащие NaN в качестве одного из операндов; деление нуля на нуль; деление бесконечности на бесконечность; умножение нуля на бесконечность; сложение бесконечности с бесконечностью противоположного знака; вычисление квадратного корня отрицательного числа[1]; логарифмирование отрицательного числа. Autoboxing/Unboxing (автоупаковка/автораспаковка) Обёртка – специальный класс, который хранит внутри себя значение примитива. Классы-обёртки позволяют создавать методы, что не могут делать примитивы. Наличие у обёрток методов, позволяет делать преобразования (Integer -> String) Автоупаковка/автораспаковка – преобразование примитивных типов в объекты-обёртки и обратно. Весь процесс выполняется автоматически. Автоупаковка происходит при прямом присвоении примитива классу обертке (с помощью оператора "="), либо при передаче примитива в параметры метода. Распаковка происходит при прямом присвоении классу обертке примитива. Компилятор использует метод valueOf() для упаковки, а методы intValue(),doubleValue() и так далее, для распаковки. Автоупаковке в «классы обертки» могут быть подвергнуты как переменные примитивных типов, так и литералы. Для массивов автоупаковка и автораспаковка не работает. Логические операторы.
Таблицы истинности: Умножение (AND, &): если хотя бы один операнд =“0” результат “0”
Сложение (OR, |): результат =“0” только если оба операнда “0”
Исключающее ИЛИ (XOR, ^): результат “0”, если оба операнда равны; во всех остальных случаях результат “1”
Тернарный (троичный) условный оператор: логУсл ? выраж1 : выраж2 ; Если логУсл равно true, то вычисляется выраж1 и его результат становится результатом выполнения всего оператора. Если же логУсл равно false, то вычисляется выраж2, и его значение становится результатом работы оператора. Оба операнда выраж1 и выраж2 должны возвращать значение одинакового (или совместимого) типа. Неизменяемые типы (Wrapper) Неизменяемыми типами (Immutable) являются все классы-обертки (Integer, Byte, Character, Short, Boolean, Long, Double, Float) над примитивными типами: все они создают неизменяемые объекты. Также к неизменяемым относятся String, BigInteger и BigDecimal. Инкременты, декременты, отличия? Инкремент — это операция, которая выполняет увеличение переменной. Чаще всего под инкрементом подразумевается увеличение переменной на 1 единицу. Декремент – уменьшение на единицу. Различают их префиксную и постфиксную формы: ++x, --x и x++, x-- Различия: префиксная форма изначально икрементирует или декрементирует переменную, постфиксная - икрементирует или декрементирует переменную после вычисления. ПРИМЕР: при а=5 вычислить ++a + a++ ++а + а++ = 11. т.е. сперва выполняется ++а = 6, затем выполняется суммирование 6+6 = 12 (т.к. а стало равно 6), и потом уже выполняется а++ НЕ ВЛИЯЮЩЕЕ на решение. В итоге а=7. НО при условии a=5 и b=5 итог: ++а + b++ = 11: а+1=6 6+(b=5)= 11 b+1 ->b=6. StringBuilder и StringBuffer Чтобы справиться с созданием временного мусора из-за модификаций объекта String, можно использовать класс StringBuffer или StringBuilder. Эти классы mutable, т.е. изменяемые. Объект класса StringBuffer или StringBuilder может содержать в себе определенный набор символов, длину и значение которого можно изменить через вызов определенных методов. Для создания нового объекта используется один из его конструкторов, например: StringBuilder() — создаст пустой (не содержащий символов) объект StringBuilder(String str) — создаст объект на основе переменной str (содержащий все символы str в той же последовательности) Разница в классах лишь в том, что StringBuffer потокобезопасен, и все его методы синхронизированы, а StringBuilder — нет. Это единственная особенность. Форматирование строк в Java System.Out.Print() – вывод без первода строки System.Out.Println() – вывод с перводом строки System.Out.Printf() – вывод c форматированием Форматированный вывод строк: %x – вывод шестнадцатиричных чисел %f – вывод чисел с плавающей точкой %e – вывод чисел в экспоненциальной форме %c – вывод одиночного символа %s – вывод строковых значений При использовании %f можно указать %.2f – будет выведено два знака после запятой с округлением. Что такое рекурсия. Главное отличие рекурсивных функций от обычных методов состоит в том, что рекурсивная функция вызывает саму себя. Основным недостатком рекурсии является то, что при отсутствии корректной проверки на достижение нужного результата (базиса рекурсии) возникает переполнение стека. Поэтому рекурсивная функция всегда должна «знать», когда ей нужно остановиться. В рекурсивной функции всегда есть два случая: рекурсивный и граничный случаи. Рекурсивный случай – когда функция вызывает саму себя, а граничный – когда функция перестает себя вызывать. Наличие граничного случая и предотвращает зацикливание. Рекурсия использует больше памяти и времени так как используется стек Почему бы не использовать рекурсиюОбычно это происходит медленнее из-за накладных расходов на поддержание стека. Обычно для стека используется больше памяти. Зачем использовать рекурсиюРекурсия добавляет ясности и (иногда) сокращает время, необходимое для написания и отладки кода (но не обязательно уменьшает требования к пространству или скорости выполнения). Уменьшает временную сложность. Лучше работает при решении задач на основе древовидных структур. String и его методы. Строка представляет собой последовательность символов. Для работы со строками в Java определен класс String, который предоставляет ряд методов для манипуляции строками. Физически объект String представляет собой ссылку на область в памяти, в которой размещены символы. Для создания новой строки мы можем использовать один из конструкторов класса String, либо напрямую присвоить строку в двойных кавычках. При работе со строками важно понимать, что объект String является неизменяемым (immutable). То есть при любых операциях над строкой, которые изменяют эту строку, фактически будет создаваться новая строка. Методы: concat(): объединяет строки valueOf(): преобразует объект в строковый вид join(): соединяет строки с учетом разделителя сompareTo(): сравнивает две строки charAt(): возвращает символ строки по индексу getChars(): возвращает группу символов equals(): сравнивает строки с учетом регистра equalsIgnoreCase(): сравнивает строки без учета регистра regionMatches(): сравнивает подстроки в строках indexOf(): находит индекс первого вхождения подстроки в строку isEmpty(): проверка на пустую строку lastIndexOf(): находит индекс последнего вхождения подстроки в строку length(): длина строки startsWith(): определяет, начинается ли строка с подстроки endsWith(): определяет, заканчивается ли строка на определенную подстроку replace(): заменяет в строке одну подстроку на другую trim(): удаляет начальные и конечные пробелы substring(): возвращает подстроку, начиная с определенного индекса до конца или до определенного индекса toCharArray(): преобразовывает строку в массив символов toLowerCase(): переводит все символы строки в нижний регистр toUpperCase(): переводит все символы строки в верхний регистр Что такое массив и какие на нём есть ограничения Массив — это структура данных, в которой хранятся элементы одного типа. В случае с Java массив однороден, то есть во всех его ячейках будут храниться элементы одного типа. Ввиду того, что массивы в Java имеют индекс типа int и только положительные значения индексов, то имеем максимальный индекс равный Integer.MAX_VALUE. Однако в исходных кодах приводится значение Integer.MAX_VALUE – 8, а также полностью зависит от JVM. Потому максимальный размер массива ограничивается ДВУМЯ параметрами: 1) значением Integer.MAX_VALUE – 8 и 2) максимальным размером памяти доступной для приложения. Что достигается первым. Максимальное количество вложенных массивов - 255 Многомерные массивы https://www.youtube.com/watch?v=17FwEtVsIMQ Побитовые операции https://www.youtube.com/watch?v=JMK7vm6ango преобразование из двоичной в десятичную и обратно : https://www.youtube.com/watch?v=FGRlYjHfzSY Особенно попробуйте 0.1 из 10-чной перевести в 2-ную и обратно: https://calculatori.ru/perevod-chisel.html Дробные числа в двоичной системе счисления: https://www.youtube.com/watch?v=F5OkBuzvI5g Перевод дробной части числа: https://math.semestr.ru/inf/drob.php Перевод 1111 в десятичную систему и обратно: 19) Представление вещественных чисел http://neerc.ifmo.ru/wiki/index.php?title=Представление_вещественных_чисел 20) Чем отличается метод от функции Методы в Java — это законченная последовательность действий (инструкций), направленных на решение отдельной задачи. По сути, это функции (они же процедуры, подпрограммы) более ранних, не ООП языков. Только эти функции являются членами классов и для различия с обычными функциями, согласно терминологии объектно-ориентированного программирования, называются методами.Простой способ запомнить: F unction → F ree (Свободные означает не принадлежность к объекту или классу) M ethod → M ember (член объекта или класса) Функция это самостоятельная сущность. Метод это часть класса(объекта) и без него не употребляется. Какая размерность у Boolean В стандартной реализации Sun JVM и Oracle HotSpot JVM тип boolean занимает 4 байта (32 бита), как и тип int. Однако, в определенных версиях JVM имеются реализации, где в массиве boolean каждое значение занимает по 1-му биту Размер Boolean переменной зависит от виртуальной машины. Назовите все условные операторы if/else Выражение if/else проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код. switchКонструкция switch/case аналогична конструкции if/else, так как позволяет обработать сразу несколько условий. Тернарная операцияТернарную операция имеет следующий синтаксис: [первый операнд - условие] ? [второй операнд] : [третий операнд]. Таким образом, в этой операции участвуют сразу три операнда. В зависимости от условия тернарная операция возвращает второй или третий операнд: если условие равно true, то возвращается второй операнд; если условие равно false, то третий. Отличия for от for each Основное отличие: приращение цикла for можно сделать любым, приращение цикла foreach – всегда равно единице. Пулы (String Pool) строк и integer? https://javarush.ru/groups/posts/645-stroki-v-java Пул примитивов Java? https://coderoad.ru/14402794/%D0%9F%D1%83%D0%BB-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-Java-%D0%BE%D0%B1%D0%B5%D1%80%D1%82%D0%BE%D0%BA-%D0%B8-%D1%81%D1%82%D1%80%D0%BE%D0%BA ПУЛ Integer i1 = 1; Integer i2 = 1; Integer i3 = new Integer(1); String s1 = "String"; String s2 = "String"; String s3 = new String ("String"); System.out.println("(i1 == i2) " + (i1 == i2)); System.out.println("(i2 == i3) " + (i2 == i3)); System.out.println("(s1 == s2) " + (s1 == s2)); System.out.println("(s2 == s3) " + (s2 == s3)); Execution result: (i1 == i2) true (i2 == i3) false (s1 == s2) true (s2 == s3) false Как вы видите бокс примитивов берет объекты из пула, создание String'ов через строковый литерал берет объекты из пула тоже. Такие объекты на самом деле являются одним и тем же объектом (operator == возвращает на них true). (размер от - 128 до 127) |