Java задачи с собеседований
6.27K subscribers
594 photos
6 videos
19 files
247 links
Задачи, тесты и теоретические вопросы по JAVA.

Репозиторий: https://github.com/proghub-official/java-interview
Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
Вопрос на собеседовании

Как лямбда-выражения в Java используют переменные из внешнего контекста и какие существуют ограничения на это?

Ответ ⬇️
В Java лямбда-выражения могут использовать переменные из окружающей области, но только если они являются фактически финализированными. Это означает, что переменная должна быть объявлена как final или её значение не должно изменяться после инициализации.

Данное ограничение связано с тем, что лямбды могут выполняться в другом потоке, и изменение переменной вне лямбды может привести к непредсказуемым результатам.

Пример использования ⚙️
import java.util.function.Consumer;

public class Main {
public static void main(String[] args) {
int base = 10;

Consumer multiplier = value -> {
System.out.println(value * base); // Использование захваченной переменной
};

multiplier.accept(5); // Вывод: 50

// base = 20; // Ошибка компиляции: переменная должна быть фактически финализированной
}
}

👩‍💻
@javaquiz
⚙️ Метод MethodHandles.privateLookupIn предоставляет возможность доступа к приватным методам, полям и конструкторам класса с помощью MethodHandle. Это мощный и необычный инструмент для работы с закрытыми членами классов. 👩‍💻
@javaquiz
Метод ManagementFactory.getRuntimeMXBean() позволяет получить данные о работе Java-программы, такие как аргументы командной строки, идентификатор процесса (PID) и время запуска. Эта информация полезна для мониторинга и диагностики приложений.

👩‍💻
@javaquiz
⚙️ Шаблонное сопоставление для switch

Шаблонное сопоставление для switch позволяет применять шаблоны для более удобного и понятного сопоставления значений в операторе switch. Это значительно облегчает работу с разными типами данных и структурами.

👩‍💻
@javaquiz
⚙️ Метод ByteArrayOutputStream.writeTo() позволяет записать данные из байтового массива (ByteArrayOutputStream) непосредственно в другой выходной поток (OutputStream). Это удобно для перенаправления данных, например, в файл или сетевой сокет, без необходимости промежуточного копирования.

👩‍💻
@javaquiz
Вопрос на собеседовании

Как функционирует механизм удаления дубликатов строк в JVM и как он помогает оптимизировать использование памяти?

Ответ ⬇️
Удаление дубликатов строк в JVM — это функция, которая появилась в Java 8 (с G1 GC), позволяющая JVM автоматически находить и повторно использовать одинаковые строки в памяти. Это особенно эффективно в приложениях с большим количеством повторяющихся строк, например, в веб-серверах или системах логирования.

Обычно, даже если строки одинаковые, они хранятся как отдельные объекты в памяти. Этот механизм позволяет JVM находить дубликаты и заменять их ссылками на уже существующие строки, что снижает потребление памяти.

Пример использования ⚙️
import java.util.ArrayList;
import java.util.List;

public class StringDeduplicationExample {
public static void main(String[] args) {
List list = new ArrayList();

for (int i = 0; i < 1_000_000; i++) {
list.add(("String_" + (i % 100)).intern()); // Используем String.intern() для принудительного объединения
}

System.out.println("Генерация завершена");
}
}

👩‍💻
@javaquiz
🚫 Антипаттерн недели: Применение String вместо StringBuilder для объединения строк в циклах

В Java строки (String) не подлежат изменению. Каждый раз, когда происходит конкатенация с помощью +, создаётся новый объект, что приводит к излишним затратам памяти и ухудшению производительности, особенно в циклах.

✔️ Используйте StringBuilder, который изменяем и работает быстрее при частых манипуляциях с текстом.

👩‍💻
@javaquiz
⚙️ Метод Pattern.asMatchPredicate(), который появился в Java 11, дает возможность превратить регулярное выражение в предикат. Этот предикат можно использовать для фильтрации потоков или для проверки строк на полное соответствие шаблону.

