Java for Beginner
676 subscribers
545 photos
155 videos
12 files
836 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Суровая правда жизни🤌

https://t.me/Java_for_beginner_dev

#Mems
Основные методы TreeMap и их применение

Конструкторы TreeMap

Без параметров
TreeMap<String, Integer> map = new TreeMap<>();


С компаратором

TreeMap<String, Integer> map = new TreeMap<>(Comparator.reverseOrder());


Из другого Map
Map<String, Integer> anotherMap = new HashMap<>();
TreeMap<String, Integer> map = new TreeMap<>(anotherMap);


Из SortedMap
SortedMap<String, Integer> sortedMap = new TreeMap<>(anotherMap);
TreeMap<String, Integer> map = new TreeMap<>(sortedMap);


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

Метод put

Добавляет пару ключ-значение. Если ключ уже существует, то значение обновляется.
TreeMap<String, Integer> map = new TreeMap<>();
map.put("Apple", 50);
map.put("Banana", 30);
map.put("Orange", 20);


Метод get

Возвращает значение, связанное с указанным ключом.
Integer value = map.get("Apple");
System.out.println("Value for key 'Apple': " + value);


Метод remove

Удаляет запись по ключу и возвращает удаленное значение.
Integer removedValue = map.remove("Banana");
System.out.println("Removed value: " + removedValue);


Метод containsKey

Проверяет, содержится ли ключ в карте.
boolean contains = map.containsKey("Orange");
System.out.println("Contains key 'Orange': " + contains);


Метод containsValue

Проверяет, содержится ли значение в карте.
boolean containsValue = map.containsValue(20);
System.out.println("Contains value 20: " + containsValue);


Метод size

Возвращает количество элементов в карте.
int size = map.size();
System.out.println("Size of the map: " + size);


Метод isEmpty

Проверяет, пуста ли карта.
boolean isEmpty = map.isEmpty();
System.out.println("Is the map empty: " + isEmpty);


Метод clear

Очищает карту, удаляя все элементы.
map.clear();
System.out.println("Size after clear: " + map.size());


Специфические методы TreeMap

Метод firstKey

Возвращает первый (минимальный) ключ.
String firstKey = map.firstKey();
System.out.println("First key: " + firstKey);


Метод lastKey

Возвращает последний (максимальный) ключ.
String lastKey = map.lastKey();
System.out.println("Last key: " + lastKey);


Метод pollFirstEntry

Удаляет и возвращает первый (минимальный) элемент.
Map.Entry<String, Integer> firstEntry = map.pollFirstEntry();
System.out.println("Polled first entry: " + firstEntry);


Метод pollLastEntry


Удаляет и возвращает последний (максимальный) элемент.
Map.Entry<String, Integer> lastEntry = map.pollLastEntry();
System.out.println("Polled last entry: " + lastEntry);



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

Пример 1: Печать элементов в порядке возрастания ключей
TreeMap<String, Integer> map = new TreeMap<>();
map.put("Apple", 50);
map.put("Banana", 30);
map.put("Orange", 20);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}


Пример 2: Использование метода subMap

Возвращает отображение части карты.
map.put("Grapes", 40);
SortedMap<String, Integer> subMap = map.subMap("Apple", "Orange");
for (Map.Entry<String, Integer> entry : subMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}


Пример 3: Получение диапазона ключей
NavigableMap<String, Integer> tailMap = map.tailMap("Banana", true);
for (Map.Entry<String, Integer> entry : tailMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}

#Java #Training #Medium #TreeMap
WeakHashMap, особенности использования

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

Основные особенности WeakHashMap

Слабые ссылки: Ключи в WeakHashMap хранятся как слабые ссылки. Это значит, что если на объект-ключ нет жестких ссылок из других объектов, то он может быть удален сборщиком мусора.
Автоматическое удаление: При удалении ключа сборщиком мусора, соответствующая пара ключ-значение также удаляется из карты.
Потокобезопасность: WeakHashMap не является потокобезопасной и требует внешней синхронизации при доступе из нескольких потоков.


Внутреннее устройство WeakHashMap

