Easy Java
5.22K subscribers
311 photos
51 videos
463 links
Лучшие обучающие материалы и другие полезности для Java-разработчиков.

Сотрудничество: @heywan_n1

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Download Telegram
☕️ Барьеры и модели памяти

В этой статье разберём, какие проблемы могут возникнуть при переносе сервисов между архитектурами x86/64 и ARM из-за различий в моделях памяти. Узнаем, как барьеры памяти помогают управлять многопоточностью и какие подводные камни могут ожидать разработчиков.

Автор подробно объясняет, что такое модели памяти и барьеры памяти, делится личным опытом и предлагает визуально понятные материалы для глубокого понимания темы.


Ссылка на статью

➡️ Easy Java | #Статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤯32
🟢 Optional: Избегаем NullPointerException

В Java класс Optional помогает избежать NullPointerException и делает код читаемым и безопасным.


📌 Пример:

import java.util.Optional;

public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = getName();

// Используем ifPresentOrElse
name.ifPresentOrElse(
n -> System.out.println("Имя: " + n),
() -> System.out.println("Имя отсутствует")
);
}

public static Optional<String> getName() {
return Math.random() > 0.5 ? Optional.of("Алиса") : Optional.empty();
}
}


👍 Разбор:

✔️ Optional.of(value) — создаёт Optional, если значение не null.
✔️ Optional.empty() — создаёт пустой Optional.
✔️ ifPresentOrElse() — удобный способ обработать Optional.

💡 Запомни:

✔️ Optional помогает избежать NullPointerException.
✔️Используй ifPresentOrElse() вместо if (obj != null).

📍 Теги: #java #optional #null #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
Map: Группировка данных с Collectors.groupingBy()

В Java можно группировать данные в Map, используя Collectors.groupingBy().


📌 Пример:

import java.util.*;
import java.util.stream.Collectors;

public class GroupingExample {
public static void main(String[] args) {
List<String> words = List.of("apple", "banana", "avocado", "blueberry", "cherry");

Map<Character, List<String>> groupedWords = words.stream()
.collect(Collectors.groupingBy(word -> word.charAt(0)));

System.out.println(groupedWords);
}
}

✔️ Вывод:
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}



🔹 Разбор:

✔️ groupingBy() — группирует данные по ключу.
✔️ word.charAt(0) — используем первую букву слова как ключ.
✔️ В результате получается Map<Character, List<String>>.

💡 Запомни:

✔️ groupingBy() удобно использовать для агрегации данных.
✔️ Можно комбинировать с mapping() для преобразования значений.

📍 Теги: #java #stream #collectors #groupingBy #collections
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩5👍31
🍿 Как работает сериализация в Java?

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

В этой статье мы рассмотрим основы сериализации и некоторые нюансы, связанные с ней. И, конечно, посмотрим, как она работает изнутри.


🔤 Читать статью 🔤

➡️ Easy Java | #Статьи #Полезно
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Recursion vs Iteration: Что выбрать?🗳

Рекурсия и итерация — два способа решения задач. Какой выбрать?

📌 Факториал: Рекурсия vs Итерация

✔️ Рекурсия:

public static int factorialRecursive(int n) {
return (n == 1) ? 1 : n * factorialRecursive(n - 1);
}


✔️ Итерация:

public static int factorialIterative(int n) {
int result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}


👍 Разбор:

✔️ Рекурсия удобна для разделяй и властвуй, но может вызвать StackOverflowError.
✔️ Итерация эффективнее по памяти, но иногда менее читаема.
✔️ В Java лучше избегать глубоких рекурсий из-за ограниченного стека.

💡 Запомни:

✔️ Рекурсия = удобство, но риск StackOverflowError.
✔️ Итерация = производительность и безопасность.

📍 Теги: #java #recursion #iteration #performance #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🤔3
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥14😭124
Media is too big
VIEW IN TELEGRAM
👩‍💻 Java - Полный Курс по Java

В этом видеокурсе автор пошагово и простым языком ознакомит вас с важными концепциями языка Java.

Преподаватель на практике показывает — как, что и зачем делать, прямо в редакторе кода.



🔤 Ссылка на источник 🔤

Easy Java |#Видео #Курсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔3🔥1
🟢 1. Ошибка: == vs equals() при сравнении строк

