Javazavr. Обучение Java.
4.22K subscribers
36 photos
55 links
Главный канал по Java.

Контент на любой вкус.
1. Туториалы
2. Видео
3. Задачи
4. Тесты
И многое другое.

Реклама: @anothertechrock
Download Telegram
Как поведёт себя коллекция, если вызвать iterator.remove()?

Пишите в комментариях ваш вариант. Ответ будет у нас в канале.

#вопросы_с_собеседований
Ответ на "Как поведёт себя коллекция, если вызвать iterator.remove()?"

Если вызову iterator.remove() предшествовал вызов iterator.next(), то iterator.remove() удалит элемент коллекции, на который указывает итератор, в противном случае будет выброшено IllegalStateException().

#вопросы_с_собеседований
🔥10
Как поведёт себя уже инстанциированный итератор для collection, если вызвать collection.remove()?

Пишите в комментариях ваш вариант. Ответ будет у нас в канале.

#вопросы_с_собеседований
Ответ на "Как поведёт себя уже инстанциированный итератор для collection, если вызвать collection.remove()?"

При следующем вызове методов итератора будет выброшено ConcurrentModificationException.

#вопросы_с_собеседований
Как избежать ConcurrentModificationException во время перебора коллекции?

Пишите в комментариях ваш вариант. Ответ будет у нас в канале.

#вопросы_с_собеседований
👍1
Ответ на "Как избежать ConcurrentModificationException во время перебора коллекции?"

• Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу fail-safe.
• Использовать ConcurrentHashMap и CopyOnWriteArrayList.
• Преобразовать список в массив и перебирать массив.
• Блокировать изменения списка на время перебора с помощью блока synchronized.
Отрицательная сторона последних двух вариантов - ухудшение производительности.

#вопросы_с_собеседований
👍5
Какая коллекция реализует дисциплину обслуживания FIFO?

Пишите в комментариях ваш вариант. Ответ будет у нас в канале.

#вопросы_с_собеседований
Ответ на "Какая коллекция реализует дисциплину обслуживания FIFO?"

FIFO, First-In-First-Out («первым пришел-первым ушел»)
- по этому принципу построена коллекция Queue.

#вопросы_с_собеседований
Зачем добавили ArrayList, если уже был Vector?

Пишите в комментариях ваш вариант. Ответ будет у нас в канале.

#вопросы_с_собеседований
Книги по Java - канал, где вы можете бесплатно КАЧАТЬ книги по Java программированию в два клика.

- качай книги
- читай
- становись программистом.
- зарабатывай 100-400 тысяч рублей.

Все книги 2019-2023 годов. Много русскоязычных.

Подписывайтесь и качайте: @booksforjava
Ответ на "Зачем добавили ArrayList, если уже был Vector?"

• Методы класса Vector синхронизированы, а ArrayList - нет;
• По умолчанию, Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.

Vector это устаревший класс и его использование не рекомендовано.

#вопросы_с_собеседований
👍4👎1
Чем отличается 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