Библиотека задач по Java | тесты, код, задания
5.57K subscribers
786 photos
9 videos
357 links
Задачи и тесты по Java для тренировки и обучения.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/KV5NkA

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
❓ Можно ли повторно использовать Stream после count?

OpenJDK 21. Что выведет код? Нужные импорты подключены.

var stream = Stream.of("A", "B");

System.out.println(stream.count());
stream.forEach(System.out::println);


👾 — 2, затем A и B
👍 — 2, затем IllegalStateException
🥰 — Только 2, без исключения
⚡️ — Ошибка компиляции

Ответ: 👍 — 2, затем IllegalStateException.

count — терминальная операция: поток уже использован. В OpenJDK 21 повторная терминальная операция на этом Stream.of вызывает IllegalStateException. Чтобы снова обработать те же данные, нужно создать новый поток из источника.

Правило в документации Java

🐸 Библиотека задач по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾1
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.

В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.

Например, можно совместить два направления по работе с ИИ:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета.

А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.

Акция действует до 31 октября включительно ⏳

⏮️ Пора прокачать свой стек
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Почему тернарное выражение с Integer может выбросить исключение?

OpenJDK 21. Что выведет код? Нужные импорты подключены.

Integer value = null;
boolean useValue = true;

Integer result = useValue ? value : 0;
System.out.println(result);


👾 — null
👍 — 0
🥰 — NullPointerException
⚡️ — Ошибка компиляции

Ответ: 🥰 — NullPointerException.

Ветви Integer и int образуют числовое условное выражение типа int. При выборе value требуется распаковать Integer в int. Но value равен null, поэтому возникает NullPointerException. Тип переменной result не отменяет эту распаковку.

Правило в документации Java

🐸 Библиотека задач по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6👍1
❓ Почему HashSet и TreeSet по-разному считают BigDecimal?

OpenJDK 21. Что выведет код? Нужные импорты подключены.

var a = new BigDecimal("1.0");
var b = new BigDecimal("1.00");

var hash = new HashSet<BigDecimal>();
hash.add(a);
hash.add(b);

var tree = new TreeSet<BigDecimal>();
tree.add(a);
tree.add(b);

System.out.println(hash.size() + " " + tree.size());


👾 — 2 1
👍 — 1 1
🥰 — 2 2
⚡️ — 1 2

Ответ: 👾 — 2 1.

HashSet опирается на equals и hashCode. Для BigDecimal equals учитывает и числовое значение, и scale: у 1.0 и 1.00 он различается. TreeSet без собственного компаратора использует compareTo, которое считает эти значения равными. Поэтому размеры — 2 и 1.

Правило в документации Java

🐸 Библиотека задач по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👾4👍1
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥

✅ 29 октября, четверг, 19:00 МСК — приходите на митап в Санкт-Петербурге или смотрите трансляцию. 

Спикеры из ЮMoney и Сбера выступят с докладами:

🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.

🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.

🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.

Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Сколько элементов создаст Arrays.asList из массива чисел?

Java 21. Что выведет код?

import java.util.Arrays;

class Demo {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};

var list = Arrays.asList(numbers);

System.out.println(list.size());
}
}


👾 — 3
👍 — 1
🥰 — 0
⚡️ — Ошибка компиляции

Ответ: 👍 — 1.

Метод получает один объект — массив int[]. Его элементы не превращаются автоматически в отдельные объекты Integer. Поэтому список содержит один массив. Для Integer[] результат был бы другим: список содержал бы три числа.

Документация: Arrays.asList

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🔥1👾1
❓ Что удалит remove: индекс или число?

Java 21. Что выведет код?

import java.util.ArrayList;
import java.util.List;

class Demo {
public static void main(String[] args) {
var values = new ArrayList<>(
List.of(1, 2, 1)
);

values.remove(1);
values.remove(Integer.valueOf(1));

System.out.println(values);
}
}


👾 — [2]
👍 — [1, 2]
🥰 — [1]
⚡️ — []

Ответ: 🥰 — [1].

Вызов remove(1) выбирает перегрузку с индексом и удаляет второй элемент — число 2. Остаётся [1, 1]. Вызов с Integer удаляет первое совпавшее значение 1, поэтому в списке остаётся одна единица.

Документация: перегрузки ArrayList.remove

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰11❤1⚡1
❓ Вызовется ли запасная функция у непустого Optional?

Java 21. Что выведет код?

import java.util.Optional;

class Demo {
static String fallback() {
System.out.println("fallback");
return "B";
}

public static void main(String[] args) {
var value = Optional.of("A");

System.out.println(
value.orElse(fallback())
);
System.out.println(
value.orElseGet(Demo::fallback)
);
}
}