В Java строки (String) сравниваются не через ==, а с equals(), иначе возможны ошибки.

📌 Ошибка:

public class StringComparison {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");

System.out.println(s1 == s2); // false (сравнение ссылок)
System.out.println(s1.equals(s2)); // true (сравнение значений)
}
}


👍 Разбор:

✔️ == сравнивает ссылки на объекты в памяти, а не значения.
✔️ equals() сравнивает сами строки.


✔️ Правильный вариант:


if (s1.equals(s2)) {
System.out.println("Строки равны ");
}


💡 Запомни:

✔️ Используй equals() для строк.
✔️ == работает только для пулла строк (String s1 = "hello"; String s2 = "hello";).

А вы знали об этом?

📍 Теги: #java #string #equals #mistakes #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🤯32
Ошибка: ConcurrentModificationException при итерации по списку.

При изменении ArrayList во время итерации можно получить ConcurrentModificationException.

Ошибка:

import java.util.*;

public class ConcurrentModExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5));

for (Integer num : numbers) {
if (num % 2 == 0) {
numbers.remove(num); // ConcurrentModificationException
}
}
}
}



👍 Разбор:

✔️ ArrayList использует модификационный счётчик, который ломается при изменении коллекции во время итерации.
✔️ for-each использует Iterator, который не поддерживает удаление элементов во время итерации.

✔️ Правильный вариант 1: Использовать Iterator.remove()

Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
if (iterator.next() % 2 == 0) {
iterator.remove(); // Работает корректно
}
}


✔️ Правильный вариант 2: Использовать removeIf()

numbers.removeIf(n -> n % 2 == 0); //  Удаляет без исключений


💡 Запомни:

✔️ for-each нельзя использовать для удаления элементов.
✔️ Используй Iterator.remove() или removeIf().

А вы знали об этом?

📍 Теги: #java #concurrentmodification #collections #mistakes #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥127👍5😭1
Ошибка: Автоупаковка (Autoboxing) и производительность.

В Java Integer, Double и другие обёртки примитивов (wrapper classes) используют автоупаковку (autoboxing), которая может снижать производительность.

Ошибка:

public class AutoboxingExample {
public static void main(String[] args) {
Integer sum = 0; // Используем обёртку вместо int

for (int i = 0; i < 1_000_000; i++) {
sum += i; // Автоупаковка на каждой итерации (int → Integer)
}

System.out.println(sum);
}
}


Проблема:

🚨 На каждой итерации создаётся новый объект Integer, что замедляет программу!

✔️ Правильный вариант:

int sum = 0; //  Используем int
for (int i = 0; i < 1_000_000; i++) {
sum += i;
}
System.out.println(sum);



👍 Разбор:

✔️ Автоупаковка создаёт новые объекты, что увеличивает потребление памяти и замедляет код.
✔️ Используй примитивные типы (int, double) там, где не нужна обёртка.

💡 Запомни:

✔️ int быстрее, чем Integer.
✔️ Избегай ненужной автоупаковки в циклах.

А вы знали об этом?

📍 Теги: #java #autoboxing #performance #mistakes #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍195
Please open Telegram to view this post
VIEW IN TELEGRAM
😁35😭5😎41
👨‍💻 Задача: Найти два числа в массиве, сумма которых равна целевому значению

📌 Условие:

Дан массив целых чисел и целевое число target. Нужно найти два числа, сумма которых равна target, и вернуть их индексы.
Гарантируется, что решение всегда существует.

✔️ Примеры:

Input: nums = [2, 7, 11, 15], target = 9  
Output: [0, 1] // (2 + 7 = 9)

Input: nums = [3, 2, 4], target = 6
Output: [1, 2] // (2 + 4 = 6)


📌 Решение:

import java.util.HashMap;
import java.util.Map;

public class TwoSum {
public static int[] findTwoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();

for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];

if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}

map.put(nums[i], i);
}

throw new IllegalArgumentException("Решение не найдено");
}

public static void main(String[] args) {
int[] nums = {2, 7, 11, 15};
int target = 9;

int[] result = findTwoSum(nums, target);
System.out.println("[" + result[0] + ", " + result[1] + "]");
}
}


👍 Разбор:

✔️ Используем HashMap для хранения чисел и их индексов.
✔️ Одним проходом по массиву за O(n) проверяем, есть ли нужное число.
✔️ Если target - nums[i] уже есть в map, возвращаем пару индексов.

💡 Запомни:

✔️ HashMap даёт поиск за O(1), что делает алгоритм эффективным.
✔️ Использование map.containsKey() позволяет избежать вложенных циклов.

А вы знали об этом?

📍 Теги: #java #tasks #algorithms #hashmap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123
Какой вариант правильный?
Anonymous Quiz
5%
A
10%
B
82%
C
3%
D
🔥12
Ошибка: Сравнение строк через == вместо .equals()

🚨 Одна из самых частых ошибок в Java — сравнение строк через ==.

Ошибка ⚠️ :
public class StringComparison {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2); // true (оба строки из пула строк)
System.out.println(str1 == str3); // false (разные объекты в памяти)
}
}


Что произошло

🚨 == сравнивает ссылки в памяти, а не содержимое строк!

✔️ Правильный вариант:

System.out.println(str1.equals(str2)); //  true
System.out.println(str1.equals(str3)); // true



👍 Разбор:

✔️ == проверяет ссылки, а не содержимое строк.
✔️ Используй .equals() для сравнения значений строк.
✔️ intern() можно использовать для приведения строк в пул строк.

💡 Запомни:

✔️ == сравнивает ссылки.
✔️ .equals() сравнивает содержимое.
✔️ intern() делает строки из new String() частью пула строк.

А вы знали об этом?

📍 Теги: #java #mistakes #bestpractices #string
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍54
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣18😁12🤔6🤯1😭1
2
Какой вариант правильный?🌈
Anonymous Quiz
13%
A
31%
B
47%
C
9%
D
Добрый вечер, дорогие подписчики!

Как вам наша новая рубрика Викторина? Нравится ли вам такой формат? Хотели бы видеть её чаще? Делитесь своими впечатлениями в комментариях – нам важно ваше мнение!
👍656🔥4🤔1🤓1
🟢 Как правильно использовать Optional в Java

В Java Optional помогает избежать NullPointerException. Давай разберём, как его использовать!

📌 Пример:

import java.util.Optional;

public class OptionalExample {
public static void main(String[] args) {
Optional<String> optionalValue = getValue();

// Правильное использование Optional
String result = optionalValue.orElse("Значение по умолчанию");
System.out.println(result);
}

public static Optional<String> getValue() {
return Optional.ofNullable(null); // Имитация возможного null
}
}



👍 Разбор:

✔️ Optional.ofNullable(value) – создаёт Optional, который может быть пустым.
✔️ .orElse("Значение по умолчанию") – возвращает значение или подставляет дефолтное.
✔️ Избегаем NullPointerException!

💡 Запомни:

✔️ Используй Optional для работы с возможными null.
✔️ .orElse(), .orElseGet(), .ifPresent() – удобные методы для обработки значений.

А вы знали об этом?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍73
🟢 Почему нельзя изменять список внутри for-each?

В Java изменение списка (List) внутри for-each приведёт к ConcurrentModificationException. Давай разберёмся, как правильно удалять элементы!

📌 Ошибка при удалении в for-each:

import java.util.*;

public class ForEachModification {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

for (Integer num : numbers) {
if (num % 2 == 0) {
numbers.remove(num); // ConcurrentModificationException
}
}

System.out.println(numbers);
}
}


👍 Как правильно удалять элементы?

✔️ Используем Iterator.remove():

Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
if (iterator.next() % 2 == 0) {
iterator.remove(); // Правильный способ удаления
}
}


✔️ Используем removeIf() (Java 8+):


numbers.removeIf(n -> n % 2 == 0); //  Удаление без исключений


👍 Разбор:

✔️ for-each использует Iterator под капотом, но не позволяет безопасно изменять коллекцию.
✔️ remove() внутри for-each изменяет список, вызывая ConcurrentModificationException.
✔️ Итератор обнаруживает изменения структуры и выбрасывает исключение.

💡 Запомни:

✔️ Нельзя изменять List внутри for-each.
✔️ Используй Iterator.remove() или removeIf().
✔️ ConcurrentModificationException возникает при изменении коллекции во время итерации.

А вы знали об этом?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🤔4