WeakHashMap основан на массиве сегментов (bucket), где каждая ячейка массива может содержать связанный список элементов, как в HashMap. Однако, ключи хранятся в виде слабых ссылок (WeakReference), что позволяет сборщику мусора удалять их при необходимости.


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

Создание и добавление элементов
import java.util.WeakHashMap;
import java.util.Map;

public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<String, String> weakMap = new WeakHashMap<>();

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

weakMap.put(key1, "value1");
weakMap.put(key2, "value2");

System.out.println("Before GC: " + weakMap);

key1 = null;
System.gc();

// Подождем немного, чтобы GC мог удалить key1
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("After GC: " + weakMap);
}
}


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

Метод put

Добавляет пару ключ-значение в карту.
WeakHashMap<String, Integer> map = new WeakHashMap<>();
map.put("Apple", 50);
map.put("Banana", 30);


Метод get

Возвращает значение, связанное с указанным ключом.
Integer value = map.get("Apple");
System.out.println("Value for key 'Apple': " + value);


Метод remove

Удаляет запись по ключу и возвращает удаленное значение.
Integer removedValue = map.remove("Banana");
System.out.println("Removed value: " + removedValue);


Метод containsKey


Проверяет, содержится ли ключ в карте.
boolean contains = map.containsKey("Apple");
System.out.println("Contains key 'Apple': " + contains);


Метод containsValue

Проверяет, содержится ли значение в карте.
boolean containsValue = map.containsValue(50);
System.out.println("Contains value 50: " + containsValue);


Метод size

Возвращает количество элементов в карте.
int size = map.size();
System.out.println("Size of the map: " + size);


Метод isEmpty

Проверяет, пуста ли карта.
boolean isEmpty = map.isEmpty();
System.out.println("Is the map empty: " + isEmpty);


Метод clear

Очищает карту, удаляя все элементы.
map.clear();
System.out.println("Size after clear: " + map.size());



Особенности использования WeakHashMap

Кеширование

WeakHashMap идеально подходит для кеширования данных, которые можно восстанавливать, если они удалены сборщиком мусора. Например, кеширование изображений в приложении, где изображения могут быть загружены повторно, если они были удалены.

Автоматическое удаление
В ситуациях, когда необходимо автоматически удалять элементы карты при отсутствии ссылок на ключи, WeakHashMap будет полезен. Например, для ассоциации метаданных с объектами без предотвращения их сборки мусора.


Полезные ссылки для более полного ознакомления с WeakHashMap (спасибо авторам за их кропотливую работу):
https://www.baeldung.com/java-weakhashmap
https://javarush.com/quests/lectures/questservlets.level18.lecture08

#Java #Training #Medium #WeakHashMap
Что выведет код?

import java.util.*;

public class AlgorithmChallenge {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 2, 8, 7, 1);
Collections.sort(numbers, (a, b) -> b - a);

int sum = 0;
for (int i = 0; i < numbers.size(); i++) {
if (i % 2 == 0) {
sum += numbers.get(i) * 2;
} else {
sum -= numbers.get(i) * 3;
}
}
System.out.println("Result: " + sum);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
0%
3
14%
5
29%
14
57%
1
Таких не берут в Junior'ы😁

https://t.me/Java_for_beginner_dev

#Mems
Внутреннее устройство WeakHashMap

Основные компоненты

Бакеты:


WeakHashMap использует массив бакетов для хранения элементов. Каждый бакет представляет собой связанный список, который хранит элементы с одинаковым значением хэш-кода (коллизии).

Слабые ссылки (Weak References):

Ключи в WeakHashMap хранятся в виде слабых ссылок (java.lang.ref.WeakReference). Это означает, что ключи могут быть удалены сборщиком мусора, если на них больше нет жестких ссылок.

Структура записи (Entry):

Каждый элемент в WeakHashMap представлен экземпляром внутреннего класса WeakHashMap.Entry. Этот класс расширяет WeakReference<K> и содержит дополнительные поля для значения (V) и ссылки на следующий элемент в связанном списке (для коллизий).

Сборка мусора:

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


Механизм работы

Хэширование:

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

Добавление элементов:

Новый элемент добавляется в соответствующий бакет. Если бакет уже содержит элементы с одинаковым хэш-кодом, новый элемент добавляется в конец связанного списка.

Удаление элементов:

Когда ключ становится недоступным для приложения (не имеет жестких ссылок), сборщик мусора удаляет его запись из памяти. WeakHashMap автоматически удаляет такие записи при следующем доступе или модификации.

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

Пример 1: Простой пример использования WeakHashMap
import java.util.WeakHashMap;

public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<String, String> map = new WeakHashMap<>();

String key1 = new String("key1");
String value1 = "value1";
map.put(key1, value1);

String key2 = new String("key2");
String value2 = "value2";
map.put(key2, value2);

System.out.println("Map before GC: " + map);

// Убираем жесткие ссылки на ключи
key1 = null;
key2 = null;

// Вызываем сборщик мусора
System.gc();

// Небольшая задержка для того, чтобы сборщик мусора успел сработать
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Map after GC: " + map);
}
}


В этом примере мы создаем WeakHashMap и добавляем в нее две пары ключ-значение. Затем убираем жесткие ссылки на ключи и вызываем сборщик мусора. После сборки мусора элементы с ключами, на которые больше нет жестких ссылок, удаляются из карты.

Пример 2: Использование WeakHashMap для кеширования
WeakHashMap часто используется для кеширования данных, которые могут быть автоматически удалены, когда они больше не нужны. Это позволяет эффективно управлять памятью.
import java.util.WeakHashMap;

public class ImageCache {
private WeakHashMap<String, byte[]> cache = new WeakHashMap<>();

public byte[] getImage(String imageName) {
byte[] image = cache.get(imageName);
if (image == null) {
image = loadImageFromDisk(imageName);
cache.put(imageName, image);
}
return image;
}

private byte[] loadImageFromDisk(String imageName) {
// Заглушка для примера, возвращаем пустой массив
return new byte[0];
}

public static void main(String[] args) {
ImageCache imageCache = new ImageCache();
byte[] image1 = imageCache.getImage("image1.png");
byte[] image2 = imageCache.getImage("image2.png");

System.out.println("Image1 loaded: " + (image1 != null));
System.out.println("Image2 loaded: " + (image2 != null));
}
}

#Java #Training #Medium #WeakHashMap
Всем доброго солнечного субботнего утра! ☀️

За окном +30 градусов, а это значит надо отдыхать!

Делитесь, как Вы проводите эти выходные?
Напоминаю!☝️

Завтра в 16:00 по МСК, мы вновь собираемся на онлайн-кодинг!

Писать будем игру Пинг-Понг изучая библиотеки Swing и Awt!

А вы придете?🧐
На рабочий стол. Однозначно😏

https://t.me/Java_for_beginner_dev

#Mems
This media is not supported in your browser
VIEW IN TELEGRAM
Запись нашей сегодняшней встречи -
https://youtu.be/PqW7agFgVts

Огромная благодарность @MrAbhorrent, @vovs03, @Alexander_Gors за участие и подсказки!

Сегодня мы создали консольную игру пинг-понг, в которую можно без проблем поиграть)))

Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб канал!

Гит репозиторий с результатом - https://github.com/Oleborn/Ping_Pong_Project

Всем хорошего настроения! 👻
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
Что выведет код?

import java.util.ArrayList;
import java.util.Collections;

