Какие примитивные типы данных есть в Java?
Что такое char?
Это примитивный тип данных, который хранит в себе номер символа в формате юникода и занимает 2 байта, поэтому диапазон хранимых значений от 0 до 65535
16-разрядное беззнаковое целое, представляющее собой символ UTF-16 (буквы, цифры и символы).
Сколько памяти занимает boolean?
Зависит от реализации JVM
1 байт в массивах, 4 байта вне его
Что такое классы-обертки?
Классы обертки типа Byte Short Integer Long Double Float Character Boolean, они являются ссылочными типами данных в отличии от их аналогов-примитивов, и хранят внутри себя значение примитива.
Они менее производительны но имеют методы типа toString, также например можно получить минимальное и максимальное значение.
Объекты классов-оберток являются неизменяемыми (Immutable)).
Используются для реализации дженериков.
Что такое автоупаковка ?
Автоупаковка - присвоение классу обертки значения примитивного типа, без явного использования конструктора класса.
Autoboxing происходит:
Важно отметить, что целочисленные классы оберток созданных с помощью авто упаковки кэшируются JVM и обертки с одинаковыми значениями будут иметь ссылку на один объект.
Что такое автораспаковка?
Автораспаковка - преобразование класса-обёртки в соответствующий ему примитивный тип. Если при распаковке класс-обёртка был равен null, произойдет исключение java.lang.NullPointerException.
Unboxing происходит:
Что такое явное и неявное приведение типов?
Привидение типов - это перевод одного типа данных в другой путем его расширения или сужения.
Явное приведение - явное сужение от большего к меньшему. Необходимо явно указать сужаемый тип.
Неявное приведение – автоматическое расширение типа переменной от меньшего к большему.
В случае с объектами мы можем делать неявное(автоматическое) приведение от наследника к родителю, но не наоборот, иначе получим ClassCastException.
В каких случаях в java нужно
использовать явное приведение?
Явное приведение типов может привести к потере данных, если целевой тип недостаточно велик для хранения значения исходного типа.
Кроме того, приведение объекта к несовместимому типу может привести к возникновению ClassCastException во время выполнения. Следовательно, необходимо использовать явное приведение типов с осторожностью и только тогда, когда вы уверены, что преобразование безопасно и не приведет к непреднамеренному поведению.
Что такое пул интов?
Для более эффективного использования памяти, в джаве используются так называемые пулы.
Есть строковый пул, Integer pool итд. Когда мы создаем объект не используя операцию new, объект помещается в пул, и в последствии, если мы захотим создать такой же объект (опять не используя new), новый объект создан не будет, а мы просто получим ссылку на наш объект из пула.
В классе-обертке Integer есть внутренний класс IntegerCache – пул (pool) целых чисел в промежутке [-128; 127], так как это самый часто встречающийся диапазон.
Он объявлен как private static. В этом внутреннем классе кешированные объекты находятся в массиве cache[].
Кеширование выполняется при первом использовании класса-обертки.
После первого использования вместо создания нового экземпляра (кроме использования конструктора), используются кешированные объекты, JVM берет их из пула.
Какие нюансы у строк в Java?
.toStringЧто такое пул строк?
Пул строк – это набор строк хранящийся в Heap.
Пул строк и Integer хранится в heap, но ссылки на объекты хранятся в stack.
Почему не рекомендуется изменять строки в цикле? Что рекомендуется использовать?
Т.к. строка неизменяемый класс, то возрастает потребление ресурсов при редактировании, т.к. каждую итерацию при редактировании будет создаваться новый обьект строки.
Рекомендуется использовать StringBuilder или StringBuffer.
Почему строки не рекомендуется использовать для хранения паролей?
Почему String неизменяемый и финализированный класс?
Почему строка является популярным ключом в HashMap в Java?
Поскольку строки неизменяемы, и их хэш код вычисляется и кэшируется в момент создания,а также не требует повторного пересчета при дальнейшем использовании.
Поэтому в качестве ключа HashMap они будут обрабатываться быстрее.
Что делает метод intern() в классе String?
Для того чтобы поместить строку созданную через new в пул строк, или присвоить переменной ссылку на значение строки из пула, если такое значение там уже существует.
Можно ли использовать строки в конструкции switch?
Да, начиная с Java 7 в операторе switch можно использовать строки, ранние версии Java не поддерживают этого. При этом:
Какая основная разница между String, StringBuffer, StringBuilder?
Класс String является неизменяемым (immutable) - модифицировать объект такого класса нельзя, можно лишь заменить его созданием нового экземпляра.
Класс StringBuffer изменяемый - использовать StringBuffer следует тогда, когда необходимо часто модифицировать содержимое, потокобезопасный
Класс StringBuilder был добавлен в Java 5 и он во всем идентичен классу StringBuffer за исключением того, что он не синхронизирован и поэтому его методы выполняются значительно быстрей, потоконебезопасный
Что такое StringJoiner?
Класс StringJoiner используется, чтобы создать последовательность строк, разделенных
разделителем с возможностью присоединить к полученной строке префикс и суффикс:
```
public static void main(String[] args) {
StringJoiner joiner = new StringJoiner(“, “);
joiner.add(“John”);
joiner.add(“Jane”);
joiner.add(“Jim”);
String result = joiner.toString(); System.out.println(result); // John, Jane, Jim ~~~
Существуют ли в java многомерные массивы?
Многомерные массивы в их классическом понимании в java не существуют.
Многомерный массив всегда прямоугольный и неразрывен в памяти.
А то, что в java считается многомерным - в других языках ещё называют “зубчатым массивом” или массивом массивов.
Какими значениями инициируются переменные по умолчанию?
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
boolean false
**Объекты (в том числе String) ** — null
Локальные (в методе) переменные не имеют значений по умолчанию, их имеют поля класса.
Не static-поле класса будет инициализировано после того, как будет создан объект этого класса.
А static-поле будет инициализировано тогда, когда класс будет загружен виртуальной Java машиной.
Что такое сигнатура метода?
Сигнатура метода - название метода и его параметры.
В сигнатуру метода не входит возвращаемое значение, а также бросаемые им исключения.
А сигнатура метода в сочетании с типом возвращаемого значения и бросаемыми исключениями называется контрактом метода.
Расскажите про метод main
Метод main() — Является, точкой входа в программу и вызывается JVM.
С его первой строки будет начато выполнение программы.
Как только заканчивается выполнение метода main(), так сразу же завершается работа самой программы.
static - чтобы JVM смогла загрузить его во время компиляции.
public static void и сигнатура - обязательное декларирование.
Может быть перегружен.
В приложении может быть несколько таких методов.
Если метод отсутствует, то компиляция возможна, но при запуске будет получена ошибка Error: Main method not found.
public static void main(String[] args) {}
Каким образом переменные передаются в методы, по значению или по ссылке?
В Java параметры всегда передаются только по значению, что определяется как «скопировать значение и передать копию».
С примитивами это будет копия содержимого.
Со ссылками - тоже копия содержимого, т.е. копия ссылки.
При этом внутренние члены ссылочных типов через такую копию изменить возможно, а вот саму ссылку, указывающую на экземпляр - нет.