Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
41 photos
3 videos
1.13K links
Download Telegram
Какие есть уровни изоляции транзакций ?
Спросят с вероятностью 12%

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

1️⃣ READ UNCOMMITTED (Чтение незафиксированных данных)

На этом уровне транзакции могут читать данные, которые ещё не были зафиксированы (commit) другими транзакциями. Это означает, что возможно "грязное чтение", когда одна транзакция видит промежуточные результаты работы другой незавершённой транзакции, которые могут быть впоследствии откачены (rollback).

2️⃣ READ COMMITTED (Чтение зафиксированных данных)

Транзакция на этом уровне изоляции видит только данные, зафиксированные к моменту начала операции чтения. Это предотвращает грязное чтение, но всё ещё допускает "неповторяющееся чтение", когда во время выполнения транзакции другие транзакции могут изменять данные, и повторный запрос к базе данных вернёт другой результат.

3️⃣ REPEATABLE READ (Повторяемое чтение)

На этом уровне изоляции транзакция видит только данные, зафиксированные до её начала, и предотвращается изменение данных, которые она уже прочитала, другими транзакциями. Это устраняет проблему неповторяющегося чтения. Однако на этом уровне всё ещё возможно "фантомное чтение", когда в результате выполнения других транзакций изменяется набор строк, соответствующих условию запроса.

4️⃣ SERIALIZABLE (Сериализуемость)

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

Выбор уровня изоляции транзакции зависит от требований к консистентности данных и допустимого уровня параллелизма. Более высокий уровень изоляции увеличивает надёжность и консистентность данных, но может снижать производительность и масштабируемость системы из-за увеличения числа блокировок и ожидания.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍27🔥41
🤔 Какой метод не является частью класса `java.lang.Object`?
Anonymous Quiz
14%
finalize()
8%
equals(Object obj)
9%
clone()
69%
extend()
👍87👀2🎉1👾1
В чем взаимосвязь контракта equals и hashCode ?
Спросят с вероятностью 12%

В Java взаимосвязь контракта equals() и hashCode() имеет ключевое значение для корректной работы коллекций, особенно для тех, которые используют хеширование, таких как HashSet, HashMap, Hashtable и другие. Эти методы определены в классе Object, и их поведение можно переопределить в пользовательских классах для достижения необходимой логики сравнения и хеширования объектов.

Контракт equals()

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

Контракт hashCode()

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

Взаимосвязь контрактов

Основная взаимосвязь между equals() и hashCode() заключается в следующих правилах:

1️⃣Если два объекта равны по методу equals(Object obj), то их хеш-коды, возвращаемые методом hashCode ?
Сп также должны быть равны. Это необходимо для корректной работы хеш-таблиц, так как обеспечивает, что равные объекты будут находиться в одной и той же "корзине" или иметь одинаковый индекс хеширования.

2️⃣Если хеш-коды двух объектов различны, объекты точно не равны. Это следует из того, что разные хеш-коды указывают на различие объектов. Однако, обратное не всегда верно: два объекта могут иметь одинаковый хеш-код и при этом не быть равными по equals(), что называется коллизией хеш-кодов.

Пример:

В классе, где переопределяется метод equals(), должен быть переопределен и метод hashCode(), чтобы поддерживать описанный контракт:
public class Person {
private String name;
private int age;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}


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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍273
Что такое партиционирование ?
Спросят с вероятностью 12%

Партиционирование в контексте баз данных и систем хранения данных — это процесс разделения таблиц, индексов или других структур данных на более мелкие, управляемые части, называемые партициями. Цель — улучшить производительность и облегчить управление данными за счёт сокращения объёма данных, обрабатываемых в одном запросе, и оптимизации хранения данных.

Типы:

1️⃣ Партиционирование по диапазону (Range Partitioning): Данные разделяются на партиции в соответствии с диапазонами значений определённого столбца или столбцов. Например, таблицу заказов можно разделить на партиции по месяцам или годам.

