JavaCore3: Procedure Java Flashcards
Какие примитивные типы данных есть в Java?
byte 8 бит -2^7 .. -2^7 - 1;
short 16 бита -2^15 .. -2^15 -1;
int 32 бита -2^31 .. -2^31 -1;
long 64 битов -2^63 .. -2^63 -1;
double 64 битов ;
float 32 битов ;
char 16 бит ;
boolean 4 бита (1 бит в массивах);
Что такое char?
это символьный тип данных, который хранит в себе номер символа в формате юникода и занимает 2 байта, поэтому диапазон хранимых значений от 0 до 65535.
Что такое классы-обертки?
Классы обертки являются ссылочными типами данных в отличии от их аналогов-примитивов, и хранят внутри себя значение примитива.
Объекты классов-оберток являются неизменяемыми (Immutable)).
Используются для реализации дженериков.
Что такое автоупаковка ?
Автоупаковка - присвоение классу-обертке значения примитивного типа, без явного использования конструктора класса.
Целочисленные классы оберток созданных с помощью авто упаковки кэшируются JVM и обертки с одинаковыми значениями будут иметь ссылку на один объект.
Autoboxing происходит:
- При присвоении значения примитивного типа переменной соответствующего класса-обёртки.
- При передаче примитивного типа в параметр метода, ожидающего соответствующий ему класс-обёртку.
Что такое автораспаковка?
Автораспаковка - преобразование класса-обёртки в соответствующий ему примитивный тип.
Если при распаковке класс-обёртка был равен null, произойдет исключение java.lang.NullPointerException.
Unboxing происходит:
- При присвоении экземпляра класса-обёртки переменной соответствующего примитивного типа.
- При передаче объекта класса-обёртки в метод, ожидающий соответствующий примитивный тип.
- В выражениях, в которых один или оба аргумента являются экземплярами классов-обёрток. Так как арифметические операторы и операторы сравнения (исключение == и !=) применяются только к примитивным типам. При сравнении классов-обёрток оператором == или !=, происходит сравнение по ссылкам, а не по значениям и может возникнуть путаница.
Что такое явное и неявное приведение типов?
Привидение типов - это перевод одного типа данных в другой путем его расширения или сужения.
Явное приведение - явное сужение от большего к меньшему. Необходимо явно указать сужаемый тип.
Неявное приведение – автоматическое расширение типа переменной от меньшего к большему.
В случае с объектами мы можем делать неявное(автоматическое) приведение от наследника к родителю, но не наоборот, иначе получим ClassCastException.
Почему не рекомендуется изменять строки в цикле? Что рекомендуется использовать?
Т.к. строка неизменяемый класс, то возрастает потребление ресурсов при редактировании, т.к. каждую итерацию при редактировании будет создаваться новый обьект строки.
Рекомендуется использовать StringBuilder или StringBuffer.
Почему строки не рекомендуется использовать для хранения паролей?
1) Так как строки в Java хранятся в пуле строк, то пароль в виде обычного текста будет доступен в памяти, пока сборщик мусора не очистит её. И поскольку String используются в String pool для повторного использования, существует довольно высокая вероятность того, что пароль останется в памяти надолго, что совсем не безопасно.
char[] можно очистить сразу, например вызвав
Arrays.fill(password, ‘\0’);
2) Java сама по себе рекомендует использовать метод getPassword () из класса JPasswordField, который возвращает char [].
3) С типом String всегда существует опасность того, что текст, хранящийся в строке будет напечатан в файле логов или в консоли. В то же время в случае использования Array, вы не будете печатать содержимое массива, а только его расположение в памяти.
Q
Почему String неизменяемый и финализированный класс?
1) Для возможности реализации String pool. При изменяемости строк было бы невозможно реализовать интернирование, поскольку если какая-либо переменная изменит значение, это отразится также и на остальных переменных, ссылающихся на эту строку.
2) Безопасность:
Поскольку в Java строки используются для передачи параметров для авторизации, открытия файлов и т.д. — неизменяемость позволяет избежать проблем с доступом.
3) Для многопоточности. Неизменяемые строки потокобезопасны
Так как строка неизменяемая то, она безопасна для много поточности и один экземпляр строки может быть совместно использован различными потоками.
4) Строки используются classloader, и неизменность обеспечивает правильность
загрузки класса.
5) Ключ для HashMap
Поскольку строка неизменная, её hashcode кэшируется в момент создания и нет никакой необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в Map.
Что делает метод intern() в классе String?
Метод intern() используется для сохранения строки в пуле строк или получения ссылки, если
такая строка уже находится в пуле.
Можно ли использовать строки в конструкции switch?
Да, начиная с Java 7.
При этом согласно документации Java 7 для строк в switch, компилятор Java формирует более эффективный байткод, чем для сцепленных условий if-else.
Какая основная разница между 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 считается многомерным - в других языках ещё называют “зубчатым массивом” или массивом массивов
Какими значениями инициируются переменные по умолчанию?
yte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
boolean false
**Объекты (в том числе String) ** — null
Локальные (в методе) переменные не имеют значений по умолчанию, их имеют поля класса.
Не static-поле класса будет инициализировано после того, как будет создан объект этого класса.
А static-поле будет инициализировано тогда, когда класс будет загружен виртуальной Java машиной