Библиотека собеса по Java | вопросы с собеседований
6.38K subscribers
359 photos
4 videos
200 links
Вопросы с собеседований по Java и ответы на них.

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

Учиться у нас: https://proglib.io/w/08c603b6

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
📶 Паттерны коммуникации в распределенных системах

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

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

☑️ Запрос-ответ с HTTP

Этот синхронный паттерн коммуникации предполагает, что один сервис отправляет запрос другому сервису и ожидает ответа или ошибки, блокируя свою работу до получения результата. REST, наиболее популярный архитектурный стиль для этой модели коммуникации, использует методы протокола HTTP — GET, POST, PUT и DELETE.
 
Однако использование этого паттерна может привести к проблемам, если сервисы образуют цепочку взаимодействий: в таком случае сбой одного из сервисов может привести к отказу всей операции, а также к расточительному использованию ресурсов и каскадным сбоям.

☑️ Общие данные

Этот паттерн часто остается незамеченным, поскольку разработчики не всегда воспринимают его как модель коммуникации. В рамках этого подхода один компонент записывает данные в определенное место, а другой компонент считывает и обрабатывает эти данные. Например, один сервис может загрузить файл в облачное объектное хранилище (например, в корзину Amazon S3), а другой сервис затем извлекает этот файл для дальнейших действий.

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

☑️ Асинхронный запрос-ответ

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

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

☑️ Коммуникация на основе событий

В этом подходе сервисы не общаются напрямую друг с другом, а генерируют события, которые могут быть использованы другими сервисами. Это требует наличия места для отправки данных о событиях и механизма, позволяющего получающим сервисам обнаруживать эти события. Брокеры сообщений, такие как RabbitMQ, могут обрабатывать оба этих аспекта. Издатели используют API для отправки событий в брокер, который управляет подписками и уведомляет подписчиков при поступлении события.

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

👨‍💻 Подробнее читайте в статье.
📨 Материал взят из нашей еженедельной email-рассылки, посвященной бэкенду. Подпишитесь, чтобы быть в числе первых, кто получит дайджест.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое абстрактные классы?

Абстрактные классы — это классы, которые не могут быть инстанциированы напрямую, то есть нельзя создать объект абстрактного класса при помощи оператора new. Они предназначены для обеспечения базовой структуры и функциональности для других классов, которые наследуются от них. Абстрактные классы представляют собой в некотором роде «заготовки» для подклассов, указывая на общие атрибуты и методы, которые они должны реализовать.
💪🛠️ Прокачай свой бэкенд: 9 инструментов, которые стоит знать

От браузерной ИИ-песочницы PostgreSQL до суперскоростного валидатора email — обзор новейших инструментов, которые упростят вашу работу и повысят продуктивность.

Читать статью
Что делает метод Character.toString()?

Метод Character.toString() в Java используется для преобразования символа в строку. Он принимает в качестве аргумента символ типа char и возвращает строку, состоящую из одного символа.

Сигнатура метода:

public static String toString(char ch)

Аргумент:
ch — символ, который необходимо преобразовать в строку.

Возвращаемое значение:
Строка, состоящая из одного символа.
Возведение в степень

Возвести число в степень можно двумя способами:

1) простое умножение;
2) используя метод Math.pow().

Использование библиотечной функции рекомендуется только в случае крайней необходимости, например, в случае дробной или отрицательной степени.

Простое умножение в Java работает в 300-600 раз эффективнее, кроме того, его можно дополнительно оптимизировать.
Реализуйте в Java класс, представляющий стек (stack), который поддерживает операции push, pop и получение минимального элемента (getMin) — все операции должны выполняться за константное время (O(1)). Напишите код и объясните, как вы решите эту задачу.

Объяснение:
В этом коде используется два стека: stack для хранения элементов стека и minStack для хранения минимальных элементов.
В методе push, при добавлении нового элемента в стек проверяется, является ли он минимальным. Если да, то он также добавляется в minStack.
В методе pop, при извлечении элемента из стека проверяется, является ли этот элемент минимальным. Если да, то он также удаляется из minStack.
Методы top и getMin просто возвращают верхний элемент стека и минимальный элемент соответственно.

Сложность:
Временная сложность для всех операций: O(1). Все операции выполняются за константное время, так как мы используем два стека и не производим поиск по всему стеку для поиска минимального элемента.

Пространственная сложность: O(n). Где n — количество элементов в стеке. Мы используем два стека, но их размер ограничен размером стека.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Какие существуют unchecked exception?

Наиболее часто встречающиеся: ArithmeticException, ClassCastException, ConcurrentModificationException, IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException, NoSuchElementException, NullPointerException, UnsupportedOperationException.
Что такое RecursiveTask?

RecursiveTask является частью фреймворка Fork/Join в Java, введенного в Java 7. Этот фреймворк предоставляет удобный способ распараллеливания выполнения задач.

RecursiveTask является подклассом ForkJoinTask. Он предназначен для использования вместе с пулом Fork/Join (ForkJoinPool) и предоставляет специальные методы для разделения задачи на подзадачи и объединения результатов.
Как получить IP адрес клиента на сервере?

