Java Flashcards

1
Q

Почему джава платформонезависимая? Почему она запускается на любой машине? Кроссплатформенность. Что такое джава и почему она строго типизированная?

A

Java — мультифункциональный объектно-ориентированный язык со строгой типизацией.
Кроссплатформенность. Java является кроссплатформенным языком программирования, то есть программы, написанные на Java, могут работать на разных платформах. Потому что джава запускается на джава машине, и мы как бы можем написать код на любой операционной системе, компилятор скомпилирует наш код в байт код, передаст его джава машине, а тот преобразует его в машинный код, понятный уже определенно этой машине, на которой установлен jvm.
Строгая типизация. Она не позволяет смешивать в выражениях различные типы и не выполняет автоматически неявные преобразования.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Разница между процедурном программированием и ооп?

A

Процедурное программирование - это тип программирования, в котором инструкции для решения задачи выполняются одна за другой, сверху вниз, иногда возникают изменения в их последовательности. Когда программа становится более сложной на помощь приходят методы.
Объектно-ориентированное программирование (ООП) - методика программирования, в которой основными концепциями являются понятия объектов и классов. Прежде чем начать писать инструкции для решения задачи, в задаче выделяются объекты и описываются с помощью классов. В классе прописывается поведение объектов с помощью методов и характеристики или свойства объекта с помощью переменных класса. Одной из ключевых особенностей языка Java является ООП.
Процедурное программирование можно сравнить с постройкой маленького домика - нет необходимости тратить время и ресурсы на продумывание архитектуры. ООП же похоже на постройку сложного архитектурного сооружения, где очень важно продумать все детали, и только потом приступать к программированию (постройке).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Преимущества и недостатки ООП. Что это такое?

A

ООП – метод программирования, основанный на представлении программы в виде совокупности взаимодействующих объектов, которые являются экземплярами определенных классов, а классы образуют иерархию наследования.
Преимущества:
*ООП парадигма позволяет переложить наш объект из реального мира в наш код. Мы устанавливаем связи и взаимодействия между объектами подобно тому, как они взаимодействуют в реальном мире. И поэтому нам проще с ней разобраться.
*мультифункциональность;
*достаточно простой синтаксис;
*независимость (код сможет работать на любой платформе, поддерживающей Java);
Недостатки:
*В избыточности. Когда мы хотим достигнуть какой-то простой цели, мы не хотим описывать всю структуру объектов, их связи и зависимости. Мы просто хотим получить какой-то результат. То есть как бы не хватает краткости.
*требуемое большое количество памяти;
*низкая скорость по сравнению с С и С++;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Главные принципы ООП:

A

Абстракция, Инкапсуляция, Наследование, Полиморфизм.
Абстракция – отделяет концепт от ее реализации. Выделение значимых характеристик объекта. Например, у нас есть класс Работник, у которого есть все нужные характеристики: ФИО, дата рождения и прочее. Но если это работник модельного бизнеса нам важны такие характеристики как Рост, вес, цвет глаз., а если работник Инженерной разработки, то эти свойства нам не важны, но есть другие значимые. Значит мы выделяем абстрактного работника, а затем наследуемся от него и добавим какие-то специфические свойства.
Инкапсуляция – размещение одного объекта или класса внутри другого для разграничения доступа к ней, путем модификатора доступа. Пример: У тебя есть имя и фамилия. Их знают все твои знакомые. Но у них нет доступа к изменению твоего имени и фамилии. Этот процесс, можно сказать, «инкапсулирован» в паспортном столе: поменять имя фамилию можно только там, и сделать это можешь только ты. Остальные «пользователи» имеют доступ к твоему имени и фамилии «только на чтение».
Наследование – способность объекта базироваться на другом объекте. То есть когда один объект приобретает характеристики другого добавляя свои собственные. Основное преимущества наследования – повторное использование кода.
Полиморфизм – сокрытие различных реализаций за одним интерфейсом, или это возможность работать с несколькими типами так, будто это один и тот же тип. При этом поведение объектов будет разным в зависимости от типа, к которому они принадлежат. Пример: Интерфейс flyable – с методом fly() и разные птицы наследуют его по разному.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Отношения “Являюсь” и “Имею” в ООП

A

Отношение «Is A» - это наследование. Когда мы имеем класс БМВ и он наследуется от класса Машина, можно задать вопрос: бмв является машиной? и если да, тогда это отношение is a.
Отношение «Has A» - это когда у нас есть класс Радио и класс Машина. И логично, что у машины может быть радио. И мы должны записать отдельным полем (сделать injection) и такие отношения называются «has a»

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Динамический полиморфизм (или рантайм полиморфизм).

A

Когда мы вызываем переопределенный метод дочернего класса через ссылку на родительский тип, тогда тип объекта указывает, какой метод будет вызван. Принятие этого решения происходит во время выполнения JVM после компиляции кода. Следовательно, это называется как рантайм полиморфизм.
Есть родительский класс Звери и наследники: травоядные и хищники. Классы-потомки расширили родителя и переопределили его метод eat(). И когда мы где-то в программе создаем объект класса звери: Animal animal = new Predator(). И вызываем у этого объекта метод eat(). Так вот он вызовет именно тот, что переопределен в Хищнике.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое перегрузка методов?

A

В программе мы можем использовать методы с одним и тем же именем, но с разными возвращаемыми типами или количеством параметров. Такой механизм называется перегрузкой методов (method overloading).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Перегрузка конструктора: зачем, в чем смысл?

A

Конструкторы похожи на методы, поэтому они тоже могут быть перегружены - вы можете объявлять в одном классе несколько конструкторов, которые различаются количеством и типом переменных. Если у нас, например, есть какой-то объект, в котором есть обязательные поля, а есть не совсем. И когда мы создаем объект этого класса и одного параметра не хватает, то нам он как бы и не важен, поэтому мы можем создать. А если у нас будет только один конструктор, то компилятор будет ругаться и не даст создать объект. Поэтому мы создаем два конструктора с разным количеством параметров.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Можно ли создать 2 метода с одинаковым именем и разным возвращаемым типом?

A

Да, если у них будут разные принимаемые параметры. Если отличаться будет только возвращаемый тип, то будет ошибка, это не перегруженный метод.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Чем отличаются статические поля и методы от не статических?

A

Статические поля и методы относятся к классу, в котором они объявлены и для обращения к ним не нужно создавать объект. Нестатические относятся к объекту и для обращения к ним нужно создать экземпляр этого класса.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Позднее и раннее связывание.

A

Позднее связывание связано с формированием кода на этапе выполнения. Если в иерархии классов встречается цепочка виртуальных методов, то компилятор строит так называемое позднее связывание. При позднем связывании вызов метода происходит на основании типа объекта, а не типа ссылки на базовый класс. Позднее связывание используется, если нужно реализовать полиморфизм.
Раннее связывание - это когда метод который будет вызван, известен во время компиляции, напр. вызов статического метода.
Статическое связывание происходит во время компиляции, а динамическое – во время выполнения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Множественное наследование. Почему от него отказались?

