Это вложенный класс, объявленный с использованием ключевого слова
static. К классам верхнего уровня модификатор static неприменим.Статический вложенный класс имеет несколько особенностей, отличающих его от обычных вложенных классов:
1️⃣ Нет привязки к экземпляру внешнего класса
Статический вложенный класс не связан с экземпляром внешнего класса. Это означает, что он может быть создан без необходимости создавать объект внешнего класса. В отличие от обычного вложенного класса, который всегда ассоциирован с экземпляром внешнего класса, статический вложенный класс может быть использован независимо.
2️⃣ Доступ к членам внешнего класса
Статический вложенный класс может обращаться только к статическим членам (поля и методы) внешнего класса. Он не имеет доступа к нестатическим членам внешнего класса, поскольку не существует привязки к экземпляру внешнего класса.
Пример:
public class OuterClass {
private static int staticVar = 10;
private int nonStaticVar = 20;
static class StaticNestedClass {
void display() {
// Доступ к статическому полю внешнего класса
System.out.println("Static variable from outer class: " + staticVar);
// Ошибка компиляции: нестатическое поле нельзя использовать в статическом вложенном классе
// System.out.println("Non-static variable from outer class: " + nonStaticVar);
}
}
}
public class Main {
public static void main(String[] args) {
// Создаем экземпляр статического вложенного класса
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
nestedObject.display();
}
}
Для чего используется:
✔️ Когда вложенный класс не должен иметь доступа к состоянию экземпляра внешнего класса.
✔️ Когда вложенный класс используется для представления логически связанного функционала, но не зависит от состояния внешнего объекта.
#java #static #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1
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