2️⃣ Партиционирование по списку (List Partitioning): Данные разделяются на основе заранее определённого списка значений. Например, таблицу пользователей можно разделить на партиции по странам, где каждая партиция соответствует конкретной стране.

3️⃣ Партиционирование по хэшу (Hash Partitioning): Данные распределяются по партициям на основе хэш-функции от значения ключа партиционирования. Этот метод позволяет равномерно распределить данные по партициям, даже если распределение ключей не равномерно.

4️⃣ Композитное партиционирование (Composite Partitioning): Комбинация нескольких методов партиционирования. Например, сначала данные могут быть разделены по диапазону дат, а затем каждая партиция по дате может быть дополнительно разделена по хэшу идентификатора пользователя.

Преимущества:

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

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍14
Почему нельзя сравнивать объекты через «==» ?
Спросят с вероятностью 12%

Сравнение объектов с использованием оператора == проверяет, ссылаются ли две ссылки на один и тот же объект в памяти, а не сравнивает их содержимое. То есть, если две переменные ссылаются на разные объекты, даже если содержимое этих объектов одинаково, он вернёт false.

Пример
String str1 = new String("Java");
String str2 = new String("Java");

System.out.println(str1 == str2); // Выведет "false", потому что str1 и str2 указывают на разные объекты в памяти


В этом примере, несмотря на то что текстовое содержимое str1 и str2 одинаково ("Java"), оператор == вернет false, потому что str1 и str2 — это разные объекты в памяти.

Правильное сравнение объектов

Следует использовать метод .equals(), который предназначен для сравнения содержимого объектов. Большинство классов в стандартной библиотеке и пользовательские классы должны переопределять метод .equals() для обеспечения корректного сравнения значений объектов.
String str1 = new String("Java");
String str2 = new String("Java");

System.out.println(str1.equals(str2)); // Выведет "true", потому что содержимое объектов одинаково


В этом случае метод .equals() сравнивает значения строк, а не их ссылки, и возвращает true, потому что текстовое содержимое str1 и str2 действительно одинаково.

Использование == для сравнения объектов не является корректным подходом, когда необходимо сравнить их содержимое, поскольку он сравнивает только ссылки на объекты. Для сравнения содержимого объектов следует использовать метод .equals(), который должен быть корректно переопределен в классе объектов, которые предполагается сравнивать.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍22🔥2
В чем разница char и varchar ?
Спросят с вероятностью 12%

CHAR и VARCHAR являются типами данных в системах управления базами данных (СУБД), используемыми для хранения символьных строк. Основное различие между ними заключается в способе хранения и обработки данных.

CHAR

Предназначен для хранения строк фиксированной длины. Когда строка меньше заданной длины сохраняется в столбце данного типа, она дополняется пробелами до требуемой длины. Если строка превышает заданную длину, она обрезается (в зависимости от настроек СУБД).

Преимущества: Быстродействие при выборке данных из-за фиксированной длины строк, что упрощает индексацию и поиск.
Недостатки: Может привести к неэффективному использованию пространства, если фактическая длина строк существенно меньше заданной.

VARCHAR

Используется для хранения строк переменной длины. Строки, сохраняемые в столбце такого типа, занимают столько места, сколько необходимо для их хранения, плюс дополнительное пространство для хранения информации о длине строки. Это позволяет экономить пространство, особенно при работе со строками, длина которых сильно варьируется.

Преимущества: Эффективное использование пространства, так как хранит только фактические данные без лишних заполнителей.
Недостатки: Может быть немного медленнее CHAR при обработке из-за дополнительных затрат на хранение и обработку информации о длине строки.

Выбор между CHAR и VARCHAR

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

Выбор подходящего типа данных зависит от конкретных требований к хранению данных, производительности и использованию дискового пространства в вашем приложении или базе данных.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍26
Какие виды join есть ?
Спросят с вероятностью 19%

Существует несколько видов операций соединения (JOIN), которые позволяют объединять строки из двух или более таблиц на основе связанных между ними столбцов. Вот его основные виды:

INNER JOIN