A

В джаве нет такого наследования, но можно использовать множественную имплементацию интерфейсов.
Отказались потому что с ним связано много проблем. Самая известная – diamond problem – это когда класс В и С наследуются от класса А, а класс D наследуется от них двоих, а затем ему нужно вызвать метод класса А, который не переопределен в классе D, но классы В и С переопределили его по-своему, то не понятно, метод какого класса будет реализовывать класс D.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Композиция и агрегация.

A

Это частные случаи ассоциации.
Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Например, Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример — Преподаватель и Студент — т.е. какой-то Студент учится у какого-то Преподавателя. Ассоциация и есть описание связи между двумя объектами.
Композиция — включение объектом-контейнером объекта-содержимого и управление его поведением; значит, что внутренний объект не может существовать без внешнего. Типа, колесо-мотоцикл. Колесо без мотоцикла не имеет смысла.
Агрегация — включение объектом-контейнером ссылки на объект-содержимое; при уничтожении первого последний продолжает существование. Кресло может стоять в квартире, офисе, заводе. Оно может существовать где угодно и выполнять свои функции.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Интерфейс vs Объект vs Класс vs Метод

A

Класс — это шаблон, используя который мы можем создавать экземпляры объектов, у которых будет точно такая же конфигурация, как и у шаблона — те же свойства и методы.
Объект – это экземпляр определенного класса.
Метод – это поведение, функция или операция, которую может совершать наш объект.
Интерфейс – это контракт, который говорит нам о том, что некие классы, имплементирующие данный интерфейс имеют общее поведение.
Интерфейс — это группа взаимосвязанных свойств и методов, которые описывают объект, но не обеспечивают реализацию или инициализацию этих свойств и методов в объектах.
Главное отличие класса от интерфейса — в том, что класс состоит из интерфейса и реализации.
Есть пример: допустим у нас есть класс Ключ, который имеет публичный метод Открыть, который в свою очередь ссылается на приватные методы Вставить, Повернуть и Вынуть. А также есть интерфейс Ключ, который содержит метод Открыть. Если мы наследуемся от класса Ключ, то наш наследник наследует его метод Открыть, вместе с его реализацией. А если, например, нам нужно открыть дверь с помощью не поворотного ключа, а магнитной карты, а мы унаследовали класс Ключ вместе с его методом Открыть, который открывает уже прописанным способом. Так вот если у нас есть интерфейс, то мы можем прописать для поворотного ключа и для магнитной карты свою реализацию и не переживать, что у нас ограничен функционал.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Модификаторы доступа

A

private – доступ только внутри класса
default – доступ внутри класса и у классов из этого же пакета.
protected – доступ из класса, пакета и у классов наследников.
public – доступ из любого места программы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

JVM, JRE, JDK

A

JVM – виртуальная машина Java. Она преобразовывает байт код в машинный код.
JRE (Java Runtime Environment) – реализация виртуальной машины, которая предоставляет платформу для работы джава программ. Чтобы запустить на любой машине джава-программу, сначала надо установить JRE на этой машине. Содержит собственно JVM + набор стандартных библиотек.
JDK (JAVA Development Kit) – основной компонент среды Джава. Включает в себя JRE + отладчик, компилятор и все стандартные классы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Declaration и Initialization (Объявление и инициализация)

A

Декларация - это просто объявление переменной: тип и его имя.
Инициализация – это когда наша переменная уже приобретает какой-то объект, начинает ссылаться на объект, занимать место в памяти и т.д.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Переменные, что это. Из чего состоит

A

Переменная в Java — это контейнер, в котором может храниться некоторое значение данных для дальнейшего использования в программе. По сути переменная — это минимальная неделимая единица Java-приложения. Все переменные в Java можно разделить на два вида: переменные примитивных типов и ссылки.
Состоит из типа и имени, затем идет оператор присвоение и какое-то значение этой переменной.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Разница между локальной переменной и переменной метода (инстанс и локал)

A

Инстанс переменная или переменная экземпляра – это нестатические переменные, которые определены в классе вне какого-либо метода или блока. Каждый созданный объект имеет отдельную копию или экземпляр этой переменной. Переменная принадлежит классу.
Переменная метода – это переменная объявленная внутри метода и любого другого блока кода. Она перестает существовать, когда метод завершает свою работу.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Где хранится переменная

A

Примитивная переменная хранится в стэке, а ссылочная в хипе. Примитивная переменная может хранится в хипе, если она является переменной экземпляра, то есть она будет хранится там же, где и сам объект.
переменные метода хранятся в стэке: примитивные полностью, а ссылочные: ссылка в стэке, а сам объект – в хипе. После завершения метода, переменные метода перестают сущетсвовать, а тот объект, который хранился у нас в хипе, ссылка которого была в стэке, удалиться при следующем вызове сборщика мусора, потому что тот проверит что нет никаких переменных, которые ссылались бы на этот объект.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Как в джава передаются аргументы в метод: по ссылке или по значению?

A

Java всегда передает параметры по значению.
Допустим, у нас есть переменная int a = 10. мы передаем ее в метод
count(int b){
b = b * 10; }
Если мы где-то потом снова выведем переменную а, то увидим, что она не изменилась, потому что в метод count была передана ее копия, то есть только ее значение. и манипуляции были произведены с копией, а не с изначальной переменной.
Если мы говорим о списках, то там тоже самое:
У нас есть список List<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3)).
мы передаем копию нашего списка.
count(List<Integer> numbersNew){
numbersNew.add(5); }
то есть numbersNew и numbers – это две разные ссылки, но они ссылаются на один и тот же объект. Поэтому любые манипуляции с этими ссылками будут приводить к изменению этого объекта.
Только если в методе написать numbersNew = new ArrayList<>(numbers), а потом производить манипуляции, то тогда не это будут разные ссылки и разные объекты, и манипуляции с одним не будут затрагивать другой.</Integer></Integer>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Типы данных: Примитивные и ссылочные переменные. Отличия. Классы оболочки примитивов.

A

Ссылочные типы данных – ссылка на них хранится в стэке, сам объект в хипе, чтобы его создать нужно использовать оператор new. Если на объекты, лежащие в хипе не останется ссылки, то ГарбечКоллектор удалит их. Примитивные типы хранятся в стэке. Примитивные: byte(8 бит) = 127, short(16 бит) = 32,7 тыс, int(32 бит) = 2,1 млрд, long(64 бит), char(16 бит), float(32 бит), double(64 бит), Boolean.
Ссылочные – String, все классы, массивы, коллекции и интерфейсы.
Отличия: примитивы хранят значения, а ссылочные – ссылку на объект в памяти, создаются через присваивание значения, а ссылочные через конструктор класса, примитывы имеют строго заданный диапазон, а ссылочные имеют по умолчанию значение null.
Классы обертки нужны нам чтобы работать с примитивами как с объектами: например в коллекциях и чтобы передавать их значение по ссылке.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Почему примитивные типы данных называют строго типизированными и статично типизированными. В чем выражается строгость

A