👩‍💻
@javaquiz
Метод ProcessHandle.info() предоставляет информацию о текущих процессах в системе, включая аргументы командной строки, время их запуска и использование ресурсов. Это удобно для отслеживания процессов в приложениях на Java.

👩‍💻
@javaquiz
⚙️ Метод Files.mismatch()

Метод Files.mismatch(), который появился в Java 12, предоставляет возможность сравнить два файла и определить позицию первого байта, который не совпадает. Если файлы одинаковые, метод возвращает -1. Это может быть полезно для проверки целостности данных или сравнения файлов.

👩‍💻
@javaquiz
🔥 Самые важные каналы для разработчиков на Java, чтобы увеличить свои доходы 💸

• Java | Вопросы собеседований (https://yangx.top/+i6I-717auZc0MTcy)
• Java | Вакансии с удаленной работой (https://yangx.top/+O6xDQY5XwKNjNGMy)
• Java | LeetCode (https://yangx.top/+3KgwdmW-QG9jZDgy)
• Java | Тесты (https://yangx.top/+2t4Qa_UhLpY2NWIy)

Подпишись, чтобы не упустить информацию ☝️
@javaquiz
JarFile — это класс в Java, предназначенный для доступа к содержимому JAR-файла. JAR-файл (Java ARchive) представляет собой архивный формат, который позволяет объединять несколько файлов Java (.class) и другие ресурсы, такие как изображения, звуковые файлы и текстовые документы, в один файл.

Чтобы создать объект JarFile, нужно использовать его конструктор, который принимает путь к JAR-файлу в качестве аргумента.

👩‍💻
@javaquiz
Метод StackWalker.walk() дает возможность получить информацию о текущем стеке вызовов в режиме реального времени, а также производить его фильтрацию и анализ. Это удобно для ведения логов, отладки и мониторинга работы кода.

👩‍💻
@javaquiz
⚙️ Метод Thread.onSpinWait() информирует процессор о том, что поток находится в ожидании, не выполняя при этом никакой полезной работы. Это способствует повышению производительности в многопоточных приложениях, снижая нагрузку на процессор во время активного ожидания.

👩‍💻
@javaquiz
Метод ProcessHandle.onExit() предоставляет возможность следить за завершением внешнего процесса в асинхронном режиме. Это удобно для управления запущенными процессами и выполнения действий после их окончания.

👩‍💻
@javaquiz
Вопрос на собеседовании

Как функционируют виртуальные потоки в Java и чем они отличаются от обычных потоков?

Ответ ⬇️
Виртуальные потоки появились в Java 21 и позволяют создавать огромное количество потоков без значительных затрат ресурсов. В отличие от обычных потоков, которые зависят от системных потоков операционной системы, виртуальные потоки управляются самой Java Virtual Machine и не блокируют системные ресурсы.

Использование виртуальных потоков значительно улучшает производительность приложений, которые выполняют множество операций ввода-вывода, например, сетевых запросов.

Пример использования ⚙️
public class VirtualThreadsExample {
public static void main(String[] args) {
try (var executor = java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread());
});
}
}
}
}

👩‍💻
@javaquiz
🚫 Антипаттерн недели: Неправильное использование оператора == для сравнения строк

В Java строки (String) являются объектами, а оператор == сравнивает их ссылки, а не содержимое. Это может вызвать неожиданные ошибки при сравнении строк, особенно если они создаются динамически.

✔️ Лучше использовать метод equals(), который сравнивает именно содержимое строк, а не их ссылки.

👩‍💻
@javaquiz
⚙️ java.util.Timer()

Метод java.util.Timer() дает возможность создавать таймеры, которые выполняют определенные задачи через установленные временные интервалы. Это удобно для планирования и отложенного выполнения задач без блокировки основного потока.

👩‍💻
@javaquiz