Java Guru 🤓
13.4K subscribers
939 photos
15 videos
794 links
Канал с вопросами и задачами с собеседований!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrSQZ

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Что выведет этот фрагмент кода?
3🔥2👏2
Что выведет этот фрагмент кода?
Anonymous Quiz
9%
Ничего не выведет
1%
4
62%
24
4%
10
20%
Произойдет ошибка
3%
12
👍8🔥2
Что будет выведено для запроса /api/hello?name=Spring
👍6🔥3🎉3
Что будет выведено для запроса /api/hello?name=Spring
Anonymous Quiz
3%
Hello, name
16%
Hello, World
69%
Hello, Spring
11%
400 Bad Request
👍12🎉6🔥3🥱2
Выберите верный формат, чтобы получить дату: 04-02-2025 12:15
👍5🔥3😁3👏1
Выберите верный формат, чтобы получить дату: 04-02-2025 12:15
Anonymous Quiz
13%
dd-mm-yyyyhh:mm
1%
d-m-y h:m
1%
d-M-y HH:mm
83%
dd-MM-yyyу HH:mm
1%
d-M-yyyy H:mm
👍10🥱5🔥3
Что выведет код?
👍5🤨4🔥3🥰1
Что выведет код?
Anonymous Quiz
6%
100
74%
1
18%
Compiler error
2%
Runtime error
🤨26👍8🔥2
Как нельзя называть переменные?

Этот вопрос подразумевает ответ из двух частей. Нужно указать, какие есть технические ограничения, и какие стилистические. Стиль – слишком большая тема, не специфичная только для Java, не будем на ней останавливаться.

Технически компилятор налагает одинаковые ограничения на имена как переменных, так и классов, методов, и всего остального. Эти имена обобщенно называются идентификаторы.

Ограничений всего три:
1. Имя целиком не должно совпадать с зарезервированным словом;
2. Первый символ должен проходить проверку методом Character.isJavaIdentifierStart();
3. Остальные символы должны проходить проверку Character.isJavaIdentifierPart().

На практике проверки означают, что имя должно состоять из таких символов Unicode, как:
• Буквы (разных языков)
• Символы валют (такие как $)
• Соединительные символы (такие как _)
• Диакритика (combining mark, non-spacing mark)
• Методы, проходящие Character.isIdentifierIgnorable() (непечатаемые символы, в идентификаторе игнорируются компилятором)
• Цифры, числовые символы (такие как римские числа)

Последний пункт недопустим для первого символа имени. Тип конкретного символа можно узнать методом Character.getType().

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


@javatasks #java
👍195🔥1🎉1
Какая из функций может указать JVM на необходимость запуска сборщика мусора?
Anonymous Quiz
9%
Runtime.gc()
51%
System.gc()
16%
Обе функции System.gc() и Runtime.gc()
24%
Ни одна из вышеуказанных
🤨11👍51
Что выведет код?
👍5🔥1👏1
Что выведет код?
Anonymous Quiz
9%
abc
66%
ABC
9%
Runtime Error
16%
Compiler Error
👍12🔥2🌚2
❗️Как работает ConcurrentHashMap под капотом?

ConcurrentHashMap – это высокопроизводительная реализация Map, специально разработанная для многопоточной среды. Она гарантирует безопасность данных при одновременном доступе и минимизирует использование блокировок.

💡 Основные механизмы:

🟡 Сегментация данных (до 8 java): Данные разделялись на сегменты, и блокировка происходила на уровне сегмента, а не всей карты. Это обеспечивало параллельный доступ к разным частям карты.

🟡 Кассовые таблицы (Java 8+): Вместо сегментов используется структура на основе Node[] – массив узлов. Это сделало структуру более гибкой. Вместо сегментации применяется механизм Fine-Grained Locking и Compare-And-Swap:
- Compare-And-Swap используется для операций записи, что позволяет избегать блокировок для большинства операций. Операции с разными бакетами могут выполняться параллельно, поскольку локальная блокировка применяется только к отдельному узлу или бакету.
- Fine-Grained Locking минимизирует область блокировок. Например, если требуется масштабирование (resize) или обработка коллизий, потоки могут продолжать работу с другими бакетами, даже если один из них временно заблокирован.
- synchronized применяется только для случаев, когда CAS не справляется (например, при реорганизации данных или сложных операциях). Это помогает поддерживать баланс между безопасностью и производительностью.