Статически типизированный язык, в котором каждая переменная и тип выражения уже известны во время компиляции. Как только переменная объявлена как относящаяся к определенному типу данных, она не может содержать значения других типов данных.
Строго типизированный язык – это значит, что все данные и каждое выражение имеет конкретный тип, который строго определен. А также то, что все операции по передаче данных будут проверяться на соответствие типов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Автобоксин. Анбоксинг.

A

Это приведение примитивного типа данных классу обертке и наоброт. То есть мы можем присвоить классу обертке примитивное значение, и он его автоматически преобразует к интеджеру – это автобоксинг, а когда мы присваиваем класс обертку соответствующему ему примитиву – анбоксинг.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Нативные методы

A

это методы, которые написаны на другом языке программирования

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Класс Обджект. Какие методы у него есть? что мы о нем знаем, зачем нужен?

A

Самый начальный класс, от которого наследуются все классы. Поэтому все классы, могут реализовать методы класса Обджэкт. Его методы:
toString – для строкового представления объекта.
hashCode – получаем своеобразный идентификатор в виде числа типа инт,
equals – для сравнения объектов,
getClass – позволяет получить типа данного объекта,
clone() - создает объект точную копию объекта(есть глубокое и поверхностное копирование – при поверхностном мы копируем ссылки, а при глубоком – копируем все переменные, примитивные и ссылочные),
notify/notifyAll() – возобновляет все потоки ожидающие вызова,
wait() – ожидает исполнение другого потока.,
finalize() – вызывается перед удаление неиспользуемого объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Контракт equals-hashcode.

A

Это методы класса обджект. если мы хотим, чтобы корректно работали такие структуры данных как хэшмапа, линкедхэшпама и другие, то нам нужно переопределять эти методы в наших классах.
Equals – сравнивает объекты по значениям их полей, hashcode возвращает числовое представление объекта и используется в коллекциях, чтобы определить позицию элемента в хэштаблице.
Контракт гласит:
1. Всякий раз, для одного и того же объекта вызывая несколько раз hashcode во время выполнения приложения, он должен возвращать одно и тоже значение, при условии, что информация, используемая в equals для сравнения, не изменялась.
2. Если два объекта равны по equals, то их hashcode тоже должен быть равен.
3. Если два объекта не равны по equals, то они не обязательно не равны по hashcode.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Принципы переопределения метода иквалс?

A

Рефлексивность - каждый объект должен быть эквивалентен самому себе(x.equals(x) = true);
Симметричность - два любых объекта должны быть равны независимо от того, в каком порядке они будут сравниваться (x.equals(y) = true только, если y.equals(x) = true).
Транзитивность - для каждого экземпляра x, y и z должно выполнятся условие: если x.equals(y) возвращает true и y.equals(z) возращает true, тогда x.equals(z) должно возращать true
Согласованность - если объекты x и y не меняются, повторный вызов x.equals(y) должен вернуть то же значение, что и ранее.
Сравнение null - ни один объект не должен быть равен null (x.equals(null) = false)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Строка. Всё о ней.

A

String – это immutable class. Неизменяемый. Класс реализует интерфейсы Serializable и CharSequence. это final класс, который не может иметь потомков. Благодаря своей неизменности, объекты класса String являются потокобезопасными. Его основные методы: toString(), valueOf() - перевод экземпляра любого Java-класса или любого примитивного типа данных к строковому представлению ,indexOf() - метод для определения позиции символа , endWith(), toUpperCase(), toLowerCase(), intern() — помещает строку в StringPool, если там такой еще нету.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

String Pool. Сколько там хранятся значения?

A

Класс String, возможно, наиболее часто используемый класс в Java. Если новый объект создавать в динамической памяти (memory heap) каждый раз, когда мы используем String, то мы потратим впустую много памяти. Пул строк (String pool) решает эту проблему, сохраняя только один объект для каждого значения строки

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Что такое конструктор для копирования? Copy constructor

A

Конструктор копирования - это конструктор, который создает объект, используя другой объект того же класса.
Это полезно, когда мы хотим скопировать сложный объект, содержащий несколько полей, или когда мы хотим сделать глубокую копию существующего объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

String Builder, String Buffer

A

String Builder – потоконебезопасный
String Buffer – потокобезопасный
Они имеют одинаковые методы и отличаются только потокобезопастностью. Самый главный метод append(), который помогает конкатенировать строки. В классе Стринг, когда мы конкатенируем с помощью +, то под капотом используется класс Билдер или Баффер на успотрение компилятора и метод append().
Популярные методы: insert(), replase(), substring(), delete(), reverse().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

finally, final, finalize – что это и разница?

A

finally – это блок кода из try/catch, который выполняется всегда.
final – это слово которым помечается класс, метод или переменная, чтобы обозначить что она финальная и не изменяемая и не может наследоваться, в случае класса
finalize – это метод класса Object, который вызывается перед неиспользуемым объектом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Циклы:

A

for – проходит циклом по массиву или коллекции, итерируясь на каждом элементе. под капотом имплементит итератор или итерабл.
for-each - цикл “для каждого…” — разновидность for для перебора коллекции элементов, нам не нужно следить за счетчиком, цикл сам поочередно берет элементы из коллекции и помещает их в указанную переменную.
while – выполняется до тех пор, пока условие дает результат true,
do-while – сначала делает что-то, затем проверяет условие, и если true – идет на новый круг.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

Условны операторы.

A

if / if-else
switch
тернарная операция

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

Массив: примитив или объект? Это статическая структура данных или динамическая?

A

Массив – это объект, или конечная последовательность упорядоченных элементов одного типа.
Массив - это статическая структура. Когда массив инициализируется, длина массива не является переменной. Массивы в Java-программах должны быть инициализированы перед использованием. Так называемая инициализация состоит в том, чтобы выделить пространство памяти для элементов объекта массива и указать начальное значение для каждого элемента массива.
Скорость доступа к элементу - O(1) – константное время.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Big O Notation

A

Это способ обозначения сложности алгоритма.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

Абстрактный класс vs Интерфейс

A

Если нам нужна дефолтная реализация, как бы описание сущности наследников, то мы можем использовать абстрактный класс, если же нам нужен просто контракт, что группа объектов умеет делать, то используем интерфейс.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

Гетерогендерный типы(Гетероджерерс)

A

Когда гетерогенный объект ссылался на гетерогенную коллекцию, коллекцию, которая может хранить объекты разных типов. Неоднородной коллекцией может быть массив Object[] или List<object>, они могут содержать экземпляры разных типов (например, Integer и String).</object>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Immutable object

A

Неизменяемый объект — это объект, внутреннее состояние которого остается постоянным после того, как он был полностью создан. А если мы пытаемся его изменить, то получаем новый объект. Яркий пример класс STRING.

41
Q

Рекурсия.

A

Рекурсия – это способность метода вызывать самого себя. Самый известный пример, факториал числа.

42
Q

Enum.

A

