Нет, у стрелочной функции нет собственного this, bind, call, apply не переопределяют контекст, так как this определяется лексически при создании функции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊28🤔4🔥2
Адаптер (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();
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
Проблема в том, что строки (String) в Java иммутабельны — при каждой конкатенации создаётся новый объект, а старые уходят в сборку мусора. Это приводит к потере производительности при множественных соединениях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🤔3
Все три аннотации используются в Spring для создания бинов, но у каждой есть своё предназначение.
@Component помечает класс как Spring-бин (компонент). Является универсальной аннотацией.
Можно применять к любым классам, которые должны управляться Spring-контейнером.
@Component
public class MyComponent {
public void doWork() {
System.out.println("Работа компонента");
}
}
@Service – это специализированный @Component, используемый для сервисных классов (логика приложения). Упрощает понимание кода (показывает, что этот класс содержит бизнес-логику).
@Service
public class UserService {
public String getUser() {
return "Пользователь Иван";
}
}
@Repository – это специализированный @Component для слоя доступа к данным (DAO, Repository). Автоматически перехватывает SQL-исключения (
PersistenceExceptionTranslationPostProcessor) и преобразует их в DataAccessException. @Repository
public class UserRepository {
public String findUserById(int id) {
return "Пользователь с ID " + id;
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
Нет, одновременно использовать
PrintWriter и ServletOutputStream в одном сервлете нельзя. Это связано с тем, что эти два класса работают с разными типами данных и открывают ответный поток в разных режимах — PrintWriter для символьных данных, а ServletOutputStream для байтовых данных.Типы потоков:
Конфликт потоков: Открытие одного потока блокирует возможность открытия другого. Попытка использования обоих потоков в одном запросе приведет к исключению
IllegalStateException.import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
public class MixedContentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
ServletOutputStream outputStream = response.getOutputStream(); // Это вызовет IllegalStateException
writer.println("Hello, World!"); // Пытаемся записать текст
byte[] imageData = ...; // Получаем бинарные данные
outputStream.write(imageData); // Пытаемся записать бинарные данные
}
}
Если требуется отправить как текстовые, так и бинарные данные, это нужно делать последовательно, разделяя логику на отдельные запросы или сервлеты.
Отправка текстовых данных:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class TextServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body><h1>Hello, World!</h1></body></html>");
}
}
Отправка бинарных данных:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletOutputStream;
public class BinaryServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/pdf");
ServletOutputStream out = response.getOutputStream();
byte[] pdfData = ...; // Получаем PDF данные
out.write(pdfData);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊6👍2
- Примитив — это базовый тип (int, boolean и т.д.), он не имеет методов, занимает меньше памяти, работает быстрее.
- Объект — экземпляр класса, содержит поля и методы, может быть null, требует больше ресурсов.
В Java есть обёртки для примитивов (Integer, Boolean) — это объекты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10💊4🔥1
В Java строки (
String) являются неизменяемыми (immutable) объектами и обрабатываются особым образом, особенно при их создании.Когда вы пишете:
String str1 = "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 (содержимое одинаковое)
}
}В 99% случаев
new String() не нужен. Его создание расходует память и снижает производительность.Но он может быть полезен, если вы намеренно хотите создать новый объект, например, для защиты от изменения ссылок:
String safeCopy = new String(originalString); // Теперь это точно отдельный объект
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
- В конец — O(1), если не пересоздаётся коллекция;
- В середину/начало — O(n), из-за поиска позиции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔12👍7💊5
FIFO (First-In, First-Out) – это принцип обработки данных: "первым вошёл – первым вышел".
Пример работы FIFO с
Queue import java.util.*;
public class FifoExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>(); // Можно заменить на ArrayDeque
queue.add("Первый");
queue.add("Второй");
queue.add("Третий");
System.out.println(queue.poll()); // Первый
System.out.println(queue.poll()); // Второй
System.out.println(queue.poll()); // Третий
}
}
Queue<Integer> queue = new LinkedList<>();
queue.add(10);
System.out.println(queue.peek()); // 10 (но не удаляет)
System.out.println(queue.poll()); // 10 (удаляет)
System.out.println(queue.poll()); // null (очередь пуста)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Синхронизация реализуется через synchronized, Lock, ReentrantLock, volatile, Atomic-классы, а также через высокоуровневые конструкции, такие как CountDownLatch, Semaphore, ExecutorService.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3
Да, лямбда-выражения являются важной частью современной разработки на 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
👍10
Поиск может быть двух типов:
- линейный — с помощью contains, indexOf, когда список не отсортирован (сложность O(n)).
- бинарный — с помощью Collections.binarySearch, если список отсортирован (сложность O(log n)), но в этом случае предварительно надо отсортировать коллекцию.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥5
В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.
Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в
@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(); // Запрос в БД выполняется ТОЛЬКО здесь
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
👍7
Все исключения происходят от базового класса Throwable. Существует два основных подвида: Exception и Error. Первые представляют ошибки, которые можно обработать в коде (например, проблемы с вводом-выводом), вторые связаны с критическими сбоями виртуальной машины. Исключения делятся также на проверяемые (которые обязательно нужно либо обработать, либо явно объявить) и непроверяемые (возникающие в процессе выполнения и не требующие обязательной обработки).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💊6
Метод
start() создаёт новый поток и вызывает run() внутри него. class MyThread extends Thread {
@Override
public void run() {
System.out.println("Работает поток: " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // Запускаем новый поток
System.out.println("Работает поток: " + Thread.currentThread().getName());
}
}Вывод (разные потоки работают параллельно)
Работает поток: main
Работает поток: Thread-0
Если вызвать
run() напрямую, код просто выполнится как обычный метод, а не в новом потоке. public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.run(); // ❌ Ошибка! Работает в главном потоке
System.out.println("Работает поток: " + Thread.currentThread().getName());
}
}Вывод (
run() работает в главном потоке, а не в новом) Работает поток: main
Работает поток: main
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
- Consistency (согласованность),
- Availability (доступность),
- Partition Tolerance (устойчивость к сетевым разделениям).
Можно выбрать только 2 из 3 — это доказано в теореме Эрика Брюера.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊35👍4🔥4🤔4
В программировании существует множество видов тестирования, которые можно разделить на категории по уровню тестирования, методам выполнения и целям. Вот основные виды:
Тестирование отдельных методов или классов.
Цель: Проверить работу минимальных компонентов программы.
Инструменты: JUnit, TestNG.
@Test
public void testAddition() {
assertEquals(5, Calculator.add(2, 3));
}
Тестирование взаимодействия между модулями.
Цель: Убедиться, что модули правильно работают вместе.
Пример: Проверка взаимодействия сервиса и базы данных.
Инструменты: Spring Test, Apache Camel Test.
Проверка всей системы как единого целого.
Цель: Убедиться, что все компоненты работают вместе и система соответствует требованиям.
Проводится с участием клиента или конечных пользователей.
Цель: Убедиться, что система удовлетворяет бизнес-требованиям.
Тесты выполняются вручную.
Цель: Найти ошибки, которые может не уловить автоматизация.
Пример: Тестировщик вручную проверяет пользовательский интерфейс.
Тесты выполняются автоматически с использованием скриптов и инструментов.
Цель: Снизить время и затраты на повторяющиеся тесты.
Инструменты: Selenium, JUnit, Appium.
Проверяет, что функции системы работают как ожидалось.
Цель: Убедиться в соответствии требованиям.
Инструменты: Selenium, Postman.
Тестирование производительности (Performance Testing): Проверяет скорость, отклик и стабильность.
Инструменты: JMeter, Gatling.
Тестирование безопасности (Security Testing): Проверяет защиту системы.
Инструменты: OWASP ZAP, Burp Suite.
Тестирование удобства использования (Usability Testing): Проверяет интерфейс на удобство для пользователя.
Быстрая проверка работоспособности ключевых функций.
Цель: Убедиться, что основные функции работают, прежде чем углубляться в тесты.
Проверяет, что новые изменения не сломали старую функциональность.
Цель: Убедиться, что баги, исправленные ранее, не повторились.
Проверяет систему без знаний о внутреннем устройстве.
Цель: Оценить функциональность с точки зрения пользователя.
Проверяет систему с учетом внутренней структуры кода.
Цель: Оценить корректность логики программы.
Проверяет, какая версия системы лучше (например, два варианта интерфейса).
Цель: Повысить пользовательский опыт.
Проверяет, как система работает под большой нагрузкой.
Инструменты: Apache JMeter.
Проверяет, как система работает в условиях сверхвысокой нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2💊2
Оператор throw используется для генерации исключения вручную во время выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12💊1
JVM (Java Virtual Machine) управляет памятью приложения и делит её на несколько областей.
Здесь хранятся ВСЕ объекты и массивы, созданные через
new. Управляется Garbage Collector (GC)
Локальные переменные (
int, double, String – если не new) Ссылки на объекты в
Heap Вызовы методов (кадры стека)
public class StackExample {
public static void main(String[] args) {
int a = 5;
int b = sum(a, 10);
}
public static int sum(int x, int y) {
return x + y;
}
}Хранит информацию о загруженных классах (названия, методы, поля, байт-код).
При загрузке нового класса
ClassLoader выделяет память в Metaspace. В Java 8 заменил устаревший
PermGen. while (true) {
ClassLoader loader = new MyClassLoader();
Class<?> clazz = loader.loadClass("MyDynamicClass");
}Хранит адрес текущей инструкции, выполняемой потоком.
У каждого потока свой PC Register.
Работает как указатель в машинном коде.
Хранит данные, связанные с вызовами нативных методов (
JNI – Java Native Interface). Если Java вызывает C++-код, информация о вызове хранится здесь.
public class NativeExample {
public native void callCMethod();
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
2. Они сохраняются в объектах HttpServletRequest, HttpSession, ServletContext.
3. Методы: setAttribute(), getAttribute(), removeAttribute() используются для работы с атрибутами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4💊1