👾 — A, затем A
👍 — fallback, затем B, затем A
🥰 — fallback, A, fallback, A
⚡️ — fallback, затем A, затем A

Ответ: ⚡️ — fallback, затем A, затем A.

Аргумент для orElse вычисляется до вызова метода. Поэтому fallback() выполняется, хотя запасное значение не понадобится. В orElseGet передаётся функция: она вызывается только для пустого Optional. Здесь второй вызов сразу возвращает A.

Документация: orElse и orElseGet

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6
❓ Изменится ли неизменяемый список вслед за исходным?

Java 21. Что выведет код?

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Demo {
public static void main(String[] args) {
var source = new ArrayList<>(List.of(1));

var view = Collections.unmodifiableList(source);
var copy = List.copyOf(source);

source.add(2);

System.out.println(view);
System.out.println(copy);
}
}


👾 — [1, 2], затем [1]
👍 — [1], затем [1]
🥰 — [1, 2], затем [1, 2]
⚡️ — Исключение на source.add(2)

Ответ: 👾 — [1, 2], затем [1].

unmodifiableList запрещает менять список через представление, но продолжает показывать содержимое исходного списка. List.copyOf создаёт неизменяемый список, который не отражает последующие изменения исходного. Поэтому двойка появляется только в view.

Документация: unmodifiableList • Документация: List.copyOf

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👾5❤2
❓ Равны ли два массива с одинаковыми вложенными массивами?

Java 21. Что выведет код?

import java.util.Arrays;

class Demo {
public static void main(String[] args) {
int[][] first = {{1, 2}};
int[][] second = {{1, 2}};

System.out.println(
Arrays.equals(first, second)
);
System.out.println(
Arrays.deepEquals(first, second)
);
}
}


👾 — true, затем true
👍 — false, затем true
🥰 — false, затем false
⚡️ — true, затем false

Ответ: 👍 — false, затем true.

Обычный Arrays.equals сравнивает элементы внешних массивов. Эти элементы — разные объекты int[], которые не переопределяют equals для сравнения содержимого. deepEquals спускается во вложенные массивы и сравнивает числа.

Документация: Arrays.equals и Arrays.deepEquals

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👾1
❓ Какова длина строки с одним эмодзи?

Java 21. В строке один эмодзи 😀. Что выведет код?

class Demo {
public static void main(String[] args) {
String text = "\uD83D\uDE00";

System.out.println(
text.length() + " " +
text.codePointCount(0, text.length())
);
}
}


👾 — 1 1
👍 — 2 2
🥰 — 2 1
⚡️ — 4 1

Ответ: 🥰 — 2 1.

Метод length() считает кодовые единицы UTF-16. Для этого эмодзи нужны две такие единицы — суррогатная пара. Метод codePointCount считает кодовые точки, поэтому возвращает 1. У составных эмодзи кодовых точек может быть несколько.

Документация: длина строки и кодовые точки

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰2
❓ Почему double не сохранил дробную часть?

Java 21. Что выведет код?

class Demo {
public static void main(String[] args) {
int first = 5;
int second = 2;

double a = first / second;
double b = (double) first / second;

System.out.println(a + " " + b);
}
}


👾 — 2.5 2.5
👍 — 2.0 2.0
🥰 — 2.5 2.0
⚡️ — 2.0 2.5

Ответ: ⚡️ — 2.0 2.5.

В первом выражении оба операнда имеют тип int. Деление даёт 2, и только затем результат преобразуется в double. Во втором выражении приведение происходит до деления, поэтому оно выполняется с плавающей точкой.

Документация: оператор деления

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡1
❓ Что увидит метод наследника во время работы конструктора родителя?

Java 21. Что выведет код?

class Base {
Base() {
show();
}

void show() {}
}

class Child extends Base {
int value = 7;

@Override
void show() {
System.out.print(value + " ");
}
}

class Demo {
public static void main(String[] args) {
var item = new Child();
System.out.println(item.value);
}
}


👾 — 0 7
👍 — 7 7
🥰 — Только 7
⚡️ — Ошибка компиляции

Ответ: 👾 — 0 7.

Конструктор Base вызывает переопределённый метод
Child.show. Но инициализатор value = 7 ещё не выполнялся: поле пока содержит стандартный ноль. После завершения конструктора родителя поле получает 7.

Документация: порядок инициализации объекта

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👾1
👀 Можно ли записать число в String[] через ссылку Object[]?

Java 21. Что произойдёт при запуске?

class Main {
public static void main(String[] args) {
Object[] values = new String[2];
values[0] = "Java";
values[1] = 42;

System.out.println(values[1]);
}
}