Енам – это специальный класс, который нужен для хранения объектов одного типа, он необходим для некоего ограничения множества допустимых значений для определенного типа данных. Там создаются как бы объекты только один раз, нам не нужно будет создавать их где-то еще, а просто доставать из енама. Все объекты там являются константами. Енам представляет собой фактически новый тип, то есть мы можем определить переменную этого типа и использовать ее в коде.

43
Q

Какой лучший вариант, чтобы скопировать один массив в другой?

A

1 – циклом for;
2 – вызвать метод clone() у копируемого массива;
3 – System.arraycopy();
4 – Arrays.copyOf(),
5 – Arrays.copyOfRange()

44
Q

Static – что это, зачем, наследуется ли?

A

Static — модификатор, применяемый к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта к текущему классу. Если поле статично, значит оно принадлежит классу, если метод статичный — он принадлежит классу. Исходя из этого, можно обращаться к статическому методу или полю, используя имя класса. Например, если поле count статично в классе Counter, значит, вы можете обратиться к переменной запросом вида: Counter.count.
Если переменная не статическая, то у каждого нового объекта данного класса будет своё значение этой переменной, меняя которое мы меняем его исключительно в одном объекте.
Статические методы также привязаны к классу, а не к объекту. Важным свойством статического метода является то, что он может обратиться только к статическим переменным/методам.
Статическим классом может быть только внутренний класс.

45
Q

Иерархия Exception

A

Самый первый класс Throable. Его наследники Эксепшн и Эррорс. Эксепшн является результатом ошибки в программе, а Эррорс – это более серьезные проблемы, которые происходят на уровне JVM и их не нужно пытаться решать в своей программе. Пример эрорсов является нехватка памяти.
Все исключения делятся на 2 типа: чект и анчект. (Error и RuntimeException – непроверяемые исключения). Throable – checked!
Самые популярные наследники RuntimeException – IndexOutOfBoundsException, ArithmeticException и NullPointerException, a Exception – SQLException, IOException, ClassNotFoundException.
Проверяемые исключения расскрывают принцип инкапсуляции и дают слишком много знаний и привязку на внутреннюю реализацию. Best practic предлагает использовать анчект исключения вместо чект потому, что они не расскрывают инкапсуляцию и не принуждает нас ни к чему.

46
Q

try/catch/finaly

A

Каждый блок try должен иметь либо catch либо finaly. Он может не иметь catch, но желательно иметь.
Finaly выполняется всегда при завершении кода. Он может не завершиться только в том случае, если происходит системный выход в блоке try или catch, то есть если джава машин умирает, то как бы ей уже не до finaly.
Может иметься несколько блоков catch, они должны располагаться по иерархии от нижнего к верхнему, то есть если мы поставим сверху сразу общий класс Exception, а ниже например – SQLException, то он как бы до – SQL и не дойдет никогда, потому что его будет перехватывать Exception.

47
Q

Что такое AutoCloseable и конструкция try-with-resources?

A

Интерфейс AutoCloseable представляет объект-хранилище некоего ресурса, пока тот не закрыт. В единственном его методе close() объявляется логика закрытия этого ресурса. Его применение позволяет использовать объект в языковой конструкции try-with-resource.
Оператор try-with-resources — это try оператор, объявляющий один или несколько ресурсов. Ресурс — это объект, который должен быть закрыт после того, как программа закончит работу с ним. Оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце оператора.

48
Q

Потоки ввода-вывода зачем нужны в джаве?

A

При разработке часто возникает необходимость сохранения или извлечения информации из какого-либо источника. Для этого используются потоки ввода-вывода, которые представляют собой объекты соответствующих классов. Самые первые классы, появившиеся в джаве связаны с передачей и извлечением последовательности байтов. Эти классы являются потомками абстрактных классов InputStream и OutputStream.
Эти классы находятся в папке java.io. В нем же лежат все остальные классы: FileImputStream/ FileOutput – для работы с байтовым потоком, FileReader/Writer – для работы с байтами, но не перезатирает старые данные, ImputStreamReader/ OutputStreamWriter - для работы с символьными потоками.

49
Q

Какие классы позволяют ускорить чтение/запись за счет использование буфера?

A

Все классы, в названии которых есть слово буфер: BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream и другие.

50
Q

Класс File, его устройство. Для чего нужен?

A

Данный класс используется для работы с файлами и каталогами на внешних носителях. С содержимым файлов данный класс не работает, но он позволяет создавать, удалять, переименовывать, ограничивать доступ и работать с каталогами, проверяет существует ли файл по указанному пути.

51
Q

Иерархия Collections

A

Вверху интерфейс Iterable, благодаря которому коллекции можно перебирать в цикле форич. Затем идет интерфейс Collections, а от него наследуются List, Set и Queue и немного отдельно от всего этого стоит Map.
Основные реализации Листа – Эрейлист, Линкедлист, Сэта – Хэшсэт, Трисэт и линкедХэшСэт. Линкедлист также реализует интерфейс Queue.
Основные реализации Мар – HashMap, TreeMap и LinkedHashMap , Hashtable.

52
Q

Map. Иерархия. О каждом из них, преимущества и особенности.

A

Map – это интерфейс, который позволяет работать с данными типа ключ-значение. Мы можем складывать в коллекцию значения по ключу, а затем доставать эти значения также по ключу.
У Мара есть много разных реализаций, таких как: abstractmap, hashmap, linkedhashmap, sortedmap, treemap.
Основные реализации:
Hashtable — реализация такой структуры данных, как хэш-таблица. Она не позволяет использовать null в качестве значения или ключа. Hashtable является синхронизированной (почти все методы помечены как synchronized). Из-за этой особенности у неё имеются существенные проблемы с производительностью.
HashMap– это мапа, которая работает на основе механизма хэширования, которая позволяет вычислять хэш на основе ключа и затем эти значения складывать. благодаря механизму хэширования хэшпама работает быстро. Данная коллекция не является упорядоченной: порядок хранения элементов зависит от хэш-функции. Добавление элемента выполняется за константное время O(1), но время удаления, получения зависит от распределения хэш-функции. В идеале является константным, но может быть и линейным O(n).
LinkedHashMap – стоит в иерархии ниже, и добавляет к хэшмапе то, что мы будем хранить наши элементы в порядке их добавления.
TreeMap — реализация Map основанная на красно-чёрных деревьях. Как и LinkedHashMap является упорядоченной. По-умолчанию, коллекция сортируется по ключам с использованием принципа “natural ordering”, но это поведение может быть настроено под конкретную задачу при помощи объекта Comparator, который указывается в качестве параметра при создании объекта TreeMap.

53
Q

HashTable vs HashMap?

A

Двумя основными отличиями HashMap от Hashtable являются то, что HashMap не синхронизирована и HashMap позволяет использовать null как в качестве ключа, так и значения.

54
Q

Подробно о HashMap.

A

