Ответ на "Как избежать ConcurrentModificationException во время перебора коллекции?"
• Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу
• Использовать
• Преобразовать список в массив и перебирать массив.
• Блокировать изменения списка на время перебора с помощью блока
Отрицательная сторона последних двух вариантов - ухудшение производительности.
#вопросы_с_собеседований
• Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу
fail-safe.• Использовать
ConcurrentHashMap и CopyOnWriteArrayList.• Преобразовать список в массив и перебирать массив.
• Блокировать изменения списка на время перебора с помощью блока
synchronized.Отрицательная сторона последних двух вариантов - ухудшение производительности.
#вопросы_с_собеседований
👍5
Какая коллекция реализует дисциплину обслуживания FIFO?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Ответ на "Какая коллекция реализует дисциплину обслуживания FIFO?"
FIFO, First-In-First-Out («первым пришел-первым ушел») - по этому принципу построена коллекция
#вопросы_с_собеседований
FIFO, First-In-First-Out («первым пришел-первым ушел») - по этому принципу построена коллекция
Queue.#вопросы_с_собеседований
Зачем добавили ArrayList, если уже был Vector?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Книги по Java - канал, где вы можете бесплатно КАЧАТЬ книги по Java программированию в два клика.
- качай книги
- читай
- становись программистом.
- зарабатывай 100-400 тысяч рублей.
Все книги 2019-2023 годов. Много русскоязычных.
Подписывайтесь и качайте: @booksforjava
- качай книги
- читай
- становись программистом.
- зарабатывай 100-400 тысяч рублей.
Все книги 2019-2023 годов. Много русскоязычных.
Подписывайтесь и качайте: @booksforjava
Ответ на "Зачем добавили ArrayList, если уже был Vector?"
• Методы класса
• По умолчанию,
#вопросы_с_собеседований
• Методы класса
Vector синхронизированы, а ArrayList - нет;• По умолчанию,
Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.Vector это устаревший класс и его использование не рекомендовано.#вопросы_с_собеседований
👍4👎1
Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Ответ на "Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?"
ArrayList:
• доступ к произвольному элементу по индексу за константное время
• доступ к элементам по значению за линейное время
• вставка в конец в среднем производится за константное время
• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (
• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.
LinkedList:
• на получение элемента по индексу или значению потребуется линейное время
• на добавление и удаление в начало или конец списка потребуется константное
• вставка или удаление в/из произвольного место константное
• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
В целом,
#вопросы_с_собеседований
ArrayList это список, реализованный на основе массива, а LinkedList — это классический двусвязный список, основанный на объектах с ссылками между ними.ArrayList:
• доступ к произвольному элементу по индексу за константное время
O(1);• доступ к элементам по значению за линейное время
O(N);• вставка в конец в среднем производится за константное время
O(1);• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (
capacity) не изменяется);• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.
LinkedList:
• на получение элемента по индексу или значению потребуется линейное время
O(N);• на добавление и удаление в начало или конец списка потребуется константное
O(1);• вставка или удаление в/из произвольного место константное
O(1);• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
В целом,
LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти, и по скорости выполнения операций. LinkedList предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.#вопросы_с_собеседований
👍2
Какое худшее время работы метода contains() для элемента, который есть в LinkedList?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
👍2
Ответ на "Какое худшее время работы метода contains() для элемента, который есть в LinkedList?"
#вопросы_с_собеседований
O(N). Время поиска элемента линейно пропорционально количеству элементов в списке.#вопросы_с_собеседований
Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
👍1
Ответ на "Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?"
При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость,
#вопросы_с_собеседований
При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость,
capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой trimToSize().#вопросы_с_собеседований
👍6
Оцените количество памяти на хранение одного примитива типа byte в LinkedList?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Ответ на "Оцените количество памяти на хранение одного примитива типа byte в LinkedList?"
Каждый элемент
Для
#вопросы_с_собеседований
Каждый элемент
LinkedList хранит ссылку на предыдущий элемент, следующий элемент и ссылку на данные. static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
//...
}
Для 32-битных систем каждая ссылка занимает 32 бита (4 байта). Сам объект (заголовок) вложенного класса Node занимает 8 байт. 4 + 4 + 4 + 8 = 20 байт, а т.к. размер каждого объекта в Java кратен 8, соответственно получаем 24 байта. Примитив типа byte занимает 1 байт памяти, но в JCF примитивы упаковываются: объект типа Byte занимает в памяти 16 байт (8 байт на заголовок объекта, 1 байт на поле типа byte и 7 байт для кратности 8). Также напомню, что значения от -128 до 127 кэшируются и для них новые объекты каждый раз не создаются. Таким образом, в x32 JVM 24 байта тратятся на хранение одного элемента в списке и 16 байт - на хранение упакованного объекта типа Byte. Итого 40 байт.Для
64-битной JVM каждая ссылка занимает 64 бита (8 байт), размер заголовка каждого объекта составляет 16 байт (два машинных слова). Вычисления аналогичны: 8 + 8 + 8 + 16 = 40байт и 24 байта. Итого 64 байта.#вопросы_с_собеседований
👍10
Оцените количество памяти на хранение одного примитива типа byte в ArrayList?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
👍1
Ответ на "Оцените количество памяти на хранение одного примитива типа byte в ArrayList?"
ArrayList основан на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому
В худшем случае вставка в середину списка эффективнее для
#вопросы_с_собеседований
ArrayList основан на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому
16 байт тратится на хранение упакованного объекта и 4 байта (8 для x64) - на хранение ссылки на этот объект в самой структуре данных. Таким образом, в x32 JVM 4 байта используются на хранение одного элемента и 16 байт - на хранение упакованного объекта типа Byte. Для x64 - 8 байт и 24 байта соответственно.В худшем случае вставка в середину списка эффективнее для
LinkedList. В остальных - скорее всего, для ArrayList, поскольку копирование элементов осуществляется за счет вызова быстрого системного метода System.arraycopy().#вопросы_с_собеседований
👍6
Для ArrayList или для LinkedList операция добавления элемента в середину (list.add(list.size()/2, newElement)) медленнее?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
👍1
Ответ на "Для ArrayList или для LinkedList операция добавления элемента в середину (list.add(list.size()/2, newElement)) медленнее?"
Для ArrayList:
• проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив
• копирование всех элементов, расположенных правее от позиции вставки, на одну позицию вправо
• вставка элемента
Для LinkedList:
• поиск позиции вставки
• вставка элемента
В худшем случае вставка в середину списка эффективнее для
#вопросы_с_собеседований
Для ArrayList:
• проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив
(O(N));• копирование всех элементов, расположенных правее от позиции вставки, на одну позицию вправо
(O(N));• вставка элемента
(O(1)).Для LinkedList:
• поиск позиции вставки
(O(N));• вставка элемента
(O(1)).В худшем случае вставка в середину списка эффективнее для
LinkedList. В остальных - скорее всего, для ArrayList, поскольку копирование элементов осуществляется за счет вызова быстрого системного метода System.arraycopy().#вопросы_с_собеседований
В реализации класса ArrayList есть следующие поля: Object[] elementData, int size. Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length?
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
Пишите в комментариях ваш вариант. Ответ будет у нас в канале.
#вопросы_с_собеседований
👍1
Ответ на "В реализации класса ArrayList есть следующие поля: Object[] elementData, int size. Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length?"
Размер массива
#вопросы_с_собеседований
Размер массива
elementData представляет собой вместимость (capacity) ArrayList, которая всегда больше переменной size - реального количества хранимых элементов. При необходимости вместимость автоматически возрастает.#вопросы_с_собеседований
👍5