1/26
Name | Mastery | Learn | Test | Matching | Spaced |
---|
No study sessions yet.
JVM (Java Virtual Machine)
Виртуальная машина Java, обеспечивающая кроссплатформенность за счет выполнения байт-кода.
Плюсы Java
Развитая экосистема (Spring, Hibernate), ООП, устоявшийся язык, безопасность, платформенная независимость.
Минусы Java
Тяжёлый в плане памяти, многословный, медленнее C/C++ (несмотря на JIT).
JDK (Java Development Kit)
JRE (JVM, ClassLoader, стандартные библиотеки), компилятор Java (JAVAC), примеры, документацию, различные утилиты.
JRE (Java Runtime Environment)
Минимально необходимая для работы Java приложений реализация виртуальной машины. Состоит из JVM, ClassLoader, и стандартного набора библиотек и классов джава
JVM (Java Virtual Machine)
Виртуальная машина Java, которая выполняет байт-код, скомпилированный JIT компилятором, с помощью встроенного интерпретатора байт кода.
Исключение
Объект, описывающий исключительное состояние.
Правила переопределения hashCode()
Хэш-код над одним и тем же объектом всегда равен. Хэш-код над двумя одинаковыми объектами всегда равен. Хэш-код над двумя разными объектами обычно не равен.
Контракт между hashCode() и equals()
1) Если два объекта возвращают разные значения hashcode(), то они не могут быть равны. 2) Если equals объектов true, то и хэшкоды должны быть равны. 3) Переопределив equals, всегда переопределять и hashcode.
JIT (Just-in-time) компилятор
Компиляция на лету или динамическая компиляция. Технология увеличения производительности программных систем, использующих байт-код, путем компиляции байт-кода в машинный код во время работы программы. В основном отвечает за оптимизацию производительности приложений во время выполнения.
Как реализовать иммутабельный класс?
Файнал класс, приватный конструктор, отсутствие сеттеров.
Динамическая загрузка Class.forName()
Нужна, чтобы не перегружать программу, т.е мы принимаем решение о том, какой класс нам нужен в коде. Происходит в ходе выполнения программы.
Что произойдёт если в блоке инициализации возникнет исключение?
Для нестатических блоков, если исключение прописано явно, то нужно указать это в throws конструктора, иначе будет ошибка компиляции. У статического блока будет ошибка компиляции.
Сериализация
Процесс сохранения состояния объекта в последовательность байт. Реализована через маркерный интерфейс Serializable и Externalizable.
Для чего нужна сериализация?
Для компактного сохранения состояния объекта и считывания этого состояния.
Шаги сериализации (writeObject())
Проверка реализует ли объект Serializable; Запись метаданных (имя класса, serialVersionUID, список полей, иерархия); Запись значений полей (нестатических и не transient). Объекты — рекурсивно; Если есть writeObject() — вызывается вместо дефолтного поведения.
Шаги десериализации (readObject())
Чтение метаданных и сравнение serialVersionUID; Создание объекта без конструктора; Установка значений сериализованных полей; Если есть readObject() — вызывается вместо стандартного чтения.
Пример сериализации
ObjectOutputStream oos.writeObject, oos.flush, oos.close.
В чём проблема сериализации синглтона?
Создаётся новый объект. Решение: readResolve() будет возвращён изначальный синглтон.
Дженерики
Параметризованные типы, они позволяют писать типобезопасный и переиспользуемый код. Компилятор проверяет типы. Дженериком может быть класс, интерфейс, конструктор, поле и метод. Информация о типе доступна только на моменте компиляции и стирается в рантайм, в байткод попадает обобщённый вариант.
Для чего нужны дженерики?
Для строгой типизации и проверки на этапе компиляции.
Вайлдкард
Дженерик вида , означает, что тип может быть чем угодно. Можно задать ограничения: ? extends T (наследник T, либо сам T), ? super T (предок T, либо сам T).
Лямбда-выражение
Короткий способ написать анонимный метод, т.е. метод без имени, который можно передать как объект. Функция, которую можно засунуть в переменную, передать как аргумент и вызвать потом.
Функциональные интерфейсы
Predicate
Стримы
Последовательность элементов над которой можно проводить различные операции. Операции бывают промежуточными и терминальными. Важно заметить, что стримы ленивые и начнут выполнение только при вызове терминального метода.
Как создать стрим?
Stream.empty(), list.stream(), map.entrySet().stream(), Arrays.stream(array), Stream.of("1", "2", "3").
Метод peek
Map принимает на вход один объект, а возвращает другой, peek же возвращает тот же объект, но возможно с изменённым внутренним состоянием. Также не нужно указывать ретёрн, программа и так знает что нужно возвращать.