- Эффективен для индексированного доступа (O(1)).
- Используется в основе многих структур данных (ArrayList, HashMap).
- Предсказуем по памяти и производительности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💊2
FileFilter — это интерфейс в пакете java.io, используемый для фильтрации файлов в каталогах. Он применяется в методе listFiles(FileFilter filter) класса File и позволяет выбрать только те файлы, которые соответствуют заданным критериям.Этот интерфейс содержит всего один метод:
boolean accept(File pathname);
Допустим, мы хотим отфильтровать все файлы
.txt в заданной папке:import java.io.File;
import java.io.FileFilter;
public class TxtFileFilterExample {
public static void main(String[] args) {
File directory = new File("C:/example"); // Укажите свою папку
// Используем FileFilter для выбора файлов с расширением .txt
FileFilter txtFilter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.getName().endsWith(".txt");
}
};
// Получаем список файлов, соответствующих фильтру
File[] txtFiles = directory.listFiles(txtFilter);
// Выводим найденные файлы
if (txtFiles != null) {
for (File file : txtFiles) {
System.out.println("Файл: " + file.getName());
}
}
}
}
Выходные данные (если в папке
C:/example есть файлы .txt)Файл: notes.txt
Файл: tasks.txt
Вместо анонимного класса можно использовать лямбда-выражение:
FileFilter txtFilter = file -> file.isFile() && file.getName().endsWith(".txt");FileFilter принимает объект File, позволяя фильтровать как файлы, так и каталоги.FilenameFilter принимает только имя файла (без пути).import java.io.File;
import java.io.FilenameFilter;
public class TxtFilenameFilterExample {
public static void main(String[] args) {
File directory = new File("C:/example");
// Фильтр для файлов .txt
FilenameFilter txtFilter = (dir, name) -> name.endsWith(".txt");
String[] txtFiles = directory.list(txtFilter);
if (txtFiles != null) {
for (String file : txtFiles) {
System.out.println("Файл: " + file);
}
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Основные типы индексов:
- Кластерные (Clustered Index);
- Некластерные (Non-clustered Index);
- Уникальные (Unique Index);
- Полнотекстовые (Full-text Index);
- Пространственные (Spatial Index);
- Покрывающие (Covering Index);
- Частичные (Partial Index).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍2
В Spring оба термина – Bean и Component – связаны с управляемыми объектами, но у них разное предназначение.
@Component делает класс Spring-бином автоматически. Spring сам создаст и зарегистрирует объект в контейнере.
import org.springframework.stereotype.Component;
@Component
public class Car {
public void drive() {
System.out.println("Машина едет...");
}
}
Как получить объект?
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.drive();
}
}
@Bean создаёт Bean вручную в @Configuration-классе. Можно использовать, если нужно передать параметры или создать Bean из библиотеки.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public Car car() {
return new Car(); // Создаём объект вручную
}
}
Как получить Bean?
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Шаблон "Стратегия" используется для выбора алгоритма поведения на лету. Он позволяет определить семейство алгоритмов, инкапсулировать каждый из них и делать их взаимозаменяемыми. Это помогает избежать множества if/switch, а также облегчает расширение и тестирование. Применяется, когда объект должен менять своё поведение в зависимости от контекста, не изменяя свой код.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3
Переопределение методов (Method Overriding) относится к полиморфизму – одному из ключевых принципов ООП.
Переопределение (
Overriding) – это когда подкласс изменяет поведение метода родительского класса. class Animal {
void makeSound() {
System.out.println("Какое-то животное издаёт звук");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Гав-гав!");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Мяу!");
}
}Используем полиморфизм
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // Полиморфизм
myAnimal.makeSound(); // Выведет "Гав-гав!"
}
}Перегрузка (
Overloading) – полиморфизм времени компиляции (Compile-time). Переопределение (
Overriding) – полиморфизм времени выполнения (Runtime). Когда подкласс должен изменить поведение родительского класса.
Когда работаем с абстрактными классами и интерфейсами.
Когда используем полиморфизм для гибкости кода.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Да, помимо Hibernate, JPA реализуют:
- EclipseLink — официальная реализация от Eclipse Foundation.
- OpenJPA — от Apache.
- DataNucleus — поддерживает не только SQL-БД, но и NoSQL.
- TopLink — устаревшая реализация от Oracle.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2💊2
Это способность объектов разных классов реагировать на одинаковые методы по-разному. В Java полиморфизм достигается через наследование, переопределение методов и использование абстрактных классов или интерфейсов.
Наследование и переопределение методов
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // Полиморфизм
Animal myCat = new Cat(); // Полиморфизм
myDog.sound(); // Вывод: Dog barks
myCat.sound(); // Вывод: Cat meows
}
}Использование интерфейсов
interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
public class Main {
public static void main(String[] args) {
Shape shape1 = new Circle(); // Полиморфизм
Shape shape2 = new Rectangle(); // Полиморфизм
shape1.draw(); // Вывод: Drawing a Circle
shape2.draw(); // Вывод: Drawing a Rectangle
}
}Реальный пример использования полиморфизма
class Animal {
public void sound() {
System.out.println("Some generic animal sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Woof Woof");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal[] animals = {new Dog(), new Cat(), new Animal()};
for (Animal animal : animals) {
animal.sound(); // Полиморфный вызов
}
}
}Результат
Woof Woof
Meow
Some generic animal sound
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Буферизация:
- снижает нагрузку на ресурсы;
- уменьшает время доступа к данным;
- позволяет группировать операции, что особенно эффективно при больших объёмах ввода/вывода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
CAP-теорема (Consistency, Availability, Partition Tolerance) утверждает, что в распределенной системе невозможно одновременно обеспечить три свойства:
все узлы видят одни и те же данные в один момент времени.
каждый запрос получает ответ, даже если некоторые узлы вышли из строя.
система продолжает работать, даже если сеть разделилась на изолированные части.
Рассмотрим сценарий с распределенной системой, состоящей из двух узлов (A и B), которые могут обмениваться данными.
узлы A и B больше не могут обмениваться данными.
Теперь у нас есть выбор
это значит, что данные на A и B должны оставаться идентичными. Однако, так как они не могут обмениваться данными, запросы к B не могут быть обработаны до восстановления связи (нарушается доступность).
это значит, что оба узла должны продолжать отвечать на запросы. Однако, так как они не могут синхронизироваться, данные на A и B могут отличаться (нарушается согласованность). Так как разделение сети (P) может произойти в реальных условиях, система вынуждена выбирать между C и A. Таким образом, невозможно одновременно обеспечить все три свойства (C, A, P).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12💊7🤔1
margin — это внешний отступ элемента, пространство между элементом и его соседями.
padding — это внутренний отступ, пространство между содержимым элемента и его границами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊32🤔4👍2
Паттерны проектирования (design patterns) — это готовые решения распространённых задач, возникающих при разработке программного обеспечения.
помогают писать код понятнее и чище.
делают код гибким и масштабируемым.
не нужно изобретать велосипед, а можно использовать проверенные решения.
разработчики могут быстро понимать, как устроена программа, если в ней используются известные паттерны.
управляют созданием объектов.
Определяют, как классы и объекты взаимодействуют.
управляют взаимодействием объектов и потоками выполнения.
public class Singleton {
private static Singleton instance;
private Singleton() {} // Закрытый конструктор
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}Структурные паттерны (определяют отношения между классами и объектами)
// Старый интерфейс
class OldPrinter {
void printText(String text) {
System.out.println("Печать: " + text);
}
}
// Новый интерфейс
interface ModernPrinter {
void print(String text);
}
// Адаптер
class PrinterAdapter implements ModernPrinter {
private final OldPrinter oldPrinter = new OldPrinter();
@Override
public void print(String text) {
oldPrinter.printText(text);
}
}
// Использование
public class AdapterExample {
public static void main(String[] args) {
ModernPrinter printer = new PrinterAdapter();
printer.print("Hello, world!");
}
}
import java.util.ArrayList;
import java.util.List;
// Интерфейс подписчика
interface Observer {
void update(String message);
}
// Интерфейс издателя
class NewsChannel {
private final List<Observer> observers = new ArrayList<>();
void subscribe(Observer observer) {
observers.add(observer);
}
void notifyObservers(String news) {
for (Observer observer : observers) {
observer.update(news);
}
}
}
// Подписчик
class Subscriber implements Observer {
private final String name;
Subscriber(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " получил новость: " + message);
}
}
// Использование
public class ObserverExample {
public static void main(String[] args) {
NewsChannel channel = new NewsChannel();
Observer user1 = new Subscriber("Алиса");
Observer user2 = new Subscriber("Боб");
channel.subscribe(user1);
channel.subscribe(user2);
channel.notifyObservers("Новый выпуск Java 21!");
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
JSON — это текстовый формат хранения структурированных данных. Он хранит пары ключ: значение, поддерживает массивы, объекты, числа, строки, null, логические значения. Используется для обмена данными между клиентом и сервером.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Коллекция
HashMap не является потокобезопасной. Это означает, что при одновременном доступе к нему из нескольких потоков без должной синхронизации могут возникнуть проблемы, такие как потеря данных, гонки за данные и другие виды состояний гонки. Если один поток изменяет ее структуру (например, добавляя или удаляя элементы), в то время как другой поток итерирует по ней или также пытается внести изменения, результаты могут быть непредсказуемыми.Collections.synchronizedMap(Map)Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций.
Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
ConcurrentHashMapПредоставляет потокобезопасную реализацию карты без блокировки всей карты.
ConcurrentHashMap разработан для высокой конкуренции и эффективности при доступе из множества потоков, обеспечивая лучшую производительность по сравнению с synchronizedMap. ConcurrentHashMap позволяет одновременно читать данные из карты несколькими потоками без блокировки и записывать данные при минимальной блокировке.Map<String, String> concurrentMap = new ConcurrentHashMap<>();
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💊2
Если prototype бин внедряется в singleton через
Чтобы получить новый экземпляр при каждом вызове, нужно использовать:
- ObjectFactory,
- Provider,
- или lookup метод.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Spring – это мощный фреймворк для разработки Java-приложений, который упрощает работу с бэкендом, базами данных и веб-сервисами.
Самый быстрый способ – использовать [Spring Initializr](https://start.spring.io/).
Заходим на [start.spring.io](https://start.spring.io/)
Выбираем:
Maven / Gradle
Java 17+
Spring Boot 3+
Зависимости: Spring Web, Spring Data JPA, PostgreSQL/MySQL (если нужна БД)
Скачиваем и открываем в IntelliJ IDEA или VS Code.
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot JPA + Hibernate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Драйвер для PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- Lombok (автоматически генерирует геттеры/сеттеры) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
Контроллер обрабатывает HTTP-запросы (
GET, POST, PUT, DELETE). @RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping
public String sayHello() {
return "Привет, Spring!";
}
}
Запрос в браузере
http://localhost:8080/hello
Ответ
Привет, Spring!
Сервисы обрабатывают данные и реализуют бизнес-логику.
@Service
public class UserService {
public String getUserGreeting(String name) {
return "Привет, " + name + "!";
}
}
Использование сервиса в контроллере
@RestController
@RequestMapping("/user")
public class UserController {
private final UserService userService;
@Autowired // Внедрение зависимости
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{name}")
public String getUserGreeting(@PathVariable String name) {
return userService.getUserGreeting(name);
}
}
Запрос в браузере:
http://localhost:8080/user/Иван
Ответ
Привет, Иван!
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
assert используется для встроенного тестирования логики программы во время разработки. Он проверяет условие, и если оно ложно — выбрасывается AssertionError.
Обычно применяется для проверки инвариантов, предположений или недостижимого кода, но может быть отключён в production-сборках.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Модель памяти Java (Java Memory Model, JMM) определяет, как взаимодействуют потоки через память и как изменения, сделанные одним потоком, становятся видимыми для других потоков. Модель памяти Java является фундаментальной частью многопоточной среды в Java, обеспечивающей корректность и предсказуемость поведения многопоточных программ.
JMM определяет, как потоки взаимодействуют с переменными (данными), хранящимися в общей памяти. Каждая переменная в Java хранится в основной памяти (main memory), и потоки могут иметь локальные копии этих переменных в своих рабочих кешах.
Когда поток читает переменную, он может читать ее из своей локальной копии или из основной памяти. Когда поток записывает переменную, он может записывать ее в свою локальную копию или непосредственно в основную память.
Последовательная согласованность гарантирует, что действия всех потоков будут выполняться в том порядке, в котором они были написаны в коде, если нет явных указаний на обратное.
Видимость означает, что изменения, сделанные одним потоком, становятся видимыми для других потоков. В JMM видимость изменений обеспечивается с помощью синхронизации.
JMM допускает оптимизации, такие как переупорядочивание инструкций, чтобы улучшить производительность, но гарантирует, что видимость и порядок выполнения будут сохраняться, как описано в спецификации.
public class VisibilityExample {
private static boolean flag = false;
private static int counter = 0;
public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
counter = 42;
flag = true;
});
Thread reader = new Thread(() -> {
while (!flag) {
// Ждем пока флаг не станет true
}
System.out.println("Counter: " + counter);
});
writer.start();
reader.start();
writer.join();
reader.join();
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1💊1
2. Структурные: Adapter, Decorator, Composite, Proxy.
3. Поведенческие: Observer, Strategy, Command, State, Chain of Responsibility.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3
As-If-Serial Semantics – это принцип оптимизации компилятором, при котором код может перестраиваться, но результат его выполнения остаётся таким же, как если бы инструкции выполнялись строго по порядку. Обычный код
int a = 10;
int b = 20;
int c = a + b;
System.out.println(c);
Что может сделать компилятор?
int c = 30;
System.out.println(c);
Менять порядок инструкций, если это не влияет на результат.
Удалять лишние переменные и вычисления.
Заменять выражения константами (
10 + 20 → 30). int x = 5;
int y = 10;
x = x + 1; // x = 6
System.out.println(y);
Компилятор может поменять местами
y и xint y = 10;
int x = 6;
System.out.println(y);
int x = 10;
int y = x + 5;
x = 20;
System.out.println(y);
Если поменять порядок
x = 20;
int y = x + 5; // ❌ Неверно! y теперь 25, а должно быть 15
В многопоточной среде компилятор может менять порядок команд внутри одного потока, но он не знает о другом потоке!
Опасный пример без
volatile boolean ready = false;
int data = 0;
void writer() {
data = 42;
ready = true;
}
void reader() {
if (ready) {
System.out.println(data); // Может напечатать 0 из-за перестановки!
}
}
Решение –
volatile для readyvolatile boolean ready = false;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5