HashMap – это мапа, которая работает на основе механизма хэширования, также внутри себя он содержит массив, который в каждом своем элементе содержит линкедлист. В HashMap используются ключи immutable objects. На основе полей считается hash code, который используется для того, чтобы построить HashMap . И если бы ключи были не неизменяемые, то тогда мы могли бы где-то извне изменить наш объект и соответственно изменился бы хэшкод объекта и собственно, когда мы следующий раз будем его доставать, то мы его не найдем, потому что хэшмапа ищет по хэшкоду, а он у нас уже будет другой.
Как это работает: например у нас есть какая-то хэшмапа, мы делаем метод put() и добавляем в нашу мапу какой-то ключ и значение. Для того, чтобы корректно работала хэшмапа мы должны переопределить методы иквелс и хэшкод, чтобы мы могли качественно вычислить хэшкод. После этого мы получаем какое-то число. У мапы есть заданный объем, который равняется 16 элементов, а также показатель загруженности, то есть если загруженность мапы у нас переходит уже какую-то черту, например, 16*0,75=12, то есть когда в нашей мапе уже лежит 12 элементов, тогда нам нужно расширить наш массив, то есть будет происходить создание большего массива, и копирования данных из меньшего, ну и новый ключ будет уже идти в новый массив. При добавлении нового элемента на основании хэшкода ключа вычисляется номер бакета в которой будет расположен элемент. Иногда могут происходить коллизии, когда разные объекты имеют одинаковый хэшкод, тогда они сравниваются по иквелсу. Если они равны по иквелс, то происходит замена элемента, а если нет, то происходит коллизия. он пройдется дальше по элементам, сравнит по иквелсу с другими элементами и если не найдет такого же, то вставляется в мапу.

55
Q

Все об интерфейсе List и его реализациях.

A

List – это интерфейс, реализации которого представляют собой упорядоченные коллекции. Кроме того, разработчику предоставляется возможность доступа к элементам коллекции по индексу и по значению (так как реализации позволяют хранить дубликаты, результатом поиска по значению будет первое найденное вхождение).
Vector — реализация динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Vector не рекомендуется использовать, если не требуется достижения потокобезопасности. В Vector все операции с данными являются синхронизированными (CRUD операции). В качестве альтернативы часто применяется аналог — ArrayList, потому что он быстрее.
ArrayList – это реализация Lista, которая под капотом использует динамический массив. То есть преимущества и недостатки у этой коллекции такие же, как и у массива. Преимущества: доступ по индексу происходит очень быстро, мы точно знаем где хранится наш объект в памяти. Недостаток: вставка происходит долго. надо подвинуть все элементы на n+1. Данную реализацию следует применять, если в процессе работы с коллекцией предполагается частое обращение к элементам по индексу. Из-за особенностей реализации индексное обращение к элементам выполняется за константное время O(1). Но данную коллекцию рекомендуется избегать, если требуется частое удаление/добавление элементов в середину коллекции.
LinkedList – реализация листа, которая построена на двунаправленном связном списке. То есть наши элементы могут находится у нас хаотично в хипе, куче, только они прилинкованы ссылками. Благодаря этому, добавление и удаление из середины, доступ по индексу, значению происходит за линейное время O(n), а из начала и конца за константное. Чтобы найти нам какой-то элемент, нам надо пройти по всему списку сначала, до тех пор, пока не найдешь нужный элемент. Как преимущество, это что из-за того, что они в куче, нам не нужно делать лишних усилий, чтобы вставить элемент. Мы вставляем элемент в место, которое нам нужно, а у соседа справа меняется ссылка next, а слева - ссылка previous и все, мы вставили. Это обеспечено Кью.

56
Q

Какие 2 назначения LinkedList?

A

Он имплементит интерфейс DeQueue. А там, где двунаправленная очередь, там есть альтернативные применения. Из листа можно сделать Stack, LIFO, FIFO.

57
Q

Интерфейс Queue.

A

Этот интерфейс описывает коллекции с предопределённым способом вставки и извлечения элементов, а именно — очереди FIFO (first-in-first-out). Помимо методов, определённых в интерфейсе Collection, определяет дополнительные методы для извлечения и добавления элементов в очередь.

58
Q

В чем отличие коллекций List и Set?

A

В коллекциях List можно хранить сколько угодно одинаковых элементов, в коллекции Set – нельзя. В Set нельзя обращаться к элементам по индексу, то есть у него отсутствуют методы: get(), removeAt(), add() с указанием позиции.

59
Q

Про коллекции Set

A

Set представляет собой неупорядоченную коллекцию, которая не может содержать дублирующиеся данные. Является программной моделью математического понятия «множество».
HashSet — реализация интерфейса Set, базирующаяся на HashMap. Внутри использует объект HashMap для хранения данных. В качестве ключа используется добавляемый элемент, а в качестве значения — объект-пустышка (new Object()). Из-за особенностей реализации элементы добавляются в кучу.
LinkedHashSet — отличается от HashSet только тем, что в основе лежит LinkedHashMap вместо HashMap. Благодаря этому отличию порядок элементов при обходе коллекции является идентичным порядку добавления элементов.
TreeSet — аналогично другим классам-реализациям интерфейса Set содержит в себе объект NavigableMap, что и обуславливает его поведение. Предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием “natural ordering”.

60
Q

Что такое List.sort()?

A

Раньше его не было, а сейчас под капотом Collections.sort() лежит List.sort() и теперь можно использовать лист сорт.
Чтобы использовать List.sort() или Collections.sort(), чтобы корректно отработал этот метод sort(), для нашего объекта нужно реализовать интерфейс Comparable

61
Q

Comparator и Comparable: разница, чем отличается, как реализовать

A

Comparable нужен для сравнения текущего объекта, которому принадлежит метод с рядом стоящим объектом. Чтобы объекты сравнивались правильно, наш класс должен имплементить интерфейс Comparable, переопределить метод compareTo() и прописать как он будет сравнивать собственно эти объекты.
Comparator больше для сравнения множества объектов, например, перебор коллекции какой-нибудь и сортирует ее. Это как будто третья величина, она принимает объект номер 1 и объект номер 2, сравнивает их и возвращает что-то.
По сути они делают тоже самое - сравнивают, разница в том, что использование Comparator позволяет нам избежать добавления дополнительного кода в наши классы домена, а также мы можем определить несколько разных стратегий сравнения, что невозможно при использовании Comparable

62
Q

Iterator. Iterable.

A

Интерфейс Iterable – это интерфейс который располагается в самом верху иерархии коллекций. Он нужен для того, чтобы мы могли проходить по каждому элементу в коллекции циклом foreach. Этот интерфейс содержит только один метод: iterator(), который возвращает объект типа Iterator. При использовании Iterable мы не можем получить элемент по индексу. Точно так же мы не можем получить первый или последний элементы из структуры данных. Чтобы перебрать элементы коллекции с помощью foreacha, нужно чтобы объект, из которого состоит коллекция, реализовывал интерфейс Iterable.
Интерфейс Iterator - интерфейс, который позволяет нам извлекать или удалять элементы из коллекции во время итерации. Кроме того, у него есть два метода, которые помогают перебирать структуру данных и извлекать ее элементы — next() и hasNext() .
Более того, у него есть метод remove() , который удаляет текущий элемент, на который указывает Iterator .
Iterator принадлежит пакету java.util, а Iterable принадлежит пакету java.lang .
Чтобы перебрать элементы коллекции с помощью foreacha, нужно чтобы объект, из которого состоит коллекция, реализовывал интерфейс Iterable.