👾 — Выведет 42
👍 — Выведет строку "42"
🥰 — Выбросит ArrayStoreException
⚡️ — Код не скомпилируется

Ответ: 🥰 — выбросит ArrayStoreException.

Переменная имеет тип Object[], поэтому компилятор разрешает присвоить число. Сам массив создан как String[]: при записи JVM проверяет тип элемента. Строка проходит проверку, Integer — вызывает исключение. До println выполнение не дойдёт.

Документация: проверка типа при записи в массив.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6👾1
👀 Добавит ли computeIfAbsent ключ, если функция вернула null?

Java 21. Что выведет код?

import java.util.HashMap;

class Main {
public static void main(String[] args) {
var cache = new HashMap<String, String>();

cache.computeIfAbsent("user", key -> null);

System.out.println(cache.containsKey("user"));

cache.computeIfAbsent("user", key -> "Ann");

System.out.println(cache.get("user"));
}
}


👾 — true, затем null
👍 — false, затем Ann
🥰 — true, затем Ann
⚡️ — Выбросит NullPointerException

Ответ: 👍 — false, затем Ann.

Если вычисляющая функция возвращает null, computeIfAbsent оставляет отсутствующий ключ без записи. При следующем вызове функция выполнится снова. Она вернёт "Ann", и это значение попадёт в map.

Документация: Map.computeIfAbsent.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
👀 Сколько частей вернёт split для строки с запятыми в конце?

Java 21. Что выведет код?

class Main {
public static void main(String[] args) {
String text = "A,B,,";

System.out.println(text.split(",").length);
System.out.println(text.split(",", -1).length);
}
}


👾 — 4, затем 4
👍 — 3, затем 4
🥰 — 2, затем 2
⚡️ — 2, затем 4

Ответ: ⚡️ — 2, затем 4.

Вызов split(",") удаляет пустые элементы в конце результата. Остаются "A" и "B".

Отрицательный limit сохраняет конечные пустые элементы: получатся "A", "B", "" и "". Это пригодится при разборе строк, где пустое последнее поле имеет значение.

Документация: String.split.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4👍1
👀 Какую перегрузку метода выберет вызов с null?

Java 21. Что выведет код?

class Main {
static void show(Object value) {
System.out.println("Object");
}

static void show(String value) {
System.out.println("String");
}

public static void main(String[] args) {
show(null);
}
}


👾 — String
👍 — Object
🥰 — Выбросит NullPointerException
⚡️ — Код не скомпилируется из-за неоднозначности

Ответ: 👾 — String.

null подходит обоим параметрам. Компилятор выбирает наиболее конкретную подходящую перегрузку: String является подтипом Object.

Само по себе присваивание null параметру исключения не вызывает.

Документация: выбор наиболее конкретного метода.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡3👍3👾2
👀 Какой return сработает, если он есть и в try, и в finally?

Java 21. Что выведет код?

class Main {
static int result() {
try {
return 1;
} finally {
return 2;
}
}

public static void main(String[] args) {
System.out.println(result());
}
}


👾 — 1
👍 — 1 и 2
🥰 — 2
⚡️ — Код не скомпилируется

Ответ: 🥰 — 2.

После вычисления return 1 выполняется finally. Его return 2 заменяет уже подготовленный результат.

По той же причине return внутри finally способен скрыть исключение из try. Поэтому завершение метода лучше оставлять за пределами finally.

Документация: выполнение try-finally.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4⚡1
👀 Почему −7 / 3 и Math.floorDiv(−7, 3) дают разные ответы?

Java 21. Что выведет код?

class Main {
public static void main(String[] args) {
System.out.println(-7 / 3);
System.out.println(Math.floorDiv(-7, 3));
}
}


👾 — −3, затем −3
👍 — −2, затем −3
🥰 — −2, затем −2
⚡️ — −3, затем −2

Ответ: 👍 — −2, затем −3.

Целочисленное деление через / отбрасывает дробную часть, двигаясь к нулю. Для −7 / 3 получается −2.

floorDiv округляет результат вниз, к отрицательной бесконечности. Поэтому он возвращает −3.

Документация: Math.floorDiv.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
👀 Можно ли положить null в List.of?

Java 21. Что произойдёт при запуске?

import java.util.List;

class Main {
public static void main(String[] args) {
try {
var items = List.of("A", (String) null);
System.out.println(items.size());
} catch (NullPointerException e) {
System.out.println("null");
}
}
}


👾 — 2
👍 — 1
🥰 — null
⚡️ — Ошибка компиляции

Ответ: 🥰 — null.

List.of запрещает null среди элементов. Исключение возникает при создании списка, и catch печатает null. До вызова size выполнение не доходит.

Документация.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4