Java | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Больше📈 Аналитический обзор Telegram-канала Java | Вопросы собесов
Канал Java | Вопросы собесов (@easy_java_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 11 309 подписчиков, занимая 10 942 место в категории Технологии и приложения и 56 602 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 11 309 подписчиков.
Согласно последним данным от 26 октября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -26, а за последние 24 часа — -2, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.08%. В первые 24 часа после публикации контент обычно набирает 6.23% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 141 просмотров. В течение первых суток публикация набирает 705 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 7.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, void, string, строка, static.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads”
Благодаря высокой частоте обновлений (последние данные получены 27 октября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
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()));
}
}
}
Ставь 👍 и забирай 📚 Базу знанийOldCharger, который работает с вольтажем 220V, а мы хотим, чтобы он работал с USB (5V).
Старый интерфейс (неподходящий)
class OldCharger {
void charge220V() {
System.out.println("Зарядка 220V...");
}
}
Новый интерфейс (нужный)
interface USBCharger {
void charge5V();
}
Адаптер, который превращает 220V в 5V
class 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();
}
}
Ставь 👍 и забирай 📚 Базу знаний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
Ставь 👍 и забирай 📚 Базу знаний@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
Ставь 👍 и забирай 📚 Базу знаний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);
}
}
Ставь 👍 и забирай 📚 Базу знаний