63
Q

Что такое хэшкод, как он реализован в джаве? Что возвращает метод хэшкод?

A

Хэш-код - это метод класса Object. Он возвращает int-ое число, типа идентификатор объекта, который вычисляется на основе каких-то уникальных характеристик объекта. Он нужен для того чтобы уникально идентифицировать объект, а также используется в структурах данных, которые используют внутри себя механизм хеширования.

64
Q

В каких случаях 2 объекта могут иметь одинаковый хэшкод. Назвать все случаи.

A

1- Так как хэшкод возвращает инт, а у инта есть максимальное значение, то есть собственный диапазон, то есть если мы укажем число слишком большое, то интеджер пойдет сначала с отрицательного лимита, ну и если наша коллекция содержит большие объекты с большими значениями и переполнит наш интежер, то может так выйти, что разные объекты будут иметь одинаковый хэшкод и попадет в одинаковый баскет, хотя по иквелс это будет абсолютно разные объекты.
2 – ошибка в алгоритме

65
Q

Коллизия – что это?

A

Коллизия - это ситуация, когда два или более объекта выдают одно и то же хеш-значение и, следовательно, указывают на одно и то же местоположение в коллекции. Этот сценарий может возникнуть из-за того, что согласно контракту equals и hashCode два неравных объекта в Java могут иметь одинаковый хэш-код.
Это также может произойти из-за конечного размера базового массива, то есть до изменения размера. Чем меньше этот массив, тем выше вероятность коллизии.

66
Q

В чем идея многопоточной среды и что она решает?

A

Многопоточность в Java — это одновременное выполнение двух или более потоков для максимального использования центрального процессора. Каждый поток работает параллельно и не требует отдельной области памяти. К тому же, переключение контекста между потоками занимает меньше времени.
По сути, многопоточность была придумана, чтобы решить две главные задачи:
1. Одновременно выполнять несколько действий и 2. Ускорить вычисления. Тут все намного проще. Если наш процессор имеет несколько ядер, а большинство процессоров сейчас многоядерные, список наших задач могут параллельно решать несколько ядер. Очевидно, что если нам нужно решить 1000 задач и каждая из них решается за секунду, одно ядро справится со списком за 1000 секунд, два ядра — за 500 секунд, три — за 333 с небольшим секунды и так далее.

67
Q

Какие проблемы в многопоточности есть?

A

Deadlock (взаимная блокировка) — ситуация, при которой несколько потоков находятся в состоянии ожидания ресурсов, занятых друг другом, и ни один из них не может продолжать выполнение. Простейший способ избежать взаимной блокировки – не допускать цикличного ожидания, этого можно достичь, получая lock’и в определённом порядке и освобождая их в обратном порядке.
Race condition (состояние гонки) — ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода.

68
Q

Поток-демон – что это?

A

Поток, который уничтожается автоматически после завершения работы всех основных потоков

69
Q

Volatile и связанные с ним проблемы.

A

Модификатор volatile запрещает кэшировать переменную в локальную память потока и говорит, что ее значение нужно брать из основной памяти. Используют в тех случаях, когда к одной переменной идет обращение из разных потоков.
Как только один поток записал что-то в volatile-переменную, значение идёт прямо в общую память и тут же доступно остальным потокам.
Основная проблема - это то, что модификатор volatile никак не ограничивает одновременный доступ к данным. А значит, в работу одного потока с полем может вмешаться другой поток. Если два потока захотят обратиться к переменной и увеличить ее на единицу, то они могут получить неверные данные. Чтобы решить эту проблему возможно нужно синхронизировать потоки, чтобы второй подождал пока монитор занят, например.

70
Q

Что такое принцип happens before?

A

Это значит, что один поток будет в курсе изменений, которые произвел второй поток перед ним с переменной.

71
Q

Synchronized и связанные с ним проблемы.

A

Synchronized - это ключевое слово, которое позволяет заблокировать доступ к методу или части кода, если его уже использует другой поток. Используйте synchronized, чтобы: обеспечить доступ только одного потока к методу или блоку единовременно; обеспечить каждому работающему с ресурсами потоку видимость изменений, внесённых предыдущим потоком; гарантировать, что операции внутри блока или метода будут выполнены полностью, либо не выполнены вовсе.
Недостатком использования synchronized является как раз то, что другие потоки вынуждены ждать, пока нужный объект или метод освободится. Это создает так называемый “bottle neck” (“узкое место”) в программе - и скорость работы может пострадать.

72
Q

Зачем нужна синхронизация??

A

Java поддерживает несколько потоков для выполнения. И это значит, что несколько потоков может обращаться к одному и тому же полю. Синхронизация позволяет выполнять все параллельные потоки синхронно. То есть если нам нужен какой-то объект, мы к нему обращаемся, а второй поток в это время подождет пока мы отпустим монитор и только тогда обратиться к этому же объекту.

73
Q

Способы синхронизации:

A

Существует два применения synchronized - для метода и для блока кода.
synchronized блок:
synchronized(Объект синхронизации){
участок кода, который должен быть синхронизирован;
}

74
Q

Что является объектом синхронизации (монитором) при указании ключевого слова synchronized в сигнатуре?

A

this (или по другому, тот объект, у которого вызывается метод).

75
Q

Можем ли мы остановить поток после запуска?

A

Можем. Метод stop() – не рекомендуется, и метод interrupt() – он не останавливает поток, а устанавливает флаг isIterrupted = true. И нам нужно прописать такую ситуацию, что делать если этот флаг = true.

76
Q

Атомарность

A

Многие проблемы с потоками возникают тогда, когда два потока, используя один метод, мешают друг другу. Они могут менять значения переменных, которые использует другой поток.
Атомарный - значит “неделимый” - в том смысле, что операция может быть завершена одним потоком, и другой не может в ней ничего “напортить”.

77
Q

Почему java memory model важно при работе с многопоточностью?

A

Модель памяти Java отвечает на следующий вопрос: что произойдет, когда несколько потоков изменят одну и ту же ячейку памяти. И ответ, который дает модель памяти: если в программе нет потоков данных, то все выполнения программы будут выглядеть последовательно согласованными.
Модель памяти – это набор правил и указаний, которые позволяют Java программам действовать детерминировано среди множества архитектур памяти, процессора и операционной системы. Это особенно важно в случае многопоточности. Модель памяти предоставляет гарантии того, что изменения, произведённые одной нитью, будут видны для других, одна из них – отношение happens-before (случалось ранее). Это отношение определяет несколько правил, которые позволяют программистам предвидеть и определять поведение параллельных программ

78
Q

Synchronized vs Lock

A