- Возвращает строки, когда существует хотя бы одно совпадение в обеих таблицах. Если в одной из таблиц нет совпадений, строки из этой таблицы не включаются в результат.
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;


LEFT JOIN (или LEFT OUTER JOIN)

- Возвращает все строки из левой таблицы и совпавшие строки из правой таблицы. Если совпадений в правой таблице нет, результат будет содержать NULL в столбцах правой таблицы.
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;


RIGHT JOIN (или RIGHT OUTER JOIN)

- Возвращает все строки из правой таблицы и совпавшие строки из левой таблицы. Если совпадений в левой таблице нет, результат будет содержать NULL в столбцах левой таблицы.
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;


FULL JOIN (или FULL OUTER JOIN)

- Возвращает строки, когда существует хотя бы одно совпадение в любой из таблиц. Если нет совпадений, результат будет содержать NULL как в столбцах левой, так и в столбцах правой таблицы для этих строк.
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
FULL JOIN Customers ON Orders.CustomerID = Customers.CustomerID;


CROSS JOIN

- Возвращает декартово произведение всех строк из левой таблицы на все строки из правой таблицы. Этот тип соединения не требует указания условия соединения и может привести к очень большому объему результата, если таблицы содержат много строк.
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
CROSS JOIN Customers;


SELF JOIN

- Не является отдельным типом, а скорее методикой, при которой таблица соединяется сама с собой, как бы будучи двумя разными таблицами. Это полезно для выполнения операций сравнения внутри одной и той же таблицы.
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2
FROM Customers A, Customers B
WHERE A.CustomerID < B.CustomerID;


Каждый тип JOIN используется в зависимости от требуемых в запросе данных и логики их соединения.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍225🔥2
В чём различие между LeftJoin , RightJoin и InnerJoin ?
Спросят с вероятностью 12%

LEFT JOIN, RIGHT JOIN и INNER JOIN являются операциями соединения таблиц, каждая из которых используется для объединения строк из двух или более таблиц на основе связанных столбцов между ними. Различие между этими типами соединений заключается в том, какие строки выбираются для включения в результаты запроса.

INNER JOIN

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

Пример:
Если у нас есть две таблицы, ТаблицаA и ТаблицаB, и мы используем INNER JOIN по столбцу id, то в результат попадут только те строки, для которых найдется соответствие в обеих таблицах.

LEFT JOIN (или LEFT OUTER JOIN)

Возвращает все строки из левой таблицы (ТаблицаA), а также соответствующие строки из правой таблицы (ТаблицаB). Если совпадение в правой таблице не найдено, результат будет содержать NULL на месте столбцов правой таблицы.

Этот тип соединения полезен, когда нужно сохранить все строки из одной таблицы, даже если соответствия в другой таблице не найдены.

RIGHT JOIN (или RIGHT OUTER JOIN)

Работает аналогично LEFT JOIN, но возвращает все строки из правой таблицы (ТаблицаB), а также соответствующие строки из левой таблицы (ТаблицаA). Если совпадение в левой таблице не найдено, результат будет содержать NULL на месте столбцов левой таблицы.

Этот тип соединения используется реже и часто может быть заменён на LEFT JOIN путём изменения порядка таблиц в запросе.

INNER JOIN используется для получения строк с совпадениями в обеих таблицах.
LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы; если соответствий нет, вместо столбцов правой таблицы будут NULL.
RIGHT JOIN возвращает все строки из правой таблицы и соответствующие строки из левой таблицы; если соответствий нет, вместо столбцов левой таблицы будут NULL.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍101
🤔 Какой паттерн проектирования позволяет создавать семейства связанных объектов без конкретизации их классов?
Anonymous Quiz
18%
Factory Method
66%
Abstract Factory
6%
Builder
9%
Prototype
👍22
Что такое hibernate ?
Спросят с вероятностью 19%

