Вопросы 121-130 для новичков и опытных разработчиков
Ответ: Java не позволяет напрямую создавать generic массивы из-за type erasure (стирания типов). Generic типы проверяются во время компиляции, тогда как массивы выполняют проверку типа во время выполнения, что может привести к проблемам безопасности типов.
// ❌ Это вызовет ошибку компиляции
List<Integer>[] arr = new List<Integer>[10];
// ✅ Вместо этого используйте:
List<Integer>[] arr = new ArrayList[10]; // Но это не type-safe
// ✅ Или еще лучше:
List<List<Integer>> list = new ArrayList<>();
Ответ: Оба массивы и ArrayList хранят элементы в структуре похожей на контигуозную память, но они отличаются в том, как управляется размер. Массивы имеют фиксированный размер, тогда как ArrayList использует динамический внутренний массив, который может расти или сжиматься по мере необходимости.
// Массив - фиксированный размер 5
int[] arr = new int[5]; // Может хранить только 5 элементов
// ArrayList - динамический размер
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
// ArrayList автоматически растет при добавлении элементов
Ответ: Существует несколько способов преобразования между ArrayList и Array в Java.
Программисты могут преобразовать Array в ArrayList, используя метод asList() класса Arrays. Это статический метод, который принимает объект List.
Arrays.asList(item)
String[] temp = { "Abc", "Def", "Ghi", "Jkl" };
// Преобразование массива в ArrayList
List<String> conv = Arrays.asList(temp);
System.out.println(conv); // [Abc, Def, Ghi, Jkl]
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
// Преобразование ArrayList в Array
String[] arr = list.toArray(new String[0]);
// Или используя метод toArray() без параметров
Object[] objArr = list.toArray();
Ответ: ArrayList растет динамически путем создания нового большего массива, когда текущая емкость становится полной. Затем все существующие элементы копируются из старого массива в новый массив, позволяя добавить дополнительные элементы.
ArrayList<Integer> list = new ArrayList<>();
// Начальная емкость обычно 10
list.add(1);
list.add(2);
// ... добавляем элементы
// Когда добавляется 11-й элемент, ArrayList создает новый массив
// большей емкости (обычно 1.5x или 2x от текущей) и копирует все элементы
list.add(11); // Внутри произойдет resize
Когда ArrayList достигает своей емкости и добавляется новый элемент, Java создает новый массив с увеличенной емкостью (обычно в 1.5x), копирует все существующие элементы и удаляет ссылку на старый массив.
Ответ: Vector - это класс динамического массива в Java, который может расти или сжиматься автоматически, когда элементы добавляются или удаляются. Он похож на ArrayList, но синхронизирован, что делает его потокобезопасным.
Vector<Integer> vec = new Vector<>();
vec.add(1);
vec.add(2);
vec.add(3);
| Характеристика | Vector | ArrayList |
|---|---|---|
| Синхронизация | Синхронизирован | Не синхронизирован |
| Производительность | Медленнее | Быстрее |
| Рекомендация | Устаревший | Современный выбор |
Ответ: ArrayList можно сделать только для чтения, используя метод, предоставленный классом Collections, используя метод Collections.unmodifiableList().
array_readonly = Collections.unmodifiableList(ArrayList);
ArrayList<Character> temp = new ArrayList<>();
temp.add('X');
temp.add('Y');
temp.add('Z');
System.out.println("Initial list: " + temp);
// Вывод: [X, Y, Z]
// Создание read-only списка
List<Character> readOnlyList = Collections.unmodifiableList(temp);
System.out.println("ReadOnly ArrayList: " + readOnlyList);
// Вывод: [X, Y, Z]
// Попытка добавить элемент вызовет UnsupportedOperationException
try {
readOnlyList.add('A');
} catch (UnsupportedOperationException e) {
System.out.println("Exception: " + e);
// Вывод: Exception: java.lang.UnsupportedOperationException
}
Ответ: Priority Queue - это абстрактный тип данных, подобный обычной очереди или структуре данных стека. Элементы, хранящиеся в элементах, зависят от определенного приоритета от низкого к высокому. PriorityQueue основана на приоритетной кучи.
public interface PriorityQueue<E> extends Queue<E>
import java.util.*;
class PriorityQueueDemo {
public static void main(String args[]) {
// Создание пустой приоритетной очереди
PriorityQueue<Integer> pq = new PriorityQueue<>();
// Добавление элементов
pq.add(10);
pq.add(20);
pq.add(15);
// Извлечение элемента с наивысшим приоритетом
System.out.println(pq.peek()); // Вывод: 10
}
}
Ответ: LinkedList - это класс Java, который использует двусвязный список для хранения элементов. Он наследует класс AbstractList и реализует интерфейсы List и Deque.
LinkedList<String> list = new LinkedList<>();
list.add("Element 1");
list.add("Element 2");
list.remove(0);
| Метод | Описание |
|---|---|
| add(E e) | Добавляет элемент в конец списка |
| remove(int index) | Удаляет элемент по индексу |
| get(int index) | Получает элемент по индексу |
| addFirst(E e) | Добавляет элемент в начало |
| removeLast() | Удаляет последний элемент |
Ответ: Класс Stack в Java - это структура данных LIFO (Last In First Out), которая наследует класс Vector, но имеет функции, специфичные для стека. Класс Stack в Java предоставляет следующие методы:
| Метод | Описание |
|---|---|
peek() |
Возвращает верхний элемент из стека без удаления |
empty() |
Возвращает true если стек пуст, иначе false |
push(E item) |
Добавляет элемент в верх стека |
pop() |
Удаляет и возвращает верхний элемент из стека |
search(Object o) |
Возвращает позицию (1-based) объекта от верхнего элемента. Если не найден, возвращает -1 |
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println(stack.peek()); // Вывод: 30
System.out.println(stack.pop()); // Вывод: 30
System.out.println(stack.empty()); // Вывод: false
Ответ: Set - это коллекция в Collection Framework, которая не хранит дублирующихся элементов. Set не сохраняет никакой порядок элементов. Java Collections Framework предоставляет несколько реализаций интерфейса Set:
| Характеристика | HashSet | LinkedHashSet | TreeSet |
|---|---|---|---|
| Упорядоченность | Не упорядочен | Сохраняет вставку | Отсортирован |
| Производительность | O(1) в среднем | O(1) в среднем | O(log n) |
| Синхронизация | Не синхронизирован | Не синхронизирован | Не синхронизирован |
| Null элементы | Допускает один null | Допускает один null | Не допускает null |
// HashSet пример
HashSet<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
// LinkedHashSet сохраняет порядок
LinkedHashSet<String> linkedSet = new LinkedHashSet<>();
linkedSet.add("Apple");
linkedSet.add("Banana");
// TreeSet сортирует элементы
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");