Java | Вопросы собесов
11.4K subscribers
33 photos
2 videos
1.11K links
Download Telegram
🤔 Всегда ли в Java существовали дженерики?

Нет. Дженерики появились в Java 5. До этого использовались сырые типы (raw types), что было менее безопасно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊4🔥2
🤔 Как ты можешь описать абстракцию?

Это принцип объектно-ориентированного программирования (ООП), который скрывает детали реализации объекта и показывает только его наиболее важные характеристики. Она позволяет сосредоточиться на сущности объекта, игнорируя его внутреннюю сложность.

🚩Абстракция

В Java абстракция достигается через:
Абстрактные классы
Интерфейсы

🟠Абстрактные классы
Абстрактный класс — это класс, который не может быть создан напрямую, но может содержать:
Абстрактные методы (без реализации, только сигнатуры);
Обычные методы (с реализацией).
Используется, если вы хотите описать общее поведение для группы классов, но часть поведения оставить на усмотрение конкретных подклассов.
abstract class Animal {
// Абстрактный метод — реализуется в подклассах
abstract void makeSound();

// Обычный метод
void eat() {
System.out.println("This animal eats food.");
}
}

class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof!");
}
}

class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow!");
}
}

public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.makeSound(); // Woof!
dog.eat(); // This animal eats food.

Animal cat = new Cat();
cat.makeSound(); // Meow!
}
}


🟠Интерфейсы
Интерфейс — это чистый контракт, который определяет набор методов, которые класс должен реализовать.
В отличие от абстрактного класса:
Интерфейс не может содержать полей (кроме static final).
Класс может реализовать несколько интерфейсов (множественное наследование).
interface Vehicle {
void start(); // метод без реализации
void stop();
}

class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car is starting.");
}

@Override
public void stop() {
System.out.println("Car is stopping.");
}
}

class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike is starting.");
}

@Override
public void stop() {
System.out.println("Bike is stopping.");
}
}

public class Main {
public static void main(String[] args) {
Vehicle car = new Car();
car.start(); // Car is starting.
car.stop(); // Car is stopping.

Vehicle bike = new Bike();
bike.start(); // Bike is starting.
bike.stop(); // Bike is stopping.
}
}


🚩Почему важна абстракция?

🟠Скрытие сложностей
Программистам не нужно знать все детали реализации объекта. Они работают только с его интерфейсом.
🟠Упрощение понимания
Код становится понятным и модульным, так как мы сосредоточиваемся на важной логике.
🟠Повторное использование
Абстракция позволяет использовать один и тот же код для разных объектов.
🟠Гибкость и поддержка
Если нужно изменить реализацию, это не затронет остальную часть программы (если она работает через абстрактный контракт).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2
🤔 Чем стек отличается от очереди?

- Стек (Stack) — работает по принципу LIFO (последний пришёл — первый вышел).
- Очередь (Queue) — работает по принципу FIFO (первый пришёл — первый вышел).
Они используются для разных алгоритмов: стек — для рекурсий, парсинга; очередь — для обработки задач по порядку.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3
🤔 Для чего нужны паттерны программирования?

Паттерны проектирования (design patterns) — это готовые решения распространённых задач, возникающих при разработке программного обеспечения.

🚩Зачем они нужны?

🟠Структурируют код
помогают писать код понятнее и чище.
🟠Упрощают поддержку
делают код гибким и масштабируемым.
🟠Экономят время
не нужно изобретать велосипед, а можно использовать проверенные решения.
🟠Облегчают общение
разработчики могут быстро понимать, как устроена программа, если в ней используются известные паттерны.

🚩Виды паттернов программирования

🟠Порождающие (Creational)
управляют созданием объектов.
🟠Структурные (Structural)
Определяют, как классы и объекты взаимодействуют.
🟠Поведенческие (Behavioral)
управляют взаимодействием объектов и потоками выполнения.

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
👍3
🤔 Зачем нужен String Pool?

String Pool позволяет экономить память, храня строки в едином пуле и переиспользуя их, если строки имеют одинаковое значение.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
🤔 Что знаешь про поверхностное копирование?

Поверхностное копирование (Shallow Copy) – это процесс создания нового объекта, который содержит ссылки на те же вложенные объекты, что и оригинал.

🟠Как сделать поверхностное копирование в Java?
Способ 1: Метод clone() (реализация Cloneable)
class Person implements Cloneable {
String name;

public Person(String name) {
this.name = name;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}

public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person original = new Person("Иван");
Person copy = (Person) original.clone();

System.out.println(copy.name); // Иван
}
}


🟠Проблема с вложенными объектами (общие ссылки)
Если объект содержит вложенные объекты, они не копируются, а передаются по ссылке.
class Address {
String city;
public Address(String city) { this.city = city; }
}

class User implements Cloneable {
String name;
Address address;

public User(String name, Address address) {
this.name = name;
this.address = address;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}

public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Москва");
User original = new User("Иван", address);
User copy = (User) original.clone();

copy.address.city = "Санкт-Петербург"; // Меняем адрес у копии

System.out.println(original.address.city); // Санкт-Петербург (изменилось и у оригинала!)
}
}