public class ArrayListChallenge {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
Collections.addAll(numbers, 3, 1, 4, 1, 5, 9, 2, 6, 5);

int result = 0;
for (int i = 0; i < numbers.size(); i++) {
if (i % 2 == 0) {
result += numbers.get(i);
} else {
result -= numbers.get(i);
}
}

System.out.println("Result: " + result);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
25%
Result: 16
13%
Result: 9
63%
Result: 2
0%
Result: 10
Основные методы IdentityHashMap и примеры использования

IdentityHashMap предоставляет основные методы интерфейса Map, такие как добавление, удаление и получение элементов.

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

put(K key, V value): Добавляет пару ключ-значение в карту.
get(Object key): Возвращает значение, связанное с указанным ключом.
remove(Object key): Удаляет элемент по указанному ключу.
size(): Возвращает количество элементов в карте.
containsKey(Object key): Проверяет, содержит ли карта указанный ключ.
containsValue(Object value): Проверяет, содержит ли карта указанное значение.
keySet(): Возвращает набор всех ключей в карте.
values(): Возвращает коллекцию всех значений в карте.
entrySet(): Возвращает набор всех пар ключ-значение в карте.


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

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

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

// Метод put
identityMap.put(key1, "Value 1");
identityMap.put(key2, "Value 2");

// Метод get
System.out.println("Value for key1: " + identityMap.get(key1)); // Output: Value 1
System.out.println("Value for key2: " + identityMap.get(key2)); // Output: Value 2

// Метод size
System.out.println("Size of IdentityHashMap: " + identityMap.size()); // Output: 2

// Метод containsKey
System.out.println("Contains key1: " + identityMap.containsKey(key1)); // Output: true
System.out.println("Contains new key: " + identityMap.containsKey(new String("key"))); // Output: false

// Метод containsValue
System.out.println("Contains Value 1: " + identityMap.containsValue("Value 1")); // Output: true

// Метод remove
identityMap.remove(key1);
System.out.println("Size after removing key1: " + identityMap.size()); // Output: 1

// Методы keySet, values, entrySet
System.out.println("Keys: " + identityMap.keySet()); // Output: [key2]
System.out.println("Values: " + identityMap.values()); // Output: [Value 2]
System.out.println("Entries: " + identityMap.entrySet()); // Output: [key2=Value 2]
}
}


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


#Java #Training #Medium #IdentityHashMap
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
Что выведет код?

public class VariableChallenge {
public static void main(String[] args) {
long a = 123456789012345L;
boolean b = true;
double c = 1.2345;

double result = (b ? a * c : a / c) + (b && a > 1000000000 ? c : a);

System.out.println("Result: " + result);
}
}


#Tasks
Внутренняя структура EnumMap

EnumMap состоит из двух основных массивов: один для ключей и один для значений.


Массив ключей (keyUniverse):


Это массив всех возможных значений перечисления в том порядке, в котором они объявлены. Он создается один раз и используется для быстрого поиска индексов ключей.
private final Enum<?>[] keyUniverse;


keyUniverse инициализируется следующим образом:
keyUniverse = keyType.getEnumConstants();


Здесь keyType — это класс перечисления, переданный в конструктор EnumMap.

Массив значений (values):

Это массив значений, который соответствует ключам. Индекс значения в этом массиве соответствует индексу ключа в массиве keyUniverse.
private transient Object[] values;


Инициализация массива values:
values = new Object[keyUniverse.length];


Изначально все элементы массива values равны null.

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

Пример 1: Карта настроек цветов
enum Color {
RED, GREEN, BLUE;
}

public class EnumMapExample {
public static void main(String[] args) {
EnumMap<Color, String> colorMap = new EnumMap<>(Color.class);

colorMap.put(Color.RED, "Red Color");
colorMap.put(Color.GREEN, "Green Color");
colorMap.put(Color.BLUE, "Blue Color");

for (Color color : colorMap.keySet()) {
System.out.println(color + ": " + colorMap.get(color));
}
}
}


Пример 2: Использование EnumMap в качестве счетчика
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public class EnumMapCounter {
public static void main(String[] args) {
EnumMap<Day, Integer> dayCount = new EnumMap<>(Day.class);

// Инициализация счетчика для каждого дня недели
for (Day day : Day.values()) {
dayCount.put(day, 0);
}

// Увеличиваем счетчики для некоторых дней
dayCount.put(Day.MONDAY, dayCount.get(Day.MONDAY) + 1);
dayCount.put(Day.FRIDAY, dayCount.get(Day.FRIDAY) + 2);
dayCount.put(Day.SUNDAY, dayCount.get(Day.SUNDAY) + 3);

// Выводим результаты
for (Day day : dayCount.keySet()) {
System.out.println(day + ": " + dayCount.get(day));
}
}
}


#Java #Training #Medium #EnumMap