IP адрес клиента можно получить вызвав request.getRemoteAddr().
Можно ли перегрузить static метод?

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

Например, можно создать статический метод sum, который будет складывать числа. Метод можно перегрузить, создав одну версию для сложения целых чисел (int), а другую — для сложения чисел с плавающей точкой (double).
При вызове метода компилятор будет выбирать нужную версию на основе типа аргументов.

Это делает класс с перегруженными методами более гибким и удобным для использования.
👾 -35% на курс по алгоритмам

На курсе вы на практике познакомитесь со сложными алгоритмами и научитесь писать более короткий и эффективный код – https://proglib.io/w/52359172

23 390 рублей 35 990 рублей

Что еще вас ждет на курсе:

▪️ 150 практических заданий и 47 видеолекций;

▪️ Бессрочный доступ ко всем материалам курса;

▪️ Развернутая обратная связь по всем домашним заданиям, а также ссылки на полезные дополнительные материалы.

🌚 Переходите на сайт, читайте подробности и заходите на обучение по самым выгодным условиям – https://proglib.io/w/52359172
Please open Telegram to view this post
VIEW IN TELEGRAM
💀 Как гарантированно провалить собеседование: 10 верных способов

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

Чтобы не завалить собеседование — забирайте наш курс:
🔵 Базовые модели ML и приложения

🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Как реализовать immutable класс?

Чтобы реализовать immutable класс, необходимо сделать класс финальным, а его поля приватными и финальными. Значения полей устанавливаются через конструктор и не могут изменяться после создания объекта. Методы-сеттеры исключаются, а геттеры возвращают копии объектов, если поля содержат ссылки на изменяемые объекты. Такой подход гарантирует неизменяемость объектов, что повышает их безопасность и упрощает многопоточное программирование.
Please open Telegram to view this post
VIEW IN TELEGRAM
Объясните разницу между параллелизмом и многопоточностью?

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

Параллелизм, с другой стороны, означает выполнение нескольких задач одновременно на разных ядрах процессора. В контексте параллелизма, задачи действительно выполняются одновременно, что может ускорить выполнение программы, если задачи могут быть разбиты на независимые части.
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между final, finally и finalize() в Java?

Эти три термина часто путают, но они имеют принципиально разные значения:

🔹 final — это ключевое слово, используемое для ограничения:
▪️ Переменная: значение не может быть изменено после инициализации.
▪️ Метод: не может быть переопределён в подклассе.
▪️ Класс: запрещает наследование.

🔹 finally — это блок кода, который всегда выполняется после блока try-catch, независимо от того, было ли исключение выброшено или нет. Часто используется для освобождения ресурсов (например, закрытия файлов или потоков).

🔹 finalize() — это метод, который вызывается сборщиком мусора перед уничтожением объекта. Использовался для освобождения ресурсов, но сейчас его использование не рекомендуется из-за непредсказуемости момента вызова.
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между «Lambdas» и «Anonymous Classes»

— Лямбда-выражения имеют лаконичный синтаксис по сравнению с анонимными классами. Лямбды проще читать и писать, так как они не требуют явного объявления метода, тогда как анонимные классы содержат больше «лишнего» кода.

— Лямбды используются, когда интерфейс имеет один абстрактный метод (функциональные интерфейсы), тогда как анонимные классы могут реализовать несколько методов и применяться для интерфейсов с несколькими методами.

— Лямбды могут быть более эффективными, так как они компилируются в байт-код, который может быть оптимизирован. Анонимные классы обычно компилируются как отдельные классы, что может требовать больше ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Heap и Stack?

🔹 Heap (Куча):
Это область памяти, где хранятся объекты и динамически создаваемые данные. Всё, что создаётся с помощью оператора new, помещается в кучу. Управление памятью здесь осуществляется автоматически через сборщик мусора (Garbage Collector). Память на куче выделяется динамически, и она имеет больший объём, чем стек.

🔹 Stack (Стек):
Это область памяти, где хранятся примитивные типы данных (int, float и т.д.) и ссылки на объекты, которые находятся в куче. Стек работает по принципу LIFO (последним пришёл — первым ушёл), и память выделяется под локальные переменные методов. Память на стеке освобождается автоматически, когда метод завершает выполнение.
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между sleep() и wait()?

🔹 sleep():

▪️ Приостанавливает выполнение текущего потока на заданное количество времени.
▪️ Не освобождает монитор (блокировку) объекта.
▪️ Вызывается как статический метод Thread.sleep(millis).

🔹 wait():

▪️ Приостанавливает текущий поток до тех пор, пока другой поток не вызовет метод notify() или notifyAll() на том же объекте.
▪️ Освобождает монитор объекта, позволяя другим потокам его использовать.
▪️ Вызывается на любом объекте, внутри синхронизированного блока synchronized.

Используйте sleep() для временной паузы, а wait() для синхронизации между потоками.
Please open Telegram to view this post
VIEW IN TELEGRAM