Java for Beginner
716 subscribers
648 photos
173 videos
12 files
1.01K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
IdentityHashMap, отличия от других Map

IdentityHashMap — это специальная реализация интерфейса Map в Java, которая использует оператор == для сравнения ключей и значений вместо метода equals(), который используется в большинстве других реализаций Map. Это означает, что в IdentityHashMap ключи считаются одинаковыми, если они ссылаются на один и тот же объект в памяти, а не если они логически равны.

Отличия от других реализаций Map

Сравнение ключей и значений:

HashMap, TreeMap и другие реализации Map используют метод equals() для сравнения ключей и значений.
IdentityHashMap использует оператор ==, что означает сравнение по ссылке, а не по содержимому.


Производительность:

IdentityHashMap может быть быстрее для некоторых операций, так как оператор == работает быстрее, чем метод equals().
В то же время, IdentityHashMap не гарантирует порядок элементов и не предназначен для использования в случаях, когда важно логическое равенство объектов.


Применение:

IdentityHashMap используется в специализированных случаях, таких как кеширование объектов с уникальными ссылками, когда требуется учитывать именно ссылки, а не содержимое объектов.
Другие реализации, такие как HashMap, подходят для большинства стандартных задач, где важно логическое равенство объектов.


Пример использования
import java.util.IdentityHashMap;
import java.util.Map;

public class IdentityHashMapExample {
public static void main(String[] args) {
Map<String, String> identityMap = new IdentityHashMap<>();

String key1 = new String("key");
String key2 = new String("key");

identityMap.put(key1, "Value 1");
identityMap.put(key2, "Value 2");

System.out.println("Size of IdentityHashMap: " + identityMap.size()); // Output: 2
System.out.println("Value for key1: " + identityMap.get(key1)); // Output: Value 1
System.out.println("Value for key2: " + identityMap.get(key2)); // Output: Value 2

// Compare with HashMap
Map<String, String> hashMap = new HashMap<>();
hashMap.put(key1, "Value 1");
hashMap.put(key2, "Value 2");

System.out.println("Size of HashMap: " + hashMap.size()); // Output: 1
}
}


В этом примере видно, что IdentityHashMap хранит два разных элемента для двух разных объектов key1 и key2, даже если их содержимое идентично. В то время как HashMap считает эти объекты одинаковыми из-за использования метода equals() и перезаписывает значение.

Полезные ссылки для более полного ознакомления с IdentityHashMap (спасибо авторам за их кропотливую работу):
https://www.baeldung.com/java-identityhashmap

#Java #Training #Medium #IdentityHashMap
July 29, 2024
July 29, 2024
Варианты ответа:
Anonymous Quiz
22%
Result: 16
11%
Result: 9
56%
Result: 2
11%
Result: 10
July 29, 2024
July 29, 2024
July 29, 2024
EnumMap, преимущества и особенности

EnumMap — это специализированная реализация интерфейса Map, предназначенная для использования с перечислениями (enum) в качестве ключей. Она отличается высокой производительностью и эффективностью использования памяти по сравнению с другими реализациями Map.

Основные характеристики EnumMap

Ключи — только перечисления:
Ключами в EnumMap могут быть только перечисления (enum). Это означает, что EnumMap предназначена исключительно для использования с типами enum.

Эффективное использование памяти:
EnumMap реализована как массив, что позволяет ей быть более компактной и эффективной по сравнению с другими реализациями Map.

Высокая производительность:
Операции вставки, поиска и удаления имеют постоянное время выполнения (O(1)), что делает EnumMap очень быстрой.

Порядок ключей:
EnumMap хранит ключи в порядке их естественного порядка, определенного в перечислении.


Примеры использования EnumMap


Определение перечисления
enum Color {
RED, GREEN, BLUE;
}


Создание EnumMap


С использованием пустого конструктора:
EnumMap<Color, String> colorMap = new EnumMap<>(Color.class);


С использованием другой карты:

Map<Color, String> anotherMap = new HashMap<>();
anotherMap.put(Color.RED, "Red Color");
anotherMap.put(Color.GREEN, "Green Color");
EnumMap<Color, String> colorMap = new EnumMap<>(anotherMap);


Основные методы EnumMap

Метод put:
colorMap.put(Color.RED, "Red Color");
colorMap.put(Color.GREEN, "Green Color");
System.out.println(colorMap); // {RED=Red Color, GREEN=Green Color}


Метод get:
String color = colorMap.get(Color.RED);
System.out.println("Color for RED: " + color); // Color for RED: Red Color


Метод remove:

String removedColor = colorMap.remove(Color.GREEN);
System.out.println("Removed color: " + removedColor); // Removed color: Green Color
System.out.println(colorMap); // {RED=Red Color}


Метод containsKey:
boolean containsRed = colorMap.containsKey(Color.RED);
System.out.println("Contains RED: " + containsRed); // Contains RED: true


Метод size:
int size = colorMap.size();
System.out.println("Size of the map: " + size); // Size of the map: 1


Метод clear:
colorMap.clear();
System.out.println("Size after clear: " + colorMap.size()); // Size after clear: 0


Преимущества использования EnumMap

Производительность:
EnumMap реализована на основе массива, что делает доступ к элементам очень быстрым. Операции вставки, удаления и поиска имеют время выполнения O(1).

Эффективность использования памяти:
Поскольку EnumMap использует массив для хранения значений, она значительно экономит память по сравнению с другими реализациями Map, такими как HashMap.

Безопасность типов:
EnumMap использует перечисления в качестве ключей, что гарантирует безопасность типов и предотвращает ошибки, связанные с использованием неверных ключей.

Упорядоченность:
Ключи в EnumMap всегда упорядочены в порядке их определения в перечислении, что упрощает их использование и предсказуемость.


Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-enum-map
https://medium.com/@javatechie/java-enummap-e78c7cf0acbf

#Java #Training #Medium #EnumMap
July 30, 2024
July 30, 2024
July 30, 2024
July 30, 2024
July 31, 2024
July 31, 2024
Варианты ответа:
Anonymous Quiz
38%
Result: -3
0%
Result: -5
13%
Result: 1
50%
Result: -9
July 31, 2024
July 31, 2024
July 31, 2024
LinkedList, отличие от ArrayList

LinkedList — это одна из реализаций интерфейса List в Java. Он представляет собой двусвязный список, где каждый элемент содержит ссылки на предыдущий и следующий элементы. LinkedList подходит для сценариев, где часто выполняются операции вставки и удаления элементов в середине списка.

Особенности LinkedList

Двусвязный список:
Каждый элемент в LinkedList содержит ссылки на предыдущий и следующий элементы, что позволяет эффективно добавлять и удалять элементы в середине списка.

Доступ к элементам:
В отличие от ArrayList, доступ к элементам в LinkedList осуществляется линейным поиском, что делает его менее эффективным для операций случайного доступа.

Итерация по элементам:
Поскольку элементы связаны ссылками, итерация по списку может быть выполнена с постоянным использованием памяти и временем для операций добавления и удаления.

Не синхронизированность:
Как и ArrayList, LinkedList не является потокобезопасной коллекцией. В многопоточных средах требуется внешняя синхронизация.

Отличие от ArrayList

Структура хранения:
ArrayList использует массив для хранения элементов, тогда как LinkedList использует двусвязный список.

Время доступа:
ArrayList обеспечивает быстрый доступ к элементам по индексу (O(1)), в то время как LinkedList требует линейного времени (O(n)) для доступа к элементам по индексу.


Вставка и удаление элементов:
Вставка и удаление элементов в середине списка эффективнее в LinkedList (O(1)), в то время как в ArrayList эти операции требуют сдвига элементов и выполняются за время O(n).

Емкость и размер:
В ArrayList размер массива увеличивается автоматически при добавлении элементов, что может привести к перераспределению памяти. LinkedList не имеет проблемы перераспределения памяти, так как элементы связаны ссылками.

Примеры использования
import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
public static void main(String[] args) {
List<String> linkedList = new LinkedList<>();

// Добавление элементов
linkedList.add("Apple");
linkedList.add("Banana");
linkedList.add("Cherry");

// Получение элемента
System.out.println("First element: " + linkedList.get(0)); // Apple

// Вставка элемента
linkedList.add(1, "Orange");
System.out.println("After insertion: " + linkedList); // [Apple, Orange, Banana, Cherry]

// Удаление элемента
linkedList.remove("Banana");
System.out.println("After removal: " + linkedList); // [Apple, Orange, Cherry]

// Итерация по элементам
for (String fruit : linkedList) {
System.out.println(fruit);
}
}
}


Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://habr.com/ru/articles/127864/
https://javarush.com/groups/posts/1938-linkedlist

#Java #Training #Medium #LinkedList
August 1, 2024
August 1, 2024
August 1, 2024
Запоминаем!☝️

https://t.me/Java_for_beginner_dev

#Mems
August 1, 2024
Внутреннее устройство и основные методы 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
August 1, 2024
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
August 2, 2024
Варианты ответа:
Anonymous Quiz
0%
Sum: 115
0%
Sum: 130
20%
Sum: 90
80%
Sum: 120
August 2, 2024