Hibernate — это популярный фреймворк для объектно-реляционного отображения (ORM). Он предоставляет прозрачный слой для маппинга (отображения) объектно-ориентированных моделей данных на традиционные реляционные базы данных. Он облегчает разработку приложений, автоматизируя и скрывая многие сложности, связанные с взаимодействием с базой данных, такие как установление соединения, выполнение SQL-запросов и обработка результатов.

Основные особенности Hibernate:

1️⃣ Упрощение разработки: Автоматизирует большую часть кода, который традиционно необходимо писать вручную для работы с базой данных, такого как SQL-запросы и обработка JDBC-результата. Это позволяет разработчикам сосредоточиться на бизнес-логике приложения.

2️⃣ Поддержка объектно-реляционного отображения: Предоставляет богатые возможности для маппинга сложных иерархий объектов Java в реляционные таблицы базы данных, включая наследование, композицию, ассоциации (один-к-одному, один-ко-многим, многие-ко-многим).

3️⃣ Независимость от базы данных: Обеспечивает независимость от конкретной СУБД, благодаря чему те же самые объектные модели и бизнес-логика могут использоваться с различными базами данных без изменения кода.

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

5️⃣ Управление транзакциями и сессиями: Управляет сессиями и транзакциями, обеспечивая гибкость и надежность в обработке данных.

6️⃣ HQL и Criteria API: Hibernate Query Language (HQL) — это объектно-ориентированный язык запросов, аналогичный SQL, но работающий с объектами, а не с таблицами. Criteria API предоставляет программный способ составления запросов через вызовы методов, что делает код более читаемым и безопасным от SQL-инъекций.

7️⃣ Аннотации и XML: Позволяет настраивать маппинг как с использованием XML-файлов, так и через аннотации в коде, что упрощает конфигурацию и делает её более наглядной.

Hibernate значительно упрощает разработку Java EE-приложений, автоматизируя рутинную работу по взаимодействию с базой данных и позволяя сосредоточиться на создании сложной логики приложения.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍28
Что такое HashMap ?
Спросят с вероятностью 25%

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

Как работает HashMap

Когда пара ключ-значение добавляется в нее, ключ проходит через хеш-функцию, которая вычисляет индекс в массиве, где должно быть хранится значение. Этот процесс позволяет ей эффективно находить значение по ключу, обеспечивая доступ за константное время O(1) в идеальном случае. Однако, в случае коллизий хеш-функций (когда разные ключи имеют одинаковый хеш-код и, следовательно, могут быть отнесены к одному и тому же индексу массива), она использует структуру данных "связный список" или "красно-черное дерево" (начиная с Java 8) для хранения всех пар ключ-значение, относящихся к одному индексу. Это немного замедляет процесс поиска до O(log n) для красно-черного дерева в худшем случае.

Особенности HashMap

- Не гарантирует порядка элементов: Порядок хранения элементов не гарантирован, и при добавлении новых элементов порядок может измениться.
- null значения: Позволяет использовать null как ключ и как значение, но только один null ключ, в то время как значений null может быть много.
- Несинхронизированность: По умолчанию не является потокобезопасной. Если несколько потоков одновременно доступают к ней и хотя бы один из потоков изменяет карту, это должно быть синхронизировано внешним образом.
import java.util.HashMap;

public class Example {
public static void main(String[] args) {
// Создание HashMap
HashMap<String, Integer> map = new HashMap<>();

// Добавление элементов в HashMap
map.put("Ключ1", 100);
map.put("Ключ2", 200);
map.put("Ключ3", 300);

// Получение значения по ключу
int value = map.get("Ключ2"); // 200

// Проверка наличия ключа или значения
boolean keyExists = map.containsKey("Ключ1"); // true
boolean valueExists = map.containsValue(300); // true

// Удаление элемента
map.remove("Ключ3");
}
}



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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍28
Что такое нормализация баз данных ?
Спросят с вероятностью 31%

ExecutorService – это интерфейс из пакета java.util.concurrent, который предоставляет фреймворк для асинхронного выполнения задач. Он позволяет управлять потоками и задачами без необходимости явно создавать и управлять потоками руками. Это делает код более читаемым, упрощает работу с многопоточностью и повышает производительность приложения.

