Что выведет код?
#Tasks
import java.util.LinkedList;
public class LinkedListChallenge {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(5);
list.add(15);
list.add(25);
list.add(35);
list.add(45);
int sum = 0;
for (int i = 1; i < list.size(); i += 2) {
sum += list.get(i);
}
list.add(1, sum);
list.removeLast();
list.addFirst(sum);
int result = 1;
for (int value : list) {
result *= value;
}
System.out.println("Result: " + result);
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
0%
Result: 384000
29%
Result: 168025500
0%
Result: 192000
71%
Result: 164062500
Внутреннее устройство и основные методы LinkedList
LinkedList основан на структуре данных двусвязного списка. Каждый элемент списка представлен узлом (Node), который содержит данные и ссылки на предыдущий и следующий узлы.
Класс Node:
Класс Node — это внутренний класс LinkedList, который представляет элемент списка.
Узлы:
LinkedList содержит ссылки на первый (first) и последний (last) узлы списка.
Добавление элементов:
При добавлении элемента в конец списка создается новый узел, и ссылки next и prev соответствующим образом обновляются.
Удаление элементов:
Удаление элемента включает обновление ссылок next и prev соседних узлов.
Поиск узла:
Для доступа к элементу по индексу необходимо пройти по списку от начала или конца в зависимости от того, ближе ли индекс к началу или концу списка.
Основные методы LinkedList
Добавление элементов:
add(E e): добавляет элемент в конец списка.
add(int index, E element): вставляет элемент по указанному индексу.
Удаление элементов:
remove(int index): удаляет элемент по указанному индексу.
remove(Object o): удаляет первое вхождение указанного элемента.
Получение элементов:
get(int index): возвращает элемент по указанному индексу.
getFirst(), getLast(): возвращают первый и последний элементы соответственно.
Другие методы:
size(): возвращает количество элементов в списке.
clear(): удаляет все элементы из списка.
contains(Object o): проверяет, содержится ли указанный элемент в списке.
#Java #Training #Medium #LinkedList
LinkedList основан на структуре данных двусвязного списка. Каждый элемент списка представлен узлом (Node), который содержит данные и ссылки на предыдущий и следующий узлы.
Класс Node:
Класс Node — это внутренний класс LinkedList, который представляет элемент списка.
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
Узлы:
LinkedList содержит ссылки на первый (first) и последний (last) узлы списка.
transient Node<E> first;
transient Node<E> last;
Добавление элементов:
При добавлении элемента в конец списка создается новый узел, и ссылки next и prev соответствующим образом обновляются.
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
Удаление элементов:
Удаление элемента включает обновление ссылок next и prev соседних узлов.
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
E unlink(Node<E> x) {
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
x.item = null;
size--;
modCount++;
return element;
}
Поиск узла:
Для доступа к элементу по индексу необходимо пройти по списку от начала или конца в зависимости от того, ближе ли индекс к началу или концу списка.
Node<E> node(int index) {
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
Основные методы LinkedList
Добавление элементов:
add(E e): добавляет элемент в конец списка.
add(int index, E element): вставляет элемент по указанному индексу.
linkedList.add("Apple");
linkedList.add(1, "Orange");
Удаление элементов:
remove(int index): удаляет элемент по указанному индексу.
remove(Object o): удаляет первое вхождение указанного элемента.
linkedList.remove(1);
linkedList.remove("Apple");
Получение элементов:
get(int index): возвращает элемент по указанному индексу.
getFirst(), getLast(): возвращают первый и последний элементы соответственно.
String first = linkedList.getFirst();
String element = linkedList.get(1);
Другие методы:
size(): возвращает количество элементов в списке.
clear(): удаляет все элементы из списка.
contains(Object o): проверяет, содержится ли указанный элемент в списке.
int size = linkedList.size();
linkedList.clear();
boolean containsApple = linkedList.contains("Apple");
#Java #Training #Medium #LinkedList
CopyOnWriteArrayList, особенности и преимущества
CopyOnWriteArrayList — это потокобезопасная реализация интерфейса List в Java, которая отличается тем, что при каждой операции изменения создает копию массива. Это делает CopyOnWriteArrayList особенно подходящей для сценариев, где чтение данных происходит гораздо чаще, чем запись.
Особенности CopyOnWriteArrayList
Потокобезопасность:
Все методы, изменяющие содержимое списка, синхронизированы, что обеспечивает безопасность при использовании в многопоточной среде без явной необходимости в дополнительных блокировках.
Immutable при чтении:
Операции чтения (такие как get(), iterator(), и т.д.) не требуют блокировок и происходят в постоянное время (O(1)), так как они работают с неизменяемыми копиями массива.
Создание копий при изменении:
Каждая операция записи (добавление, удаление, обновление элемента) создает новую копию всего внутреннего массива. Это может быть дорогостоящим по памяти и времени при частых операциях записи.
Консистентные итераторы:
Итераторы, возвращаемые CopyOnWriteArrayList, никогда не выбрасывают ConcurrentModificationException, потому что они работают с моментальной копией данных на момент их создания.
Отсутствие возможности удаления через итератор:
Методы итератора, такие как remove(), не поддерживаются и выбрасывают UnsupportedOperationException.
Преимущества CopyOnWriteArrayList
Высокая производительность для чтения:
В сценариях, где множество потоков активно читают данные и изменения происходят редко, CopyOnWriteArrayList обеспечивает высокую производительность благодаря отсутствию необходимости синхронизации для операций чтения.
Предсказуемое поведение:
Из-за неизменности копий массива при чтении, итераторы не видят промежуточных состояний, что делает поведение программы более предсказуемым.
Безопасность в многопоточных средах:
CopyOnWriteArrayList идеален для программ, которые требуют безопасного доступа к коллекции из нескольких потоков без использования внешних блокировок.
Основные особенности внутреннего устройства
Массив как основа хранения:
Внутренне CopyOnWriteArrayList использует массив для хранения элементов. Этот массив называется array и является volatile-полем, что гарантирует видимость изменений между потоками.
Копирование при записи:
При выполнении любой операции, изменяющей содержимое списка (например, add(), remove(), set()), создается новая копия массива с внесенными изменениями. Это обеспечивает неизменяемость исходного массива, используемого для чтения, и потокобезопасность операций.
Синхронизация методов:
Методы, которые изменяют содержимое списка, синхронизированы, чтобы гарантировать, что только один поток может выполнять изменение в любой момент времени.
Чтение без блокировок:
Операции чтения (такие как get(), size(), итерация) не требуют блокировок, так как они работают с неизменяемыми копиями массива.
Преимущества:
Потокобезопасность: CopyOnWriteArrayList позволяет безопасно использовать коллекцию в многопоточной среде без явной синхронизации.
Высокая производительность для чтения: Благодаря неизменяемости массивов, операции чтения очень быстрые.
Консистентные итераторы: Итераторы никогда не выбрасывают ConcurrentModificationException, так как они работают с моментальной копией данных.
Недостатки:
Высокие затраты на изменение: Из-за копирования массива при каждой операции изменения, CopyOnWriteArrayList может быть неэффективным для частых операций записи.
Высокие затраты памяти: Копирование массива создает дополнительную нагрузку на память.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://for-each.dev/lessons/b/-java-copy-on-write-arraylist
https://www.baeldung.com/java-copy-on-write-arraylist
#Java #Training #Medium #CopyOnWriteArrayList
CopyOnWriteArrayList — это потокобезопасная реализация интерфейса List в Java, которая отличается тем, что при каждой операции изменения создает копию массива. Это делает CopyOnWriteArrayList особенно подходящей для сценариев, где чтение данных происходит гораздо чаще, чем запись.
Особенности CopyOnWriteArrayList
Потокобезопасность:
Все методы, изменяющие содержимое списка, синхронизированы, что обеспечивает безопасность при использовании в многопоточной среде без явной необходимости в дополнительных блокировках.
Immutable при чтении:
Операции чтения (такие как get(), iterator(), и т.д.) не требуют блокировок и происходят в постоянное время (O(1)), так как они работают с неизменяемыми копиями массива.
Создание копий при изменении:
Каждая операция записи (добавление, удаление, обновление элемента) создает новую копию всего внутреннего массива. Это может быть дорогостоящим по памяти и времени при частых операциях записи.
Консистентные итераторы:
Итераторы, возвращаемые CopyOnWriteArrayList, никогда не выбрасывают ConcurrentModificationException, потому что они работают с моментальной копией данных на момент их создания.
Отсутствие возможности удаления через итератор:
Методы итератора, такие как remove(), не поддерживаются и выбрасывают UnsupportedOperationException.
Преимущества CopyOnWriteArrayList
Высокая производительность для чтения:
В сценариях, где множество потоков активно читают данные и изменения происходят редко, CopyOnWriteArrayList обеспечивает высокую производительность благодаря отсутствию необходимости синхронизации для операций чтения.
Предсказуемое поведение:
Из-за неизменности копий массива при чтении, итераторы не видят промежуточных состояний, что делает поведение программы более предсказуемым.
Безопасность в многопоточных средах:
CopyOnWriteArrayList идеален для программ, которые требуют безопасного доступа к коллекции из нескольких потоков без использования внешних блокировок.
Основные особенности внутреннего устройства
Массив как основа хранения:
Внутренне CopyOnWriteArrayList использует массив для хранения элементов. Этот массив называется array и является volatile-полем, что гарантирует видимость изменений между потоками.
Копирование при записи:
При выполнении любой операции, изменяющей содержимое списка (например, add(), remove(), set()), создается новая копия массива с внесенными изменениями. Это обеспечивает неизменяемость исходного массива, используемого для чтения, и потокобезопасность операций.
Синхронизация методов:
Методы, которые изменяют содержимое списка, синхронизированы, чтобы гарантировать, что только один поток может выполнять изменение в любой момент времени.
Чтение без блокировок:
Операции чтения (такие как get(), size(), итерация) не требуют блокировок, так как они работают с неизменяемыми копиями массива.
Преимущества:
Потокобезопасность: CopyOnWriteArrayList позволяет безопасно использовать коллекцию в многопоточной среде без явной синхронизации.
Высокая производительность для чтения: Благодаря неизменяемости массивов, операции чтения очень быстрые.
Консистентные итераторы: Итераторы никогда не выбрасывают ConcurrentModificationException, так как они работают с моментальной копией данных.
Недостатки:
Высокие затраты на изменение: Из-за копирования массива при каждой операции изменения, CopyOnWriteArrayList может быть неэффективным для частых операций записи.
Высокие затраты памяти: Копирование массива создает дополнительную нагрузку на память.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://for-each.dev/lessons/b/-java-copy-on-write-arraylist
https://www.baeldung.com/java-copy-on-write-arraylist
#Java #Training #Medium #CopyOnWriteArrayList
Baeldung
Guide to CopyOnWriteArrayList | Baeldung
A quick overview of Java's CopyOnWriteArrayList and its most common usages.
Что выведет код?
#Tasks
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListChallenge {
public static void main(String[] args) {
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.add(40);
list.add(50);
// Iterate and modify
for (int num : list) {
if (num % 20 == 0) {
list.remove(Integer.valueOf(num));
}
}
// Add new elements
list.add(5);
list.add(25);
int sum = 0;
for (int num : list) {
sum += num;
}
System.out.println("Sum: " + sum);
}
}
#Tasks
Основные методы CopyOnWriteArrayList и примеры использования
Добавление элементов:
add(E e): добавляет элемент в конец списка.
add(int index, E element): вставляет элемент по указанному индексу.
Удаление элементов:
remove(Object o): удаляет первое вхождение указанного элемента.
remove(int index): удаляет элемент по указанному индексу.
Обновление элементов:
set(int index, E element): заменяет элемент по указанному индексу новым элементом.
Получение элементов:
get(int index): возвращает элемент по указанному индексу.
Проверка содержимого:
contains(Object o): проверяет, содержится ли указанный элемент в списке.
size(): возвращает количество элементов в списке.
Итерация по элементам:
iterator(): возвращает итератор по элементам списка.
Примеры использования
#Java #Training #Medium #CopyOnWriteArrayList
Добавление элементов:
add(E e): добавляет элемент в конец списка.
add(int index, E element): вставляет элемент по указанному индексу.
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("Apple");
list.add(1, "Banana");
Удаление элементов:
remove(Object o): удаляет первое вхождение указанного элемента.
remove(int index): удаляет элемент по указанному индексу.
list.remove("Banana");
list.remove(0);
Обновление элементов:
set(int index, E element): заменяет элемент по указанному индексу новым элементом.
list.set(0, "Orange");
Получение элементов:
get(int index): возвращает элемент по указанному индексу.
String fruit = list.get(0);
Проверка содержимого:
contains(Object o): проверяет, содержится ли указанный элемент в списке.
size(): возвращает количество элементов в списке.
boolean containsApple = list.contains("Apple");
int size = list.size();
Итерация по элементам:
iterator(): возвращает итератор по элементам списка.
for (String fruit : list) {
System.out.println(fruit);
}
Примеры использования
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.List;
import java.util.Iterator;
public class CopyOnWriteArrayListMethodsExample {
public static void main(String[] args) {
List<String> list = new CopyOnWriteArrayList<>();
// Добавление элементов
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println("After adding elements: " + list);
// Вставка элемента
list.add(1, "Orange");
System.out.println("After insertion: " + list);
// Обновление элемента
list.set(2, "Mango");
System.out.println("After updating: " + list);
// Удаление элемента по индексу
list.remove(3);
System.out.println("After removing by index: " + list);
// Удаление элемента по значению
list.remove("Apple");
System.out.println("After removing by value: " + list);
// Проверка содержимого
boolean containsBanana = list.contains("Banana");
System.out.println("Contains Banana: " + containsBanana);
// Получение элемента
String fruit = list.get(0);
System.out.println("Element at index 0: " + fruit);
// Итерация по элементам
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println("Iterating: " + iterator.next());
}
// Размер списка
int size = list.size();
System.out.println("Size of list: " + size);
// Очистка списка
list.clear();
System.out.println("After clearing: " + list);
}
}
#Java #Training #Medium #CopyOnWriteArrayList
Всем доброго субботнего утра!☀️
Как Вы собираетесь провести эти выходные?
Делитесь с нами в чате - https://t.me/Java_Beginner_chat
Как Вы собираетесь провести эти выходные?
Делитесь с нами в чате - https://t.me/Java_Beginner_chat
А вы вообще читаете наш канал?
Anonymous Poll
46%
Да каждый пост!
36%
Иногда, стараюсь не пропускать
14%
Изредка, скорее случайно
4%
Как я оказался в этой группе???
This media is not supported in your browser
VIEW IN TELEGRAM
Напоминаю!☝️
Сегодня в 16:00 по МСК, мы вновь собираемся на онлайн встречу)))
От нас лайф-кодинг, от Вас хорошее настроение и подсказки!))))😉
Ждем всех!🫡
Сегодня в 16:00 по МСК, мы вновь собираемся на онлайн встречу)))
От нас лайф-кодинг, от Вас хорошее настроение и подсказки!))))😉
Ждем всех!🫡
Запись нашей сегодняшней встречи -
https://www.youtube.com/watch?v=Ryv47d3ggZw
https://rutube.ru/video/354b75fec305b2d3c678a5b58a4b70fe/
Огромная благодарность тем кто был, за участие и подсказки!
@Alexander_Gors отдельное спасибо, за лайф-кодинг!)
Сегодня, мы совместно рассмотрели на примерах порождающие паттерны проектирования:
- Фабричный метод (Factory Method)
- Абстрактная фабрика (Abstract Factory)
- Прототип (Prototype)
- Одиночка (Singleton)
- Строитель (Builder)
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Гит репозиторий с результатом - https://github.com/Oleborn/PatternsOfCoding
Всем светлого и пенного 🍻😉
https://www.youtube.com/watch?v=Ryv47d3ggZw
https://rutube.ru/video/354b75fec305b2d3c678a5b58a4b70fe/
Огромная благодарность тем кто был, за участие и подсказки!
@Alexander_Gors отдельное спасибо, за лайф-кодинг!)
Сегодня, мы совместно рассмотрели на примерах порождающие паттерны проектирования:
- Фабричный метод (Factory Method)
- Абстрактная фабрика (Abstract Factory)
- Прототип (Prototype)
- Одиночка (Singleton)
- Строитель (Builder)
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Гит репозиторий с результатом - https://github.com/Oleborn/PatternsOfCoding
Всем светлого и пенного 🍻😉
Встреча_в_Телемосте_04_08_24_20_16_33_—_запись.webm
224.1 MB
Для тех кто не смог победить блокировку Youtube и не желает заходить в Rutube выкладываю видео тут!
Смотрите на здоровье) 🫡
#online_meeting
Смотрите на здоровье) 🫡
#online_meeting
Vector, отличия от ArrayList
Vector — это класс из пакета java.util, который реализует интерфейсы List, RandomAccess, Cloneable и Serializable. Этот класс предоставляет возможность создания динамически изменяемых массивов, которые могут автоматически увеличивать свой размер.
В отличие от ArrayList, класс Vector является синхронизированным, что делает его безопасным для использования в многопоточной среде без необходимости в дополнительной синхронизации.
История и использование
Vector был введен в первых версиях Java и являлся основным динамическим массивом до появления ArrayList в Java 2 (JDK 1.2). С тех пор, ArrayList стал более предпочтительным выбором для однопоточных приложений благодаря своей более высокой производительности.
Отличия от ArrayList
Синхронизация:
Vector: Все методы класса синхронизированы, что делает его потокобезопасным. Это приводит к некоторому снижению производительности при выполнении операций.
ArrayList: Не синхронизирован. Если требуется потокобезопасность, нужно вручную синхронизировать методы или использовать внешние блокировки.
Увеличение емкости:
Vector: По умолчанию удваивает свой размер при переполнении, что может привести к резкому увеличению памяти.
ArrayList: Увеличивает свою емкость на 50% при необходимости, что делает его более гибким в плане использования памяти.
Методы добавления и удаления элементов:
Оба класса имеют схожие методы для добавления, удаления и доступа к элементам. Однако из-за синхронизации, методы Vector несколько медленнее.
Пример использования Vector
Когда использовать Vector
Используйте Vector, когда требуется потокобезопасная коллекция с динамическим изменением размера и когда методы будут вызываться из нескольких потоков одновременно.
Если потокобезопасность не требуется, предпочтение лучше отдать ArrayList, так как он имеет лучшую производительность благодаря отсутствию синхронизации.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-vector-guide
https://proglang.su/java/vector-class
#Java #Training #Medium #Vector
Vector — это класс из пакета java.util, который реализует интерфейсы List, RandomAccess, Cloneable и Serializable. Этот класс предоставляет возможность создания динамически изменяемых массивов, которые могут автоматически увеличивать свой размер.
В отличие от ArrayList, класс Vector является синхронизированным, что делает его безопасным для использования в многопоточной среде без необходимости в дополнительной синхронизации.
История и использование
Vector был введен в первых версиях Java и являлся основным динамическим массивом до появления ArrayList в Java 2 (JDK 1.2). С тех пор, ArrayList стал более предпочтительным выбором для однопоточных приложений благодаря своей более высокой производительности.
Отличия от ArrayList
Синхронизация:
Vector: Все методы класса синхронизированы, что делает его потокобезопасным. Это приводит к некоторому снижению производительности при выполнении операций.
ArrayList: Не синхронизирован. Если требуется потокобезопасность, нужно вручную синхронизировать методы или использовать внешние блокировки.
Увеличение емкости:
Vector: По умолчанию удваивает свой размер при переполнении, что может привести к резкому увеличению памяти.
ArrayList: Увеличивает свою емкость на 50% при необходимости, что делает его более гибким в плане использования памяти.
Методы добавления и удаления элементов:
Оба класса имеют схожие методы для добавления, удаления и доступа к элементам. Однако из-за синхронизации, методы Vector несколько медленнее.
Пример использования Vector
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
// Создание вектора с начальной емкостью 10
Vector<String> vector = new Vector<>(10);
// Добавление элементов
vector.add("Element 1");
vector.add("Element 2");
vector.add("Element 3");
// Чтение элементов
System.out.println("Element at index 1: " + vector.get(1));
// Удаление элемента
vector.remove(2);
// Итерация по элементам
for (String element : vector) {
System.out.println("Element: " + element);
}
}
}
Когда использовать Vector
Используйте Vector, когда требуется потокобезопасная коллекция с динамическим изменением размера и когда методы будут вызываться из нескольких потоков одновременно.
Если потокобезопасность не требуется, предпочтение лучше отдать ArrayList, так как он имеет лучшую производительность благодаря отсутствию синхронизации.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-vector-guide
https://proglang.su/java/vector-class
#Java #Training #Medium #Vector
Baeldung
Intro to Vector Class in Java | Baeldung
Learn about the Vector class and explore some of its most common operations and methods.
Что выведет код?
#Tasks
import java.util.Vector;
public class VectorChallenge {
public static void main(String[] args) {
Vector<Integer> vector = new Vector<>();
vector.add(15);
vector.add(30);
vector.add(45);
vector.add(60);
vector.add(75);
// Iterate and modify
for (int i = 0; i < vector.size(); i++) {
if (vector.get(i) % 30 == 0) {
vector.set(i, vector.get(i) / 2);
}
}
// Add new elements
vector.add(10);
vector.add(20);
int sum = 0;
for (int num : vector) {
sum += num;
}
System.out.println("Sum: " + sum);
}
}
#Tasks