Основные различия между блокировкой и синхронизированным блоком:
1. Synchronized block не дает никаких гарантий относительно последовательности, в которой потокам, ожидающим входа в него, предоставляется доступ.
2.Нельзя передавать какие-либо параметры в запись synchronized block. Таким образом, тайм-аут при попытке получить доступ к synchronized block невозможен.
3. Синхронизированный блок должен полностью содержаться в одном методе. Lock может иметь вызовы для lock() и unlock()в отдельных методах.

79
Q

Что такое пакет java.util.concurrent и почему его ввели?

A

Этот пакет содержит классы формирования блокирующих и неблокирующих очередей для многопоточных приложений. Одна из групп классов это синхронизаторы.
Синхронизаторы – вспомогательные утилиты для синхронизации потоков, которые дают возможность разработчику регулировать и/или ограничивать работу потоков и предоставляют более высокий уровень абстракции, чем основные примитивы языка (мониторы).
Синхронизатор Semaphore реализует шаблон синхронизации Семафор. Чаще всего, семафоры необходимы, когда нужно ограничить доступ к некоторому общему ресурсу.
CountDownLatch (замок с обратным отсчетом) предоставляет возможность любому количеству потоков в блоке кода ожидать до тех пор, пока не завершится определенное количество операций, выполняющихся в других потоках, перед тем как они будут «отпущены», чтобы продолжить свою деятельность.
CyclicBarrier реализует шаблон синхронизации Барьер. Циклический барьер является точкой синхронизации, в которой указанное количество параллельных потоков встречается и блокируется.
Phaser (фазер), как и CyclicBarrier, является реализацией шаблона синхронизации Барьер, но, в отличии от CyclicBarrier, предоставляет больше гибкости.

80
Q

Планировщик потоков

A

это часть JVM, которая решает какой поток должен выполнится в каждый конкретный момент времени и какой поток нужно приостановить. В Джава нет никаких гарантий, когда запущены потоки. Нет гарантий что поток выполниться, нет гарантий, что выполниться в определенной последовательности. Мы можем влиять на потоки методами sleep(), join() - позволяет одному потоку ждать завершения выполнения другого, setPriority() и yield() - уступает место другим потокам, и методами класса обджект – wait(), notify(), notifyAll().

81
Q

Разница между методами start() и run()

A

Метод start() используется для запуска нового потока. Несмотря на то, что start() вызывает метод run() внутри себя, это не то же самое, что просто вызвать run(). Если вы вызываете run() как обычный метод, он вызывается в том же потоке и никакой новый поток не запуститься, что происходит, когда вы вызываете метод start().

82
Q

Что делает join?

A

Приостанавливает поток, которого вызвали этот join, ждет пока второй поток завершит работу, у которого вызвали join.

83
Q

Что делает wait?

A

переводит поток в режим ожидания и отпускает монитор.

84
Q

Что делают notify и notifyAll?

A

оба пробуждают потоки, которые в режиме ожидания. Нотифай пробуждает один поток, а нотифайол – все.

85
Q

Что такое ExecuteService. Для чего он нужен?

A

позволяет решать задачи, используя пул потоков, а также возвращать результат выполнения задачи в виде объекта Future.

86
Q

Чем отличается методы execute() и submit()?

A

Execute() – не возвращает значений и принимает в качестве параметра объект Runnable.
Submit() – возвращает объект Future, из которого можно получить значения используя метод get(). Он принимает в качестве параметра объект типа Collable или Runnable.

87
Q

Отличие Runnable от Callable?

A

Реализуя Runnable нужно переопределить метод run(), который возвращает void.
Callable – переопределяет метод call(), который возвращает значение нужного типа.

88
Q

Что такое сериализация и десериализация?

A

Сериализация – процесс преобразования объекта в поток байтов.
Десериализация – процесс создания объекта из потока байтов. Сериализуются все поля объетов кроме тех, что помечены static и transient.

89
Q

Какие условия должны быть выполнены, чтобы экземпляр класса мог быть сериализован?

A

Реализация интерфейса Serializable или Externalizable.
Все поля класса должны быть сериализуемы или помечены ключевым словом transient.
Все предки должны быть сериализуемы или содержать public конструктор без параметров.

90
Q

Для чего ключевое слово transient?

A

Оно запрещает сериализовать поле.

91
Q

Generics

A

Это параметризированные типы. Они сделали использование Java Collection удобнее и безопаснее. Ошибки, связанные с некорректным использованием типов, теперь обнаруживаются на этапе компиляции. Допустим у нас есть какой-то ArrayList. Если мы не ограничим его дженериками, то в него мы можем набросать объектов разных типов, потому что они все наследуют класс Object, а значит компилятор пропустит это. Но когда мы будем доставать оттуда их и приводить к какому-нибудь определенному типу, то выскочит ошибка несовместимых типов. Собственно, если дженерик есть, то еще на этапе написания кода, компилятор подсветит нам, что мы не можем положить объект типа Integer в коллекцию String-ов, например.
С их помощью можно объявить классы, интерфейсы, методы, где тип данных указан в виде параметров.

92
Q

Что такое Wild Card?

A

<?> - это значит, что тип может быть чем угодно. На них можно также накладывать ограничения с помощью ключевых слов super и extends.

93
Q

Рефлексия.

A

Рефлексия - это механизм исследования данных о программе во время её выполнения. Рефлексия в Java осуществляется с помощью Java Reflection API, состоящий из классов пакетов java.lang и java.lang.reflect. Рефлексия означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.
Сам же механизм рефлексии позволяет обрабатывать типы, отсутствующие при компиляции, но появившиеся во время выполнения программы. Рефлексия и наличие логически целостной модели выдачи информации об ошибках дает возможность создавать корректный динамический код.
Java Reflection API позволяет получать информацию о конструкторах, методах и полях классов и выполнять следующие операции над полями и методами объекта:
определение класса объекта;
получение информации о полях, методах, конструкторах и суперклассах;
получение информации о модификаторах полей и методов;
создание экземпляра класса, имя которого неизвестно до момента выполнения программы;
определение и изменение значений свойств объекта;
вызов методов объекта.

94
Q

SOLID

A

1) Single Responsibility Principle (Принцип единственной ответственности). Для каждого класса должно быть определено единственное назначение. Все ресурсы, необходимые для его осуществления, должны быть инкапсулированы в этот класс и подчинены только этой задаче.
2) Open Closed Principle (Принцип открытости/закрытости). Программные сущности должны быть открыты для расширения, но закрыты для изменений. Это означает, что должна быть возможность изменять внешнее поведение класса, не внося физические изменения в сам класс. Следуя этому принципу, классы разрабатываются так, чтобы для подстройки класса к конкретным условиям применения было достаточно расширить его и переопределить некоторые функции.
3) Liskov’s Substitution Principle (Принцип подстановки Барбары Лисков). Должна быть возможность вместо базового (родительского) типа (класса) подставить любого его наследника, при этом работа программы не должна измениться.
4) Interface Segregation Principle (Принцип разделения интерфейса). Предпочтительнее разделять интерфейсы на более мелкие тематические, чтобы реализующие их классы не были вынуждены определять методы, которые непосредственно в них не используются.
5) Dependency Inversion Principle (Принцип инверсии зависимостей). Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракции. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