Зачем он нужен?

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

Как он используется?

Может быть создан через статические методы класса Executors, например, newFixedThreadPool(int), newCachedThreadPool(), newSingleThreadExecutor(), которые позволяют создавать пулы потоков с фиксированным числом потоков, кэширующие пулы потоков (создают новые потоки по необходимости и переиспользуют старые, когда они освобождаются) и пулы для выполнения задач последовательно в одном потоке соответственно.

После его создания, можно отправлять задачи на выполнение, используя методы execute(Runnable) для задач без результата или submit(Callable<T>) для задач, возвращающих результат. Он также предоставляет методы для управления состоянием выполнения, например, shutdown() для остановки приема новых задач и завершения уже запущенных.

Пример:
ExecutorService executor = Executors.newFixedThreadPool(10); // Создаем пул из 10 потоков

executor.submit(() -> {
// Задача, выполняемая в одном из потоков пула
System.out.println("Асинхронная задача " + Thread.currentThread().getName());
});

executor.shutdown(); // Завершаем работу ExecutorService после выполнения всех задач


ExecutorService – это мощный инструмент для управления асинхронными задачами и потоками в Java. Он упрощает работу с многопоточностью, позволяя эффективно использовать системные ресурсы и упрощает код, делая его более читаемым и поддерживаемым.

ExecutorService помогает организовать выполнение задач в пуле потоков, управлять этими потоками и обрабатывать результаты выполнения задач.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
😁42👀12🤯51👍1
🤔 Какой интерфейс в Java используется для сортировки пользовательских объектов?
Anonymous Quiz
42%
Comparable
47%
Comparator
8%
Iterable
3%
Serializable
👍8🤯8😁1
В чем разница меду hashmap и hashtable ?
Спросят с вероятностью 19%

HashMap и Hashtable являются двумя структурами данных, предназначенными для хранения данных в форме пар "ключ-значение", но между ними есть несколько ключевых отличий:

Синхронизация

- Hashtable является потокобезопасным благодаря синхронизации методов. Это означает, что он безопасно использовать в многопоточных приложениях без внешней синхронизации.
- HashMap не является потокобезопасным и не обеспечивает синхронизацию методов. Это делает его более быстрым в средах с однопоточным доступом. Для использования в многопоточных приложениях необходимо обеспечивать внешнюю синхронизацию или использовать ConcurrentHashMap.

Null значения

- HashMap позволяет один его ключ и множество его значений.
- Hashtable не позволяет такой ключи и такие значения. Попытка вставить его в Hashtable приведет к выбросу NullPointerException.

Наследование

- HashMap является частью новой коллекционной фреймворка, введенной в Java 2, и наследует абстрактный класс AbstractMap.
- Hashtable была введена в ранних версиях Java и наследует класс Dictionary. Хотя она была реорганизована в коллекционный фреймворк, она считается устаревшей для нового кода.

Итератор и Enumerator

- HashMap предоставляет итераторы, которые используются для перебора элементов. Итераторы HashMap являются fail-fast, что означает, что они выбросят ConcurrentModificationException, если структура HashMap будет изменена в любое время после создания итератора, кроме его собственных методов remove.
- Hashtable предоставляет как итератор, так и Enumerator. Enumerator для Hashtable не является fail-fast.

Производительность

- HashMap обычно предлагает лучшую производительность в сравнении с Hashtable, поскольку отсутствие синхронизации делает его быстрее.

Резюме

- Используйте HashMap для не потокобезопасных реализаций без null ключей и значений.
- Используйте Hashtable в многопоточных приложениях, где требуется потокобезопасность и отсутствие null ключей и значений.
- В современном Java коде предпочтение обычно отдается ConcurrentHashMap для потокобезопасных реализаций и HashMap для остальных случаев за счет лучшей производительности и более широкой функциональности.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍25😁2🤔1
Почему Singleton называют антипаттерном ?
Спросят с вероятностью 19%

