Вопросы 131-140 для новичков и опытных разработчиков
Ответ: HashSet - это класс в Java Collection Framework, который реализует интерфейс Set и хранит только уникальные элементы. Он использует хеш-таблицу внутренне для эффективного хранения и извлечения элементов.
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(1);
hashSet.add(2);
hashSet.add(3);
hashSet.add(2); // Дубликата будет проигнорирована
System.out.println(hashSet); // Вывод: [1, 2, 3]
Ответ: LinkedHashSet - это упорядоченная версия Hashset, которая поддерживается двусвязным списком, проходящим через все элементы. Это очень полезно, когда требуется порядок итерации. Во время итерации в LinkedHashSet элементы возвращаются в том же порядке, в котором они были вставлены.
LinkedHashSet<E> hs = new LinkedHashSet<E>();
LinkedHashSet<Integer> hs = new LinkedHashSet<>();
hs.add(1);
hs.add(2);
hs.add(5);
hs.add(3);
System.out.println("Values: " + hs);
// Вывод: Values:[1, 2, 5, 3]
// Порядок сохранен!
| Характеристика | HashSet | LinkedHashSet |
|---|---|---|
| Порядок | Не гарантирован | Сохраняет порядок вставки |
| Производительность | Чуть быстрее | Чуть медленнее (из-за связного списка) |
| Внутренняя структура | Hash таблица | Hash таблица + двусвязный список |
Ответ: Map - это интерфейс в Java Collection Framework, который хранит данные в виде пар ключ-значение, где каждый ключ уникален и используется для получения соответствующего значения.
Map<Integer, String> map = new HashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
System.out.println(map.get(1)); // Вывод: One
| Метод | Описание |
|---|---|
put(K key, V value) |
Вставляет пару ключ-значение |
get(Object key) |
Получает значение по ключу |
remove(Object key) |
Удаляет пару по ключу |
containsKey(Object key) |
Проверяет наличие ключа |
keySet() |
Возвращает множество всех ключей |
values() |
Возвращает коллекцию всех значений |
Ответ: TreeMap - это тип map, который хранит данные в виде пар ключ-значение. Он реализован с использованием красно-черного дерева. Характеристики TreeMap:
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(3, "Three");
treeMap.put(1, "One");
treeMap.put(2, "Two");
// Элементы автоматически отсортированы по ключам
for (Integer key : treeMap.keySet()) {
System.out.println(key + " : " + treeMap.get(key));
}
// Вывод:
// 1 : One
// 2 : Two
// 3 : Three
Ответ: EnumSet - это специализированная реализация интерфейса Set для использования с типами перечисления (enumeration). Несколько характеристик EnumSet:
public abstract class EnumSet<E extends Enum<E>>
// Параметр: E определяет элементы
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
System.out.println(weekdays); // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]
System.out.println(weekend); // [SATURDAY, SUNDAY]
Ответ: Blocking Queue - это Queue, который поддерживает операции, которые ждут, пока очередь станет непустой при извлечении и удалении элемента, и ждут, пока в очереди станет свободное место при добавлении элемента.
public interface BlockingQueue<E> extends Queue<E>
// Параметры: E - это тип элементов, хранящихся в Collection
| Метод | Описание |
|---|---|
put(E e) |
Вставляет элемент, ждет если очередь полна |
take() |
Извлекает и удаляет элемент, ждет если очередь пуста |
offer(E e, long timeout, TimeUnit unit) |
Вставляет элемент с timeout |
poll(long timeout, TimeUnit unit) |
Извлекает элемент с timeout |
LinkedBlockingQueue, ArrayBlockingQueue - это популярные реализации BlockingQueue
Ответ: ConcurrentHashMap реализован с использованием Hashtable.
public class ConcurrentHashMap<K, V>
extends AbstractMap<K, V>
implements ConcurrentMap<K, V>, Serializable
// Параметры:
// K - это тип объекта ключа
// V - это тип объекта значения
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
System.out.println(map.get(1)); // Вывод: One
// map.put(4, null); // ❌ NullPointerException - null не допускается
Ответ: Да, мы можем использовать любой класс в качестве ключа Map, если он соблюдает определенные предопределенные правила:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Person other = (Person) obj;
return name.equals(other.name) && age == other.age;
}
}
// Использование
Map<Person, String> map = new HashMap<>();
Person p1 = new Person("John", 30);
map.put(p1, "Developer");
Ответ: Iterator - это интерфейс в Java Collection Framework, который используется для обхода или итерации через элементы коллекции один за другим. Он предоставляет унифицированный способ доступа к элементам коллекции без раскрытия основной структуры данных.
| Метод | Описание |
|---|---|
hasNext() |
Возвращает true если следующий элемент есть |
next() |
Возвращает следующий элемент |
remove() |
Удаляет текущий элемент |
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// Вывод: A, B, C
Ответ: Enumeration - это интерфейс в Java, который используется для обхода элементов устаревших классов коллекций таких как Vector и Hashtable. Это позволяет элементам быть доступными по одному в последовательном порядке.
| Метод | Описание |
|---|---|
hasMoreElements() |
Возвращает true если есть еще элементы |
nextElement() |
Возвращает следующий элемент |
Vector<String> vector = new Vector<>();
vector.add("A");
vector.add("B");
vector.add("C");
Enumeration<String> e = vector.elements();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
// Вывод: A, B, C