public class Quest {
public static synchronized void main(String[] a) throws InterruptedException {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.start();
Thread.sleep(1000);
System.out.print("Ping");
}
static synchronized void pong() {
System.out.print("Pong");
}
}👍3
👍7❤1
== и .equals()?При сравнении объектов в Java важно понимать различие между
== и .equals().✔️
== сравнивает ссылки на объекты, проверяя, указывают ли они на одну и ту же область памяти.✔️
.equals() используется для сравнения содержимого объектов, если метод переопределен.Пример:
String a = new String("Java");
String b = new String("Java");
System.out.println(a == b); // false (разные ссылки)
System.out.println(a.equals(b)); // true (сравнение содержимого)equals() в вашем классе.#java #equals #comparison
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3
В Java объект
String неизменяемый, что означает, что после создания его состояние нельзя изменить. Но зачем это нужно?1️⃣ Безопасность: неизменяемые строки делают код более безопасным, особенно при работе с потоками или использованием строк в ключах коллекций (например, HashMap).
2️⃣ Производительность: строковые объекты кэшируются в пуле строк (String Pool), что позволяет Java эффективно управлять памятью.
3️⃣ Совместимость: неизменяемость строк облегчает работу с множеством библиотек, так как они не могут непреднамеренно изменить строку.
Пример:
String str = "Hello";
str.concat(" World");
System.out.println(str); // Hello
Хотя метод
concat добавляет строку, оригинальный объект остается неизменным, создавая новый объект в памяти.StringBuilder или StringBuffer.#java #string #immutable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Stream API — мощный инструмент для работы с коллекциями, появившийся в Java 8. Он позволяет писать лаконичный и читаемый код для обработки данных.
1️⃣ Чистый код: меньше циклов и условных конструкций.
2️⃣ Ленивая обработка: Stream API выполняет операции только тогда, когда это необходимо.
3️⃣ Параллелизм: можно легко выполнять операции в несколько потоков.
Пример:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.startsWith("A"))
.forEach(System.out::println); // Alice#java #streamapi #java8
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍17🔥5
Функциональный интерфейс — это интерфейс, содержащий ровно один абстрактный метод. В Java 8 и выше они активно используются для работы с лямбда-выражениями и потоками (Stream API).
Пример:
@FunctionalInterface
interface MyFunctionalInterface {
void execute();
}
public class Main {
public static void main(String[] args) {
MyFunctionalInterface task = () -> System.out.println("Hello, Functional Interface!");
task.execute();
}
}
1️⃣ Интерфейс с аннотацией
@FunctionalInterface может содержать только один абстрактный метод.2️⃣ Можно добавлять
default или static методы без ограничения их количества.#java #functionalinterface #lambda
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3🔥2
Optional — это контейнер, который помогает избежать
NullPointerException, упрощая работу с отсутствующими значениями. Появился в Java 8.📌 Основные методы:
1️⃣
Optional.of(value) — создаёт Optional с непустым значением.2️⃣
Optional.empty() — создаёт пустой Optional.3️⃣
Optional.ofNullable(value) — создаёт Optional, который может быть пустым, если value == null.4️⃣
isPresent() / ifPresent() — проверяет, есть ли значение, или выполняет действие.Пример:
Optional<String> optionalName = Optional.ofNullable(null);
optionalName.ifPresent(name -> System.out.println(name));
System.out.println(optionalName.orElse("Default Name")); // Default Name
Optional вместо null для более чистого и безопасного кода.#java #optional #nullsafe
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
@Override и зачем она нужна?Аннотация
@Override используется для явного указания, что метод переопределяет метод суперкласса.1️⃣ Помогает избежать ошибок, если метод из суперкласса изменен или не существует.
2️⃣ Улучшает читаемость кода.
Пример:
class Parent {
void display() {
System.out.println("Parent");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Child");
}
}@Override, чтобы избежать случайных ошибок при переопределении методов.#java #override #annotations
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝4👍3
final, finally и finalizeЭти три похожих термина часто путают в Java, но у каждого из них свое назначение.
1️⃣
final ключевое слово для объявления:• Констант (переменные, которые нельзя изменить).
• Методов (которые нельзя переопределить).
• Классов (которые нельзя наследовать).
2️⃣
finally блок, используемый с try-catch для выполнения кода независимо от того, было ли выброшено исключение.3️⃣
finalize метод, вызываемый сборщиком мусора перед удалением объекта. Используется редко, так как считается устаревшим.Пример:
final int a = 10;
try {
System.out.println(a);
} finally {
System.out.println("This always executes!");
}
final для повышения читаемости кода, а finally для освобождения ресурсов. Метод finalize лучше избегать.#java #final #finally #finalize
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
public class Quest {
public static void main(String[] args) {
Short b = 50;
inc(b);
System.out.println(b);
}
private static void inc(Short num) {
num++;
}
}👍4
🎉5❤2
HashMap и ConcurrentHashMap1️⃣ HashMap:
• Не потокобезопасен.
• Быстрее в однопоточном окружении.
• Можно получить
ConcurrentModificationException, если итерация выполняется параллельно с изменением данных.2️⃣ ConcurrentHashMap:
• Потокобезопасен.
• Использует сегментацию для увеличения производительности в многопоточном режиме.
• Не выбрасывает
ConcurrentModificationException.Пример:
Map<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value");
ConcurrentHashMap.#java #hashmap #concurrenthashmap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤯3❤1
📌 Что такое
Ключевое слово
✔️ Основные особенности:
1️⃣ Обеспечивает чтение переменной из основной памяти, а не из кэша потока.
2️⃣ Гарантирует видимость изменений между потоками.
Пример:
💡 Ограничение:
#java #volatile #multithreading
volatile и как оно работает?Ключевое слово
volatile в Java используется для переменных, к которым обращаются несколько потоков. Оно гарантирует, что изменения переменной одним потоком будут видны другим.1️⃣ Обеспечивает чтение переменной из основной памяти, а не из кэша потока.
2️⃣ Гарантирует видимость изменений между потоками.
Пример:
class SharedObject {
volatile int count = 0;
}volatile не гарантирует атомарность операций. Для этого используйте synchronized или классы из java.util.concurrent.#java #volatile #multithreading
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1🔥1
default методы в интерфейсах?С появлением Java 8 интерфейсы могут содержать методы с реализацией по умолчанию с помощью ключевого слова
default.1️⃣ Позволяет добавлять новые методы в интерфейс без нарушения обратной совместимости.
2️⃣ Облегчает создание интерфейсов с базовой реализацией.
Пример:
interface MyInterface {
default void defaultMethod() {
System.out.println("Default implementation");
}
}default методы для минимальной реализации интерфейсов без создания дополнительных классов.#java #defaultmethods #java8
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2
AtomicInteger и зачем он нужен?AtomicInteger — это класс из java.util.concurrent.atomic, который предоставляет атомарные операции над int без использования synchronized.1️⃣ Позволяет безопасно изменять значение в многопоточной среде.
2️⃣ Работает быстрее, чем synchronized, так как использует низкоуровневые атомарные операции.
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
private static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) {
count.incrementAndGet(); // Увеличиваем значение на 1
System.out.println(count.get()); // 1
}
}
AtomicInteger, если вам нужны безопасные инкременты/декременты без блокировки.#java #atomicinteger #concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
CopyOnWriteArrayList — это коллекция, которая предоставляет потокобезопасный доступ к данным. Она реализует интерфейс
List и часто используется в многопоточных приложениях, где требуется безопасная работа с коллекцией. 📌 Преимущества CopyOnWriteArrayList
1️⃣ Потокобезопасность: операции чтения выполняются быстро и безопасно, без синхронизации.
2️⃣ Отсутствие блокировок при чтении: читатели не блокируют друг друга, что ускоряет доступ к данным.
3️⃣ Безопасность при итерации: при изменении коллекции (добавление, удаление) итераторы не выбрасывают
ConcurrentModificationException. 📌 Недостатки CopyOnWriteArrayList
1️⃣ Медленные операции записи: при изменении данных создаётся новый массив, что делает операции записи (добавление/удаление) дорогими по времени.
2️⃣ Высокие затраты на память: каждый раз при изменении списка создаётся копия массива, что увеличивает потребление памяти.
3️⃣ Неэффективно для частых изменений: если коллекция часто модифицируется, производительность сильно снижается.
📌 Когда стоит использовать CopyOnWriteArrayList?
- Когда коллекция используется преимущественно для чтения и редко изменяется.
- Когда важно избежать ошибок при многопоточном доступе к коллекции.
💡 Совет: Если ваша коллекция часто изменяется, лучше использовать другие коллекции с явной синхронизацией, такие как
ConcurrentLinkedQueue или Collections.synchronizedList(). #Java #CopyOnWriteArrayList #Потокобезопасность #Коллекции
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Рекурсия — это техника программирования, когда метод вызывает сам себя для решения подзадачи.
1️⃣ Упрощает код, особенно для задач, которые естественно описываются рекурсивно (например, вычисление факториала, обход дерева).
2️⃣ Позволяет заменять циклы более читаемым кодом.
public class Factorial {
static int factorial(int n) {
return (n == 0) ? 1 : n * factorial(n - 1);
}
public static void main(String[] args) {
System.out.println(factorial(5)); // 120
}
}
#java #recursion #factorial
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