🟡 Масштабируемый массив (Resizable Array): Масштабирование в ConcurrentHashMap происходит градуально, чтобы избежать блокировки всей структуры. Новый массив создаётся с увеличенным размером, и данные переносятся постепенно, по частям. Во время переноса используется специальный узел ForwardingNode, который перенаправляет операции к новому массиву, обеспечивая корректную работу всех потоков.

📚 Основные методы:

🔘 get(Object key):
Легковесная операция, не требует блокировок. Ключ хэшируется, затем вычисляется индекс сегмента. Если в сегменте есть соответствующий узел, он возвращается.

🔘 put(K key, V value):
- Сначала используется CAS для вставки нового элемента.
- Если CAS не срабатывает (например, при наличии коллизии), включается локальная блокировка на соответствующей корзине.

🔘computeIfAbsent/compute:
Более сложные операции, которые комбинируют вычисления с модификацией. Используются короткие локи для минимизации блокировки других потоков.

⚠️ Особенности:

- ConcurrentHashMap не допускает хранения null для ключей и значений. Это связано с невозможностью различать отсутствие значения и реальное хранение null.
- Итерации по карте предоставляют "слабо согласованные" данные, что означает, что изменения, происходящие параллельно, могут быть частично видны.

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

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥41
👇Паттерн Строитель (Builder)

Builder — это порождающий паттерн, который позволяет пошагово создавать сложные объекты. Вместо того чтобы создавать объект одним большим конструктором с множеством параметров, Builder организует процесс создания по частям, обеспечивая гибкость и читаемость кода.

Использование:

🟡 Когда нужно создать объект с большим количеством параметров, и не все из них обязательны.
🟡 Когда процесс создания объекта требует выполнения нескольких шагов или дополнительных проверок.
🟡 В случаях, когда один и тот же код должен создавать разные представления объекта (например, текстовое и графическое).

Преимущества:

1️⃣ Упрощает создание сложных объектов, делая процесс понятным и читаемым.
2️⃣ Позволяет создавать объекты с разными вариациями без необходимости дублирования кода.
3️⃣ Разделяет логику создания объекта от его структуры, что упрощает поддержку и модификацию кода.

Недостатки:

1️⃣ Увеличивает сложность кода за счёт создания дополнительных классов и методов.
2️⃣ Может быть избыточным для простых объектов с небольшим количеством параметров.
3️⃣ Требует дополнительного внимания при проектировании, чтобы избежать путаницы между обязательными и необязательными шагами.

📌 Паттерн Builder полезен, если объект имеет много параметров и их нужно задавать гибко. Например, при создании сложных конфигураций для HTTP-запросов (заголовки, тело, параметры), построении графических интерфейсов или генерации HTML-документов. Builder помогает сделать код более понятным и избежать создания конструкций с длинными и неудобными конструкторами.

@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥6🥰32
Что выведет код?
👏5👍4🔥1🤔1
Где у Java приложения точка входа?

В обычном Java приложении всегда должен быть main class, содержащий метод main. С него начинается исполнение всей программы. Main class-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application.

main обязательно public static. Дополнительно, методу разрешено иметь модификатор strictfp. На аннотации и список исключений ограничений не накладывается.

В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции String[] и String... компилируются в один и тот же байт-код, так что приемлемы оба варианта. Название массива может быть любым, а значение будет содержать аргументы командной строки.

Когда приложение запускается как classpath, главный класс передается параметром командной строки. Если выполняется единственный исходник, он и описывает main class.

Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл META-INF/MANIFEST.MF добавляется строчка вида Main-Class: ru.itsobes.MyClass. Иначе запуск завершается ошибкой «no main manifest attribute».

В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».

В апплетах вместо main входной точкой служат методы init и start. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.


@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥43
Что такое функциональный интерфейс?

Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.

Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса Object также игнорируется.

Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).

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

Дополнительно функциональный интерфейс принято помечать аннотацией
@FunctionalInterface. Наличие этой аннотации не необходимо, но оно даёт дополнительную валидацию: её присутствие на нефункциональном типе спровоцирует ошибку компиляции.

Типичные примеры функциональных интерфейсов: Callable, Supplier, Comparable.


@javatasks #java
11👍5🔥3
Что будет результатом кода?
🎉8👍3🔥2👏1