🤔 Чем отличаются и что общего у InputStream, OutputStream, Reader, Writer?
- InputStream/OutputStream — работают с байтами;
- Reader/Writer — работают с символами (учитывают кодировки);
- Все они поддерживают потоки данных, но различаются уровнем абстракции (байты vs символы).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- InputStream/OutputStream — работают с байтами;
- Reader/Writer — работают с символами (учитывают кодировки);
- Все они поддерживают потоки данных, но различаются уровнем абстракции (байты vs символы).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Используешь в работе Lambda-выражения?
Да, лямбда-выражения являются важной частью современной разработки на Java, и я активно их использую в своей работе. Лямбда-выражения помогают писать более лаконичный и выразительный код, особенно при работе с коллекциями и потоками данных. Вот несколько распространенных случаев использования лямбда-выражений в Java:
🟠Итерация по коллекциям
Использование лямбда-выражений с методом
🟠Фильтрация и преобразование коллекций
С использованием Stream API и лямбда-выражений можно легко фильтровать, сортировать и преобразовывать коллекции.
🟠Сортировка коллекций
Лямбда-выражения упрощают сортировку коллекций с использованием метода
🟠Использование функциональных интерфейсов
Лямбда-выражения широко используются с функциональными интерфейсами, такими как
🟠Параллельные вычисления
Лямбда-выражения с использованием параллельных потоков позволяют легко выполнять параллельные вычисления.
🚩Пример использования в реальном проекте
Предположим, у нас есть список сотрудников, и мы хотим отфильтровать и отсортировать их по имени.
Ставь 👍 и забирай 📚 Базу знаний
Да, лямбда-выражения являются важной частью современной разработки на Java, и я активно их использую в своей работе. Лямбда-выражения помогают писать более лаконичный и выразительный код, особенно при работе с коллекциями и потоками данных. Вот несколько распространенных случаев использования лямбда-выражений в Java:
🟠Итерация по коллекциям
Использование лямбда-выражений с методом
forEach позволяет компактно и удобно итерировать по элементам коллекций. List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));🟠Фильтрация и преобразование коллекций
С использованием Stream API и лямбда-выражений можно легко фильтровать, сортировать и преобразовывать коллекции.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
filteredNames.forEach(System.out::println); // Вывод: Alice🟠Сортировка коллекций
Лямбда-выражения упрощают сортировку коллекций с использованием метода
sort. List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort((name1, name2) -> name1.compareTo(name2));
names.forEach(System.out::println);🟠Использование функциональных интерфейсов
Лямбда-выражения широко используются с функциональными интерфейсами, такими как
Predicate, Function, Consumer и Supplier. // Predicate
Predicate<String> startsWithA = s -> s.startsWith("A");
boolean result = startsWithA.test("Alice"); // true
// Function
Function<String, Integer> lengthFunction = s -> s.length();
int length = lengthFunction.apply("Hello"); // 5
// Consumer
Consumer<String> printConsumer = s -> System.out.println(s);
printConsumer.accept("Hello, World!"); // Вывод: Hello, World!
// Supplier
Supplier<String> stringSupplier = () -> "Hello, Supplier!";
String suppliedString = stringSupplier.get();
System.out.println(suppliedString); // Вывод: Hello, Supplier!
🟠Параллельные вычисления
Лямбда-выражения с использованием параллельных потоков позволяют легко выполнять параллельные вычисления.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.mapToInt(Integer::intValue)
.sum();
System.out.println("Sum: " + sum); // Вывод: Sum: 15
🚩Пример использования в реальном проекте
Предположим, у нас есть список сотрудников, и мы хотим отфильтровать и отсортировать их по имени.
import java.util.*;
import java.util.stream.Collectors;
class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Employee{name='" + name + "', age=" + age + '}';
}
}
public class LambdaExample {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", 30),
new Employee("Bob", 25),
new Employee("Charlie", 35),
new Employee("David", 28)
);
// Фильтрация и сортировка сотрудников по имени
List<Employee> filteredAndSorted = employees.stream()
.filter(e -> e.getAge() > 27)
.sorted(Comparator.comparing(Employee::getName))
.collect(Collectors.toList());
filteredAndSorted.forEach(System.out::println);
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Почему композицию чаще рекомендуют использовать, чем наследование?
Потому что она обеспечивает более слабую связанность компонентов, гибкость, возможность замены зависимостей во время выполнения и снижает риск поломок при изменении кода. Композиция даёт больше контроля над поведением.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Потому что она обеспечивает более слабую связанность компонентов, гибкость, возможность замены зависимостей во время выполнения и снижает риск поломок при изменении кода. Композиция даёт больше контроля над поведением.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥2🤔1
🤔 Какие Fetching Types знаешь в Hibernate и чем они отличаются?
В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.
🚩Lazy Fetching (ленивая загрузка)
Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в
🚩Eager Fetching (жадная загрузка)
Hibernate загружает все связанные данные сразу, даже если они не нужны.
Увеличивает время выполнения запроса, так как делает
Используется по умолчанию в
Ставь 👍 и забирай 📚 Базу знаний
В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.
🚩Lazy Fetching (ленивая загрузка)
Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в
@OneToMany, @ManyToMany. @Entity
class User {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders; // Загрузятся ТОЛЬКО при первом вызове getOrders()
}
User user = session.get(User.class, 1L); // Загружается только User
List<Order> orders = user.getOrders(); // Запрос в БД выполняется ТОЛЬКО здесь
🚩Eager Fetching (жадная загрузка)
Hibernate загружает все связанные данные сразу, даже если они не нужны.
Увеличивает время выполнения запроса, так как делает
JOIN или несколько отдельных запросов. Используется по умолчанию в
@ManyToOne, @OneToOne. @Entity
class User {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Order> orders; // Загружается сразу при получении User
}
User user = session.get(User.class, 1L); // Загружается User + сразу все его Orders
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue?
Deque расширяет Queue, потому что Deque — это обобщённая двусторонняя очередь, охватывающая поведение обычной очереди.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Deque расширяет Queue, потому что Deque — это обобщённая двусторонняя очередь, охватывающая поведение обычной очереди.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Расскажи про процесс от пуша кода до продакшена
Когда разработчик пушит код, он проходит несколько этапов перед развертыванием в продакшене. Этот процесс автоматизируется с помощью CI/CD (Continuous Integration / Continuous Deployment).
🚩Этапы CI/CD
🟠Разработчик пушит код в Git-репозиторий
- Код отправляется в GitHub, GitLab, Bitbucket или другой репозиторий.
- Открывается Pull Request (PR) для ревью.
🟠CI (Continuous Integration) – Автоматическая сборка и тестирование
После пуша CI-сервер (Jenkins, GitHub Actions, GitLab CI/CD, CircleCI)** запускает автоматические тесты и сборку.
Клонирование репозитория.
Сборка проекта (например,
Запуск юнит-тестов (
Запуск интеграционных тестов (например,
Анализ кода (SonarQube).
🟠CD (Continuous Deployment) – Развёртывание на Staging
После успешного CI код автоматически разворачивается в стейджинг (staging) – это тестовая среда, похожая на продакшен.
Развёртывание может происходить с помощью:
Docker + Kubernetes (K8s)
AWS CodeDeploy, GitLab CD
Terraform + Ansible
🟠Код проходит код-ревью и одобряется
Проверяется чистота кода, читаемость и ошибки.
В некоторых компаниях код проходит Security Review
🟠CD (Continuous Deployment) – Развёртывание в продакшен
Blue-Green Deployment – новый код разворачивается на отдельном сервере, затем трафик переключается.
Canary Release – новый код деплоится на 5-10% пользователей, если всё хорошо – на всех.
Rolling Deployment – обновление происходит поэтапно, без даунтайма.
Ставь 👍 и забирай 📚 Базу знаний
Когда разработчик пушит код, он проходит несколько этапов перед развертыванием в продакшене. Этот процесс автоматизируется с помощью CI/CD (Continuous Integration / Continuous Deployment).
🚩Этапы CI/CD
🟠Разработчик пушит код в Git-репозиторий
- Код отправляется в GitHub, GitLab, Bitbucket или другой репозиторий.
- Открывается Pull Request (PR) для ревью.
git add .
git commit -m "Добавлена новая фича"
git push origin feature-branch
🟠CI (Continuous Integration) – Автоматическая сборка и тестирование
После пуша CI-сервер (Jenkins, GitHub Actions, GitLab CI/CD, CircleCI)** запускает автоматические тесты и сборку.
Клонирование репозитория.
Сборка проекта (например,
mvn package для Java). Запуск юнит-тестов (
JUnit, Mockito). Запуск интеграционных тестов (например,
TestContainers). Анализ кода (SonarQube).
name: CI Pipeline
on:
push:
branches:
- main
- develop
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build project
run: mvn clean package
- name: Run tests
run: mvn test
🟠CD (Continuous Deployment) – Развёртывание на Staging
После успешного CI код автоматически разворачивается в стейджинг (staging) – это тестовая среда, похожая на продакшен.
Развёртывание может происходить с помощью:
Docker + Kubernetes (K8s)
AWS CodeDeploy, GitLab CD
Terraform + Ansible
FROM openjdk:17
COPY target/app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
🟠Код проходит код-ревью и одобряется
Проверяется чистота кода, читаемость и ошибки.
В некоторых компаниях код проходит Security Review
git merge feature-branch
git push origin main
🟠CD (Continuous Deployment) – Развёртывание в продакшен
Blue-Green Deployment – новый код разворачивается на отдельном сервере, затем трафик переключается.
Canary Release – новый код деплоится на 5-10% пользователей, если всё хорошо – на всех.
Rolling Deployment – обновление происходит поэтапно, без даунтайма.
deploy:
stage: deploy
script:
- kubectl apply -f deployment.yaml
only:
- main
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Каким образом можно получить синхронизированные объекты стандартных коллекций?
С помощью методов Collections.synchronized*():
- synchronizedList();
- synchronizedMap();
- synchronizedSet().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
С помощью методов Collections.synchronized*():
- synchronizedList();
- synchronizedMap();
- synchronizedSet().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥1
🤔 Что такое адаптер?
Адаптер (Adapter) – это шаблон проектирования, который используется для приведения интерфейсов несовместимых классов к единому виду. Он выступает посредником между двумя несовместимыми системами.
🚩Пример: Адаптер в Java (Object Adapter)
Допустим, у нас есть старый класс
Старый интерфейс (неподходящий)
Новый интерфейс (нужный)
Адаптер, который превращает
Использование адаптера
Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (
Ставь 👍 и забирай 📚 Базу знаний
Адаптер (Adapter) – это шаблон проектирования, который используется для приведения интерфейсов несовместимых классов к единому виду. Он выступает посредником между двумя несовместимыми системами.
🚩Пример: Адаптер в Java (Object Adapter)
Допустим, у нас есть старый класс
OldCharger, который работает с вольтажем 220V, а мы хотим, чтобы он работал с USB (5V). Старый интерфейс (неподходящий)
class OldCharger {
void charge220V() {
System.out.println("Зарядка 220V...");
}
}Новый интерфейс (нужный)
interface USBCharger {
void charge5V();
}Адаптер, который превращает
220V в 5Vclass ChargerAdapter implements USBCharger {
private OldCharger oldCharger;
public ChargerAdapter(OldCharger oldCharger) {
this.oldCharger = oldCharger;
}
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
oldCharger.charge220V();
}
}Использование адаптера
public class Main {
public static void main(String[] args) {
OldCharger oldCharger = new OldCharger();
USBCharger adapter = new ChargerAdapter(oldCharger);
adapter.charge5V(); // Теперь старая зарядка работает с 5V!
}
}Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (
extends). class ChargerAdapter extends OldCharger implements USBCharger {
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
charge220V();
}
}Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что такое «XHTML»?
XHTML (eXtensible HyperText Markup Language) — это более строгая версия HTML, основанная на XML. Требует соблюдения строгого синтаксиса (например, обязательное закрытие всех тегов).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
XHTML (eXtensible HyperText Markup Language) — это более строгая версия HTML, основанная на XML. Требует соблюдения строгого синтаксиса (например, обязательное закрытие всех тегов).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 Какие классы поддерживают чтение и запись потоков в компрессированном формате?
Java предоставляет встроенные классы для чтения и записи сжатых данных в формате ZIP, GZIP и других. Эти классы находятся в пакете
🚩GZIP (формат `.gz`)
🚩ZIP (формат `.zip`)
🚩Deflater/Inflater (общая компрессия без формата)
Ставь 👍 и забирай 📚 Базу знаний
Java предоставляет встроенные классы для чтения и записи сжатых данных в формате ZIP, GZIP и других. Эти классы находятся в пакете
java.util.zip. 🚩GZIP (формат `.gz`)
GZIPOutputStream – сжимает данные в формат .gz. GZIPInputStream – разжимает данные из .gz. import java.io.*;
import java.util.zip.*;
public class GZipExample {
public static void main(String[] args) throws IOException {
String data = "Привет, мир! Это тестовая строка для GZIP.";
// Сжатие в .gz
try (FileOutputStream fos = new FileOutputStream("data.gz");
GZIPOutputStream gzos = new GZIPOutputStream(fos)) {
gzos.write(data.getBytes());
}
// Разжатие .gz
try (FileInputStream fis = new FileInputStream("data.gz");
GZIPInputStream gzis = new GZIPInputStream(fis);
BufferedReader reader = new BufferedReader(new InputStreamReader(gzis))) {
System.out.println("Разжатый текст: " + reader.readLine());
}
}
}
🚩ZIP (формат `.zip`)
ZipOutputStream – создаёт ZIP-архив. ZipInputStream – извлекает файлы из ZIP. import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) throws IOException {
String fileName = "example.txt";
String zipFile = "archive.zip";
// Создаём файл для сжатия
try (FileWriter writer = new FileWriter(fileName)) {
writer.write("Привет, это файл для архивации!");
}
// Запись в ZIP
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
FileInputStream fis = new FileInputStream(fileName)) {
ZipEntry entry = new ZipEntry(fileName);
zos.putNextEntry(entry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
}
System.out.println("Файл заархивирован в " + zipFile);
}
}
🚩Deflater/Inflater (общая компрессия без формата)
DeflaterOutputStream – сжимает данные без специфического формата. InflaterInputStream – разжимает такие данные. import java.io.*;
import java.util.zip.*;
public class DeflaterExample {
public static void main(String[] args) throws IOException {
String text = "Данные для сжатия";
// Сжатие
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
try (DeflaterOutputStream dos = new DeflaterOutputStream(byteStream)) {
dos.write(text.getBytes());
}
byte[] compressedData = byteStream.toByteArray();
// Разжатие
ByteArrayInputStream inputStream = new ByteArrayInputStream(compressedData);
try (InflaterInputStream iis = new InflaterInputStream(inputStream);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int length;
while ((length = iis.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
System.out.println("Разжатые данные: " + new String(outputStream.toByteArray()));
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 В чём основные ограничения при работе с операцией Union?
Операции объединения возможны только если количество и типы столбцов в объединяемых выборках совпадают. Кроме того, использование UNION без ALL может привести к неожиданному удалению повторяющихся строк.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Операции объединения возможны только если количество и типы столбцов в объединяемых выборках совпадают. Кроме того, использование UNION без ALL может привести к неожиданному удалению повторяющихся строк.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 В чем разница между new string и string?
В Java строки (
🚩`"Hello"` — строка из пула строк
Когда вы пишете:
🚩`new String("Hello")` — создание нового объекта
Когда вы создаёте строку так:
🚩Разница в сравнении строк
🚩Когда использовать `new String()`?
В 99% случаев
Но он может быть полезен, если вы намеренно хотите создать новый объект, например, для защиты от изменения ссылок:
Ставь 👍 и забирай 📚 Базу знаний
В Java строки (
String) являются неизменяемыми (immutable) объектами и обрабатываются особым образом, особенно при их создании.🚩`"Hello"` — строка из пула строк
Когда вы пишете:
String str1 = "Hello";
🚩`new String("Hello")` — создание нового объекта
Когда вы создаёте строку так:
String str2 = new String("Hello");🚩Разница в сравнении строк
public class StringTest {
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(str3)); // true (содержимое одинаковое)
}
}🚩Когда использовать `new String()`?
В 99% случаев
new String() не нужен. Его создание расходует память и снижает производительность.Но он может быть полезен, если вы намеренно хотите создать новый объект, например, для защиты от изменения ссылок:
String safeCopy = new String(originalString); // Теперь это точно отдельный объект
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что такое Spring Data?
Spring Data — это надстройка над ORM/репозиториями, упрощающая работу с базой. Она:
- позволяет создавать репозитории без реализации;
- использует интерфейсы и ключевые слова;
- интегрируется с JPA, MongoDB, Redis и др.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Spring Data — это надстройка над ORM/репозиториями, упрощающая работу с базой. Она:
- позволяет создавать репозитории без реализации;
- использует интерфейсы и ключевые слова;
- интегрируется с JPA, MongoDB, Redis и др.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Преимущества реализации ExecutorService?
- Управление пулом потоков.
- Повторное использование потоков (вместо создания новых).
- Возможность работы с Runnable, Callable, Future.
- Позволяет гибко управлять выполнением задач (отложенный запуск, цикличный и т.д.).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Управление пулом потоков.
- Повторное использование потоков (вместо создания новых).
- Возможность работы с Runnable, Callable, Future.
- Позволяет гибко управлять выполнением задач (отложенный запуск, цикличный и т.д.).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1🔥1
🤔 Что знаешь об интерфейсе FileFilter?
🚩Как работает `FileFilter`?
Этот интерфейс содержит всего один метод:
🚩Пример использования `FileFilter`
Допустим, мы хотим отфильтровать все файлы
Выходные данные (если в папке
🚩Lambda-версия (Java 8+)
Вместо анонимного класса можно использовать лямбда-выражение:
🚩Разница между `FileFilter` и `FilenameFilter`
Ставь 👍 и забирай 📚 Базу знаний
FileFilter — это интерфейс в пакете java.io, используемый для фильтрации файлов в каталогах. Он применяется в методе listFiles(FileFilter filter) класса File и позволяет выбрать только те файлы, которые соответствуют заданным критериям.🚩Как работает `FileFilter`?
Этот интерфейс содержит всего один метод:
boolean accept(File pathname);
🚩Пример использования `FileFilter`
Допустим, мы хотим отфильтровать все файлы
.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
🚩Lambda-версия (Java 8+)
Вместо анонимного класса можно использовать лямбда-выражение:
FileFilter txtFilter = file -> file.isFile() && file.getName().endsWith(".txt");🚩Разница между `FileFilter` и `FilenameFilter`
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);
}
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое AutoCloseable и конструкция try-with-resources?
AutoCloseable — это интерфейс, который говорит JVM: «этот ресурс можно закрыть автоматически».
try-with-resources — это конструкция, при которой ресурс (например, файл, поток или соединение) автоматически закроется по завершению блока, даже если произойдёт исключение.
Удобно, безопасно, уменьшает количество утечек ресурсов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
AutoCloseable — это интерфейс, который говорит JVM: «этот ресурс можно закрыть автоматически».
try-with-resources — это конструкция, при которой ресурс (например, файл, поток или соединение) автоматически закроется по завершению блока, даже если произойдёт исключение.
Удобно, безопасно, уменьшает количество утечек ресурсов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Где в обработке исключений может применяться конструкция с finally?
Конструкция
🚩Основная структура
Пример
Ставь 👍 и забирай 📚 Базу знаний
Конструкция
finally в Java используется для гарантированного выполнения кода, независимо от того, произошло исключение или нет. Обычно применяется для освобождения ресурсов, таких как закрытие файлов, соединений с базой данных или потоков. 🚩Основная структура
try {
// Код, который может выбросить исключение
} catch (Exception e) {
// Обработка исключения
} finally {
// Этот блок выполнится всегда
}Пример
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("file.txt");
System.out.println(fileInputStream.read());
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
if (fileInputStream != null) {
fileInputStream.close(); // Всегда закрываем файл
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое Deque?
Это двусторонняя очередь, которая позволяет добавлять и удалять элементы с обоих концов. Она может работать как стек (LIFO) и как очередь (FIFO). Примеры реализаций в Java: ArrayDeque, LinkedList.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это двусторонняя очередь, которая позволяет добавлять и удалять элементы с обоих концов. Она может работать как стек (LIFO) и как очередь (FIFO). Примеры реализаций в Java: ArrayDeque, LinkedList.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Как бы выразил полиморфизм в коде?
Это способность объектов разных классов реагировать на одинаковые методы по-разному. В Java полиморфизм достигается через наследование, переопределение методов и использование абстрактных классов или интерфейсов.
🚩Пример полиморфизма в коде
Наследование и переопределение методов
Использование интерфейсов
Реальный пример использования полиморфизма
Результат
Ставь 👍 и забирай 📚 Базу знаний
Это способность объектов разных классов реагировать на одинаковые методы по-разному. В 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
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 За счёт чего NIO обеспечивает неблокируемый доступ к ресурсам?
Java NIO использует каналы (Channels) и селекторы (Selectors) вместо потоков ввода/вывода. Каналы работают напрямую с буферами и позволяют обрабатывать множество подключений без блокировки — один поток может отслеживать множество каналов и реагировать на их готовность к чтению или записи. Это делает I/O более эффективным, особенно при работе с большим числом соединений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Java NIO использует каналы (Channels) и селекторы (Selectors) вместо потоков ввода/вывода. Каналы работают напрямую с буферами и позволяют обрабатывать множество подключений без блокировки — один поток может отслеживать множество каналов и реагировать на их готовность к чтению или записи. Это делает I/O более эффективным, особенно при работе с большим числом соединений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥5👍1