diff --git a/README.md b/README.md index 17ff0b3..472e92e 100644 --- a/README.md +++ b/README.md @@ -834,7 +834,6 @@ + [Top Spring Framework Interview Questions](https://www.baeldung.com/spring-interview-questions) + [Spring Interview Questions](https://www.interviewbit.com/spring-interview-questions/) + [Hibernate Interview Questions](https://www.adaface.com/blog/hibernate-interview-questions/) -+ [Hibernate Interview Questions](https://www.adaface.com/blog/hibernate-interview-questions/) + [Java Interview Questions](https://labex.io/interview-questions/java) [к оглавлению](#Вопросы-для-собеседования-на-java-developer) diff --git a/core.md b/core.md index f7b6100..bbf189e 100644 --- a/core.md +++ b/core.md @@ -1289,7 +1289,7 @@ public native int hashCode(); [к оглавлению](#java-core) ## Можно ли так реализовать метод `equals(Object that) {return this.hashCode() == that.hashCode()}`? -Строго говоря нельзя, поскольку метод `hashCode()` не гарантирует уникальность значения для каждого объекта. Однако для сравнения экземпляров класса `Object` такой код допустим, т.к. метод `hashCode()` в классе `Object` возвращает уникальные значения для разных объектов (его вычисление основано на использовании алгоритма генерации случайных чисел). +Строго говоря нельзя, поскольку метод `hashCode()` не гарантирует уникальность значения для каждого объекта. Для сравнения экземпляров класса `Object` такой код также недопустим, т.к. стандартный метод `hashCode()` в классе `Object` даже при использовании алгоритма генерации случайных чисел не гарантирует уникальные значения для разных объектов из-за ограниченности диапазона чисел int. [к оглавлению](#java-core) diff --git a/db.md b/db.md index 3f7aa80..32aae03 100644 --- a/db.md +++ b/db.md @@ -179,7 +179,7 @@ __По количественному составу__ __По характеристике содержимого__ + _уникальный индекс_ состоит из множества уникальных значений поля; -+ _плотный индекс_ (NoSQL) — индекс, при котором, каждом документе в индексируемой коллекции соответствует запись в индексе, даже если в документе нет индексируемого поля. ++ _плотный индекс_ (NoSQL) — индекс, при котором, каждому документу в индексируемой коллекции соответствует запись в индексе, даже если в документе нет индексируемого поля. + _разреженный индекс_ (NoSQL) — тот, в котором представлены только те документы, для которых индексируемый ключ имеет какое-то определённое значение (существует). + _пространственный индекс_ — оптимизирован для описания географического местоположения. Представляет из себя многоключевой индекс состоящий из широты и долготы. + _составной пространственный индекс_ — индекс, включающий в себя кроме широты и долготы ещё какие-либо мета-данные (например теги). Но географические координаты должны стоять на первом месте. diff --git a/images/SQL/Placeholder.txt b/images/SQL/Placeholder.txt index a9b4ab1..8b13789 100644 --- a/images/SQL/Placeholder.txt +++ b/images/SQL/Placeholder.txt @@ -1 +1 @@ -Images for SQL + diff --git a/java8.md b/java8.md index 904d885..f430b6a 100644 --- a/java8.md +++ b/java8.md @@ -230,7 +230,7 @@ public static void main(String[] args) { ## Какие виды ссылок на методы вы знаете? + на статический метод; + на метод экземпляра; -+ на конструкторе. ++ на конструктор. [к оглавлению](#java-8) diff --git a/jcf.md b/jcf.md index d856cd9..9e9dcf2 100644 --- a/jcf.md +++ b/jcf.md @@ -883,7 +883,7 @@ __Один__ новый объект статического вложенног [к оглавлению](#java-collections-framework) ## Как перебрать все пары «ключ-значение» в `Map`? -Использовать метод `entrySet()`, который возвращает множество `Set` пар «ключ-значение». +Использовать метод `entrySet()`, который возвращает множество `Set>` пар «ключ-значение». [к оглавлению](#java-collections-framework) diff --git a/jdbc.md b/jdbc.md index 3211f10..56754a6 100644 --- a/jdbc.md +++ b/jdbc.md @@ -190,9 +190,9 @@ __Уровень изолированности транзакций__ — зн Объекты-носители интерфейсов создаются при помощи методов объекта `java.sql.Connection`: -+ `java.sql.createStatement()` возвращает объект _Statement_; -+ `java.sql.prepareStatement()` возвращает объект _PreparedStatement_; -+ `java.sql.prepareCall()` возвращает объект _CallableStatement_; ++ `java.sql.Connection.createStatement()` возвращает объект _Statement_; ++ `java.sql.Connection.prepareStatement()` возвращает объект _PreparedStatement_; ++ `java.sql.Connection.prepareCall()` возвращает объект _CallableStatement_; [к оглавлению](#jdbc) diff --git a/oop.md b/oop.md index 8464512..50209c4 100644 --- a/oop.md +++ b/oop.md @@ -363,10 +363,49 @@ __«имеет»__ подразумевает ассоциацию (агрега ## В чем разница между _композицией_ и _агрегацией_? Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое». -Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых. +_Композиция_ — вложенный объект не может существовать без владельца (владелец создает и уничтожает его): ->Например, книга состоит из страниц, и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция. -В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация. +```java +class Engine { + private final int horsepower; + + Engine(int horsepower) { + this.horsepower = horsepower; + } +} + +class Car { + private final Engine engine; // Engine живёт и умирает вместе с Car + + Car(int horsepower) { + this.engine = new Engine(horsepower); // Car сам создаёт Engine + } +} +``` + +_Агрегация_ — вложенный объект существует независимо, передается извне: + +```java +class Driver { + private final String name; + + Driver(String name) { + this.name = name; + } +} + +class Car { + private Driver driver; // Driver может существовать без Car + + Car(Driver driver) { + this.driver = driver; // Car получает Driver извне + } +} +``` + +Коротко: если `new` внутри класса — композиция, если объект приходит снаружи — агрегация. + +Предпочтительнее использовать агрегацию и внедрять зависимости через конструктор. Это автоматически делает код тестируемым и следует принципу Dependency Inversion из SOLID. Композицию стоит применять, когда есть чёткая причина "спрятать" создание объекта внутрь класса. [к оглавлению](#ООП)