Синглтон (Singleton) часто упоминается как антипаттерн по нескольким причинам, связанным с его использованием и влиянием на дизайн ПО. Хотя он предназначен для обеспечения глобального доступа к единственному экземпляру класса, его применение может привести к различным проблемам:

1️⃣ Тестирование: Может затруднять модульное тестирование, поскольку использование глобального состояния означает, что тесты могут влиять друг на друга через изменения его состояния. Это делает тесты менее независимыми и предсказуемыми.

2️⃣ Управление зависимостями: Скрывает зависимости классов, использующих его, что затрудняет понимание, тестирование и изменение кода, так как связи между компонентами не являются явными.

3️⃣ Гибкость использования: Ограничивает гибкость, так как он фиксирует решение использовать один и только один экземпляр класса. В будущем может возникнуть необходимость в использовании нескольких экземпляров, и изменение синглтона на поддержку этой возможности может быть затруднительным.

4️⃣ Многопоточность: В многопоточных приложениях необходимо тщательно управлять созданием единственного его экземпляра, чтобы избежать одновременного создания нескольких экземпляров. Это требует дополнительной синхронизации, которая может снизить производительность.

5️⃣ Расширяемость и наследование: Как правило, сложно расширять через наследование, и любые изменения в его реализации могут повлиять на всё приложение.

Из-за этих проблем рекомендуется обдумывать применение синглтона и рассматривать альтернативы, такие как использование паттернов проектирования "Фабрика" (Factory), "Внедрение зависимостей" (Dependency Injection, DI) и "Сервис-локатор" (Service Locator), которые могут предложить большую гибкость, лучшее управление зависимостями и более простое тестирование.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍233
Forwarded from easyoffer
Канал приближается к 20к подписчиков, а здесь так и нет нормального контент плана 😒

Ищу талантливых журналистов, способных писать клевые и авторские посты на тему "Карьера в IT" и все что с этим связано: поиск работы, повышение з/п, разбор кейсов, переезд в другие страны по рабочим визам, аналитика, исследование рынка и т.д.

Важно глубокое понимание IT индустрии, вы должны иметь опыт работы в ней

Если интересно отправьте мне свое резюме @kivaiko
👾2
Какие примитивные типы данных есть ?
Спросят с вероятностью 25%

Есть восемь примитивных типов данных, каждый из которых предназначен для хранения определенного рода простых значений. Вот они:

1️⃣ byte: 8-битное целое число со знаком. Может принимать значения от -128 до 127. Используется для экономии памяти в массивах, вместо int, когда уверены в том, что значение будет в указанном диапазоне.

2️⃣ short: 16-битное целое число со знаком. Может принимать значения от -32,768 до 32,767. Также используется для экономии памяти в больших массивах.

3️⃣ int: 32-битное целое число со знаком. Может принимать значения от -2^31 до 2^31-1. Это самый часто используемый тип для целых чисел.

4️⃣ long: 64-битное целое число со знаком. Может принимать значения от -2^63 до 2^63-1. Используется, когда значение int не достаточно для хранения больших целых чисел.

5️⃣ 32-битное число с плавающей точкой одинарной точности. Используется для представления чисел с дробной частью, когда не требуется большая точность.

6️⃣ double: 64-битное число с плавающей точкой двойной точности. Это стандартный выбор для представления десятичных чисел, так как обеспечивает более высокую точность по сравнению с float.

7️⃣ char: 16-битный тип данных, представляющий одиночный символ в Unicode. Может хранить любой символ, например, букву или цифру.

8️⃣ boolean: логический тип данных, который может принимать только два возможных значения: true (истина) или false (ложь). Используется для простых флагов, которые отслеживают истинные/ложные условия.

Каждый примитивный тип данных имеет свою обертку в библиотеке классов, позволяющую использовать примитивные типы как объекты. Например, int имеет обертку Integer, double имеет обертку Double и так далее. Это позволяет использовать примитивные типы в коллекциях, таких как ArrayList, и предоставляет ряд полезных методов.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍21🔥32