Skip to content

Latest commit

 

History

History
175 lines (133 loc) · 14.8 KB

java-core-interview-more.md

File metadata and controls

175 lines (133 loc) · 14.8 KB

Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?

Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.

Затем вызываются нестатические блоки инициализации корневого предка, конструктор корневого предка и так далее вплоть до нестатических блоков и конструктора самого класса.

Parent static block(s) → Child static block(s) → Grandchild static block(s)

→ Parent non-static block(s) → Parent constructor →

→ Child non-static block(s) → Child constructor →

→ Grandchild non-static block(s) → Grandchild constructor

к оглавлению

Какие типы классов бывают в java?

  • Top level class (Обычный класс):
    • Abstract class (Абстрактный класс);
    • Final class (Финализированный класс).
  • Interfaces (Интерфейс).
  • Enum (Перечисление).
  • Nested class (Вложенный класс):
    • Static nested class (Статический вложенный класс);
    • Member inner class (Простой внутренний класс);
    • Local inner class (Локальный класс);
    • Anonymous inner class (Анонимный класс).

к оглавлению

Что такое «пул строк»?

Пул строк – это набор строк, хранящийся в Heap.

  • Пул строк возможен благодаря неизменяемости строк в Java и реализации идеи интернирования строк;
  • Пул строк помогает экономить память, но по этой же причине создание строки занимает больше времени;
  • Когда для создания строки используются ", то сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка на неё;
  • При использовании оператора new создаётся новый объект String. Затем при помощи метода intern() эту строку можно поместить в пул или же получить из пула ссылку на другой объект String с таким же значением;

к оглавлению

Приведите примеры удачного и неудачного использования Optional?

TODO Описать подробнее

  • get без проверки
  • default value
  • кидаем свой экспешн
  • передача в параметрах

к оглавлению

В чем разница между статическим и динамическим связыванием в Java?

TODO Описать подробнее

  • overloading/overriding
  • интерфейсы, абстрактный классы, дефолтные методы
  • invokestatic, invokevirtual

к оглавлению

Что такое classpath и как с ним работать?

Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет. Кроме непосредственно Java-приложений (команда java), этот параметр применим и для других утилит JDK, таких как javac, javadoc и другие. Есть два основных способа установки classpath:

  • в переменной окружения ОС CLASSPATH,
  • в аргументе командной строки -cp (синоним -classpath).

Второй способ предпочтительнее, потому что позволяет устанавливать разные значения для разных приложений. Значение по умолчанию – текущая директория. В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом : в параметре командной строки, или же ; в переменной окружения. Чтобы включить все файлы директории, разрешается использовать в конце пути символ *. Если приложение запускается из jar-файла (java -jar), classpath должен быть указан в его манифесте.

к оглавлению

Какие существуют базовые параметры тюнинга jvm?

  • -Xms - установить начальный размер heap Java
  • -Xmx - установить максимальный размер heap Java
  • -Xss - установить размер стека Java-потока (java thread stack)
  • -XX:+HeapDumpOnOutOfMemoryError - сделать дам хипа при нехватке памяти

к оглавлению

Что такое Happens-before? Какие особенности использования ключевого слова volatile

TODO Описать подробнее

  • Кэширование значений
  • Атомарность операций
  • Reordeing

к оглавлению

Расскажите о Heap и Stack память в Java. В чем разница между ними?

TODO Описать подробнее

  • локальная/глобальная видимость
  • ораничен/неограничен
  • фрагментация

к оглавлению

Как работает Garbage Collector?

TODO Описать подробнее

  • разные типы GC
  • stop the world
  • как сделать утечку памяти
  • как найти утечку памяти

к оглавлению

Расскажите, что вы знаете о разных типах ссылок в java?

TODO Описать подробнее

  • WeakReference, SoftReference, PhantomReference

к оглавлению

TODO

Подумать про эти вопросы:

Какие существуют модификаторы доступа?

private (приватный): члены класса доступны только внутри класса. Для обозначения используется служебное слово private.

default, package-private, package level (доступ на уровне пакета): видимость класса/членов класса только внутри пакета. Является модификатором доступа по умолчанию - специальное обозначение не требуется.

protected (защищённый): члены класса доступны внутри пакета и в наследниках. Для обозначения используется служебное слово protected.

public (публичный): класс/члены класса доступны всем. Для обозначения используется служебное слово public.

Последовательность модификаторов по возрастанию уровня закрытости: public, protected, default, private.

Назовите основные интерфейсы JCF и их реализации

На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» соответственно.

Интерфейс Collection расширяют интерфейсы:

  • List (список) представляет собой коллекцию, в которой допустимы дублирующие значения. Реализации:
    • ArrayList - инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу.
    • LinkedList (двунаправленный связный список) - состоит из узлов, каждый из которых содержит как собственно данные, так и две ссылки на следующий и предыдущий узел.
    • Vector — реализация динамического массива объектов, методы которой синхронизированы.
    • Stack — реализация стека LIFO (last-in-first-out).
  • Set (сет) описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Реализации:
    • HashSet - использует HashMap для хранения данных. В качестве ключа и значения используется добавляемый элемент. Из-за особенностей реализации порядок элементов не гарантируется при добавлении.
    • LinkedHashSet — гарантирует, что порядок элементов при обходе коллекции будет идентичен порядку добавления элементов.
    • TreeSet — предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
  • Queue (очередь) предназначена для хранения элементов с предопределённым способом вставки и извлечения FIFO (first-in-first-out):
    • PriorityQueue — предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
    • ArrayDeque — реализация интерфейса Deque, который расширяет интерфейс Queue методами, позволяющими реализовать конструкцию вида LIFO (last-in-first-out).

Интерфейс Map реализован классами:

  • Hashtable — хэш-таблица, методы которой синхронизированы. Не позволяет использовать null в качестве значения или ключа и не является упорядоченной.
  • HashMap — хэш-таблица. Позволяет использовать null в качестве значения или ключа и не является упорядоченной.
  • LinkedHashMap — упорядоченная реализация хэш-таблицы.
  • TreeMap — реализация, основанная на красно-чёрных деревьях. Является упорядоченной и предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
  • WeakHashMap — реализация хэш-таблицы, которая организована с использованием weak references для ключей (сборщик мусора автоматически удалит элемент из коллекции при следующей сборке мусора, если на ключ этого элемента нет жёстких ссылок).

Что такое FunctionInterface и чем он отличается от обычного интерфейса?

  • Один метод
  • Используется в лямбдах
  • Аннотация @FunctionalInterface
  • Какие бывают
  • Напиши свою

Привести пример плохой и хорошей реализации метода hashCode()?

  • константа
  • неравномерное распределение
  • сломан контракт с equals()

Что такое Atomic types и зачем они нужны?

  • Атомарные операции
  • Оптимистичная блокировка (compareAndSet)
  • Практические кейсы

к оглавлению