🟠Как сделать глубокую копию? (Deep Copy)
Решение: Создать новый вложенный объект в clone()
@Override
protected Object clone() throws CloneNotSupportedException {
User clonedUser = (User) super.clone();
clonedUser.address = new Address(this.address.city); // Копируем вложенный объект
return clonedUser;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Где лучше применять наследование и ассоциацию?

- Наследование — когда нужно расширить поведение одного типа другим, соблюдая принцип подстановки.
- Ассоциация (композиция) — когда один объект использует другой как часть.
- Предпочтительнее, когда нет строгой связи по логике "является".


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
🤔 В чем разница JPQL и HQL?

JPQL (Java Persistence Query Language) и HQL (Hibernate Query Language) – это языки запросов, похожие на SQL, но работающие с объектами, а не с таблицами БД.
Главное отличие: JPQL – стандарт JPA, а HQL – специфичен для Hibernate.

🚩JPQL (Java Persistence Query Language)

Стандартный язык JPA, работает со всеми JPA-совместимыми провайдерами (Hibernate, EclipseLink, OpenJPA).
Опирается на JPA Entity-классы, а не на реальные таблицы в БД.
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u WHERE u.age > :age", User.class);
query.setParameter("age", 18);
List<User> users = query.getResultList();


🚩HQL (Hibernate Query Language)

Язык запросов специфичный для Hibernate.
Работает аналогично JPQL, но поддерживает дополнительные возможности, например, вызов методов и фильтрацию по подзапросам.
Query query = session.createQuery(
"FROM User u WHERE LENGTH(u.name) > 5"); // Использование функции LENGTH()
List<User> users = query.list();


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что известно о сервлетных фильтрах?

Сервлетные фильтры обрабатывают запросы и ответы, проходящие через сервлеты.
1. Используются для аутентификации, логирования, сжатия данных и других задач.
2. Фильтры могут изменять или блокировать запросы и ответы перед передачей их сервлету.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что знаешь про поверхностное копирование?

Поверхностное копирование (Shallow Copy) – это процесс создания нового объекта, который содержит ссылки на те же вложенные объекты, что и оригинал.

🟠Как сделать поверхностное копирование в Java?
Способ 1: Метод clone() (реализация Cloneable)
class Person implements Cloneable {
String name;

public Person(String name) {
this.name = name;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}

public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person original = new Person("Иван");
Person copy = (Person) original.clone();

System.out.println(copy.name); // Иван
}
}


🟠Проблема с вложенными объектами (общие ссылки)
Если объект содержит вложенные объекты, они не копируются, а передаются по ссылке.
class Address {
String city;
public Address(String city) { this.city = city; }
}

class User implements Cloneable {
String name;
Address address;

public User(String name, Address address) {
this.name = name;
this.address = address;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}

public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Москва");
User original = new User("Иван", address);
User copy = (User) original.clone();

copy.address.city = "Санкт-Петербург"; // Меняем адрес у копии

System.out.println(original.address.city); // Санкт-Петербург (изменилось и у оригинала!)
}
}


🟠Как сделать глубокую копию? (Deep Copy)
Решение: Создать новый вложенный объект в clone()
@Override
protected Object clone() throws CloneNotSupportedException {
User clonedUser = (User) super.clone();
clonedUser.address = new Address(this.address.city); // Копируем вложенный объект
return clonedUser;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Media is too big
VIEW IN TELEGRAM
📺 База 1000+ реальных собеседований

На программиста, тестировщика, аналитика, проджекта и другие IT профы.

Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.

🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как создать singleton-бин при запуске spring приложения?

По умолчанию все бины в Spring — это singleton. Просто определив бин с помощью
@Component, @Service, @Repository, @Controller или через @Bean, Spring создаст один экземпляр и будет переиспользовать его во всем приложении.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔1💊1
🤔 Используешь в работе Lambda-выражения?

Да, лямбда-выражения являются важной частью современной разработки на 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);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Существует ли способ решения проблемы race condition?

Да, race condition можно решить с помощью синхронизации (например, через synchronized, Lock), атомарных переменных (AtomicInteger) или других механизмов управления потоками (ReentrantLock, StampedLock).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥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
👍3
🤔 Какая скорость поиска в ArrayList?

Скорость доступа к элементу по индексу в ArrayList — O(1).
Но если нужно найти элемент по значению (contains, indexOf), тогда — O(n), поскольку требуется пройти все элементы до совпадения.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Какие Fetching Types знаешь в 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


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Как поведёт себя уже инстанциированный итератор, если вызвать collection.remove()?

Если коллекция структурно изменится без использования этого итератора, то при следующем вызове
iterator.next() или iterator.remove() будет выброшено ConcurrentModificationException (fail-fast поведение).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1🤔1
🤔 Какие классы поддерживают чтение и запись потоков в компрессированном формате?

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()));
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что такое «фреймворк Fork/Join»?

Fork/Join — это фреймворк для параллельной обработки задач в Java, который позволяет разбивать большую задачу на подзадачи (fork) и объединять их результаты (join) для повышения производительности.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🤔 Что стоит в центре парадигмы?

Парадигма программирования определяет способ мышления и подход к написанию кода. В зависимости от выбранной парадигмы, в центре может стоять разное ключевое понятие.

🚩Процедурное программирование

Код строится вокруг последовательности инструкций.
Данные изменяются с помощью вызова функций (процедур).
Пример: C, Pascal.
int sum(int a, int b) {
return a + b;
}

int main() {
int result = sum(5, 3);
printf("%d", result);
return 0;
}


🚩Объектно-ориентированное программирование (ООП)

Мир представляется в виде объектов, у которых есть состояние (поля) и поведение (методы).
Используются принципы: инкапсуляция, наследование, полиморфизм.
Пример: Java, C++, Python.
class Car {
private String model;

public Car(String model) {
this.model = model;
}

public void drive() {
System.out.println(model + " едет!");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car("Tesla");
car.drive(); // Tesla едет!
}
}


🚩Функциональное программирование (FP)

Использование чистых функций (без изменения состояния).
Избегание побочных эффектов и мутабельности.
Пример: Haskell, Scala, Kotlin, Java (Stream API).
import java.util.List;

public class Main {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
numbers.stream()
.map(n -> n * 2) // Умножаем каждый элемент на 2
.forEach(System.out::println); // Вывод результата
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5