95
Q

Паттерны проектирования

A

Порождающие – решают проблемы обеспечения гибкости создания объектов - Factory, Builder, Singleton, Prototype.
Builder — это паттерн, который позволяет создавать сложные объекты пошагово. Builder даёт возможность использовать один и тот же код строительства для получения разных представлений объектов. Паттерн предлагает разбить процесс конструирования объекта на отдельные шаги (например, построитьСтены, вставитьДвери и другие). Чтобы создать объект, вам нужно поочерёдно вызывать методы строителя. Причём не нужно запускать все шаги, а только те, что нужны для производства объекта определённой конфигурации.
Factory — это паттерн, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
Singleton — это паттерн, который гарантирует, что у класса есть только один экземпляр объекта на всё приложение, и предоставляет к нему глобальную точку доступа.
Prototype — это паттерн, который позволяет копировать объекты, не вдаваясь в подробности их реализации. Паттерн Prototype поручает создание копий самим копируемым объектам. Он вводит общий интерфейс для всех объектов, поддерживающих клонирование. Это позволяет копировать объекты, не привязываясь к их конкретным классам. Обычно такой интерфейс имеет всего один метод clone().
Реализация этого метода в разных классах очень схожа. Метод создаёт новый объект текущего класса и копирует в него значения всех полей собственного объекта. Так получится скопировать даже приватные поля, так как большинство языков программирования разрешает доступ к приватным полям любого объекта текущего класса.
Объект, который копируют, называется прототипом (откуда и название паттерна). Когда объекты программы содержат сотни полей и тысячи возможных конфигураций, прототипы могут служить своеобразной альтернативой созданию подклассов.
Структурные – решают проблемы эффективного построения связей между объектами – Proxy, Decorator, Adapter, Bridge, Facade.
Proxy - этот паттерн помогает решить проблемы, связанные с контролируемым доступом к объекту.
Decorator — это паттерн, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
Adapter — это паттерн, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Bridge — это паттерн, который разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.
Facade — это паттерн, который предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.
Поведенческие – решают проблемы эффективного взаимодействия между объектами – Strategy, Command, Iterator, State, Visitor, Observer.
Strategy - это паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменяемыми. Другие объекты содержат ссылку на объект-стратегию и делегируют ей работу. Программа может подменить этот объект другим, если требуется иной способ решения задачи.
Command — это паттерн, позволяющий заворачивать запросы или простые операции в отдельные объекты.
Это позволяет откладывать выполнение команд, выстраивать их в очереди, а также хранить историю и делать отмену.
Iterator — это паттерн, позволяющий последовательно обходить сложную коллекцию, без раскрытия деталей её реализации.
State - это паттерн, который позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.
Visitor - это паттерн, который позволяет добавлять в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.
Observer - это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.

96
Q

Память: стэк, хип, пул строк. Где что хранится.

A

Обычно память делится на две большие части: область стека (stack) и область кучи (heap)
Стек работает по схеме LIFO (последним вошел, первым вышел). Всякий раз, когда вызывается новый метод, содержащий примитивные значения или ссылки на объекты, то на вершине стека под них выделяется блок памяти. Из этого можно сделать вывод, что стек хранит значения примитивных переменных, создаваемых в методах, а также ссылки на объекты в куче на которые ссылается метод.
Другие особенности стека:
Он заполняется и освобождается по мере вызова и завершения новых методов;
Переменные в стеке существуют до тех пор, пока выполняется метод, в котором они были созданы;
Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError;
Доступ к этой области памяти осуществляется быстрее, чем к куче;
Является потокобезопасным, поскольку для каждого потока создается свой отдельный стек.
Куча используется для динамического выделения памяти для объектов и классов JRE во время выполнения. Новые объекты всегда создаются в куче, а ссылки на них хранятся в стеке.
Эти объекты имеют глобальный доступ и могут быть получены из любого места программы.
Куча разбита на несколько более мелких частей, называемых поколениями:
Young Generation — область где размещаются недавно созданные объекты. Когда она заполняется, происходит быстрая сборка мусора
Old (Tenured) Generation — здесь хранятся долгоживущие объекты. Когда объекты из Young Generation достигают определенного порога «возраста», они перемещаются в Old Generation
Permanent Generation — эта область содержит метаинформацию о классах и методах приложения, но начиная с Java 8 данная область памяти была упразднена.

97
Q

Как работает сборщик мусора.

A

Сборка мусора в Java автоматически выделяет и освобождает память, поэтому разработчикам не нужно писать отдельную программу для управления памятью, что является одним из основных преимуществ программирования на Java. Каждый раз, когда Java-программа запускается на JVM, объекты создаются в куче (heap) и представляют собой часть памяти, предназначенную для программы. Со временем некоторые предметы больше не понадобятся. Сборщик мусора находит эти неиспользуемые объекты и удаляет их, чтобы освободить память. Сборщик мусора, оценив кучу памяти, определит, какие объекты используются, а какие нет, и удалит неиспользуемые объекты. Используемый объект или объект, на который имеется ссылка, означает, что некоторая часть вашей программы все еще поддерживает указатель на этот объект. Если объект уже не используется или, на него нет ссылок, то какая-либо часть программы на него больше не будет ссылаться. Таким образом, память, которая используется объектом, на который нет ссылки, может быть освобождена путем выполнения сборки мусора.
Освобождение памяти можно описать тремя основными процессами:
1. Маркировка.
2. Обычное удаление.

  1. Удаление с уплотнением.
    Маркировка — это процесс идентификации частей памяти, которые используются и не используются сборщиком мусора. Обычно маркировка является первым этапом.
    Обычное удаление — процесс удаления объектов, на которые нет ссылок, с оставлением в свободном пространстве объектов и указателей, на которые есть ссылки.
    Удаление с уплотнением — помимо удаления объектов, на которые нет ссылок, оно сжимает оставшиеся объекты, на которые имеются ссылки, перемещая объекты вместе, чтобы сделать новое выделение памяти намного проще и быстрее.
98
Q

Фичи из 15-16 java?

A
  1. Records – представляют классы, которые предназначены для создания контейнеров неизменяемых данных. Кроме того, records позволяют упростить разработку, сократив объем кода. Заранее определяем какие поля и методы будут в классе, чтобы не перегружать их однотипной ненужной информацией. Следует учитывать, что мы не можем наследовать запись record от других классов. Также нельзя наследовать классы от records. Однако классы record могут реализовать интерфейсы. Кроме того, классы record не могут быть абстрактными.;
  2. Текстовые блоки, позволяет писать большие тексты проще;
  3. Статические члены внутренних классов – то есть во внутреннем классе мы можем создать статическую переменную или еще один внутренний класс статический;
  4. Изолированные типы – это значит, что мы разрешаем наследоваться или реализовывать наш класс или интерфейс только перечисленным классам. используются слово sealed перед словом class и после extends или имплементс идет ключевое слово permits и перечисляются классы, которым доступно наследование;
  5. Новый свитч экспрешн.