Java Learning
18.7K subscribers
1.62K photos
1 video
3 files
998 links
№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.iss.one/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Download Telegram
Метод newSingleThreadExecutor()

Метод newSingleThreadExecutor() используется для создания ExecutorService с единственным рабочим потоком. ExecutorService предоставляет удобный способ управления выполнением задач в асинхронном режиме.

В примере выше создается ExecutorService с одним рабочим потоком, и две задачи (task1 и task2) передаются на выполнение с использованием метода submit(). Закрытие ExecutorService выполняется с помощью метода shutdown(), который гарантирует, что больше никакие задачи не будут приняты, и потоки будут завершены после завершения всех текущих задач.

#для_продвинутых
👍8
Какой метод должен быть переопределен классом, реализующим интерфейс Runnable для выполнения задачи в отдельном потоке?
Anonymous Quiz
4%
int run()
74%
void run()
3%
boolean run()
11%
void run(int priority)
8%
Узнать ответ
👍22
#Вопросы_с_собеседования
Рассмотрим задачу по созданию простого сервиса для управления задачами (To-Do list). Ваша задача — написать простую программу, которая позволяет добавлять задачи, удалять задачи и выводить список текущих задач.

Мы импортируем две библиотеки. ArrayList используется для хранения списка задач, а Scanner — для ввода данных с клавиатуры. Затем определяем класс ToDoList и объявляем переменную tasks типа ArrayList, которая будет хранить наши задачи.

Затем создаем объект Scanner для считывания ввода с клавиатуры и бесконечный цикл для взаимодействия с пользователем.

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

Таким образом, программа предоставляет простой интерфейс для взаимодействия с To-Do list, позволяя пользователю добавлять, удалять и просматривать задачи.
👍18
PushbackInputStream

PushbackInputStream — это класс, который обеспечивает возможность «откатывать» (push back) один или несколько байтов в поток ввода. Этот класс является подклассом FilterInputStream и добавляет функциональность для отката байтов.

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

#для_продвинутых
👍111
ServletContext

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

Некоторые из основных методов, предоставляемых интерфейсом ServletContext, включают:

getInitParameter(String name): Возвращает значение инициализационного параметра сервлета, указанного по имени.
getInitParameterNames(): Возвращает имена всех инициализационных параметров сервлета.
getAttribute(String name): Возвращает значение атрибута, сохраненного в контексте сервлета по имени.
setAttribute(String name, Object object): Устанавливает значение атрибута в контексте сервлета.
getRequestDispatcher(String path): Возвращает объект RequestDispatcher, который используется для включения другого ресурса (например, другого сервлета или JSP-страницы) в текущий запрос.
getRealPath(String path): Преобразует виртуальный путь в абсолютный путь на сервере.

#для_продвинутых
👍72
InterruptedException

Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.

Thread.stop() это устаревший метод, который просто убивал поток. Сейчас есть Thread.interrupt() который говорит, что потоку надо закончить работу.

Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки !Thread.currentThread().isInterrupted().

#для_продвинутых
👍6
Аргументы командной строки

Аргументы командной строки передается методу main в виде массива строк (String[] args). Когда вы запускаете программу Java из командной строки, вы можете передать дополнительные параметры после имени класса. Эти параметры будут доступны в виде элементов массива args.

#для_продвинутых
👍9
#Вопросы_с_собеседования
🚩 Можете ли вы объяснить, как работает механизм 'Double Brace Initialization' в Java и в каких случаях его использование может быть неэффективным?

Механизм "Double Brace Initialization" в Java - это способ инициализации объектов, основанный на анонимных внутренних классах, где первые фигурные скобки создают анонимный подкласс, а вторые - блок инициализации. Этот подход может быть неэффективным из-за создания дополнительного класса для каждого использования, что увеличивает использование памяти и может затруднить чтение кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Конвертируем массив в список

Arrays.asList() — это статический метод класса Arrays, который позволяет конвертировать обычный массив в список List.

— Принимает массив в качестве аргумента и возвращает объект типа List с элементами этого массива.

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

— Изменения в возвращаемом списке будут вноситься в исходный массив, т. к. список работает как "представление" массива. Метод работает для массивов примитивных и ссылочных типов.

Arrays.asList хорош для чтения элементов массива, но не для записи из-за неизменяемого размера.
👍10🎄1
Micronaut

Micronaut — это современный фреймворк для создания микросервисных приложений на языке Java, Kotlin и Groovy. Он разрабатывался с учетом требований эффективности, производительности и легковесности.

— Легковесность: Micronaut предлагает низкоресурсное потребление благодаря тому, что многие операции выполняются во время компиляции, а не во время выполнения. Это позволяет создавать быстрые и эффективные приложения.
— Инъекция зависимостей во время компиляции: В отличие от многих других фреймворков, которые используют внедрение зависимостей во время выполнения, Micronaut выполняет внедрение зависимостей во время компиляции, что повышает производительность.
— Встроенная поддержка для микросервисной архитектуры: Micronaut предоставляет инструменты и функциональность для создания микросервисов, включая обработку HTTP-запросов, масштабирование и управление конфигурацией.
— Поддержка различных протоколов: Micronaut поддерживает различные протоколы взаимодействия, такие как HTTP, WebSocket, gRPC, RMI и многие другие.
— Встроенная поддержка тестирования: Фреймворк обеспечивает инструменты для написания и запуска тестов, что упрощает разработку надежных приложений.

Для подробной информации о Micronaut и примеров использования рекомендуется обратиться к официальной документации Micronaut.

#для_продвинутых
👍12🤔1
Вложенные классы

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

Статические вложенные классы (Static Nested Classes):

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

Внутренние классы (Inner Classes):

— Внутренние классы не объявляются с использованием ключевого слова static.
— Они имеют доступ ко всем членам внешнего класса, включая нестатические поля и методы.
— Внутренние классы могут быть обычными (обычные вложенные классы), анонимными или локальными.

#для_начинающих
👍8
#Вопросы_с_собеседования

🎙️ Какие два класса не наследуются от Object?

Ответ:
Не ведитесь на провокации, нет таких классов: все классы прямо или через предков наследуются от класса Object!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍49😁11🤔1
#Вопросы_с_собеседования
Реализуйте простой кэш на Java. Класс должен поддерживать операции добавления значения по ключу, получения значения по ключу и удаления значения по ключу. Кэш должен иметь фиксированный размер, и при превышении этого размера он должен удалять самый старый элемент. Как вы обеспечите оптимальную производительность операций?


Решение:

Кэш будет представлять собой обобщенный класс
SimpleCache, который может хранить пары ключ-значение. Размер кэша будет ограничен, чтобы избежать переполнения. В случае превышения размера, самый старый элемент будет удаляться.
Для хранения данных будем использовать
HashMap (cache), так как это обеспечит эффективный доступ к значениям по ключу. Для отслеживания порядка ключей (чтобы определить самый старый элемент) будем использовать Queue (keyQueue), в данном случае LinkedList.

Инициализируем кэш. Конструктор
SimpleCache принимает максимальный размер кэша и инициализирует cache и keyQueue. Добавляем элемент в кэш и при добавлении элемента проверяем, не превышен ли максимальный размер. Если превышен, вызываем метод evictOldest для удаления самого старого элемента.
Добавляем новый элемент в
cache и помещаем ключ в keyQueue. Получаем элемент по ключу. Если элемент существует в кэше, перемещаем соответствующий ключ в конец keyQueue (чтобы отметить последнее использование) и возвращаем значение. Удаляем элемент из cache и соответствующий ключ из keyQueue. Получаем самый старый ключ из начала keyQueue, удаляем соответствующий элемент из cache.
👍124
Есть ли смысл использовать лямбды в Java в целях оптимизации, или это только для улучшения читабельности кода?
Anonymous Quiz
35%
Только улучшение читабельности
40%
Есть смысл использовать всегда, так как это более оптимально
25%
Есть смысл использовать только в циклах вместо анонимных классов
👍6
Класс ZonedDateTime

Класс ZonedDateTime предоставляет функциональность для представления даты и времени с учетом временной зоны. Этот класс входит в пакет java.time, который был представлен в Java 8 в рамках нового API времени и даты.

Как видно из примера, ZonedDateTime учитывает временную зону (в данном случае, ZoneId.of("Europe/Paris")). Вы также можете использовать другие методы для манипуляций с датой и временем, такие как plusDays, minusHours, и т. д.

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

#для_начинающих
👍10
#Вопросы_с_собеседования
Расскажите о принципе работы алгоритма сортировки QuickSort. Напишите Java-код для реализации этого алгоритма и объясните его эффективность. Также, укажите, какие могут быть проблемы с производительностью в некоторых случаях и как можно их решить.


Алгоритм QuickSort относится к семейству алгоритмов быстрой сортировки. Он использует подход "разделяй и властвуй", разбивая массив на подмассивы, сортируя их и затем объединяя весь массив.
quickSort: Рекурсивная функция, которая разделяет массив и вызывает сама себя для подмассивов.
partition: Функция, которая определяет местоположение опорного элемента (pivot) и переставляет элементы так, чтобы элементы меньше pivot находились слева, а больше — справа.

QuickSort в среднем случае имеет сложность O(n log n), что делает его одним из самых эффективных алгоритмов сортировки. QuickSort может показывать плохую производительность в случае уже отсортированных или почти отсортированных данных. Это может быть улучшено, выбирая разумные опорные элементы или переходя к другому алгоритму, например, Insertion Sort, для небольших подмассивов.
👍14
#Вопросы_с_собеседования
Реализуйте в Java класс, представляющий стек (stack), который поддерживает операции push, pop и получение минимального элемента (getMin) — все операции должны выполняться за константное время (O(1)). Напишите код и объясните, как вы решите эту задачу.


Объяснение:

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

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

Пространственная сложность: O(n). Где n — количество элементов в стеке. Мы используем два стека, но их размер ограничен размером стека.
👍14
#Вопросы_с_собеседования
Как в Java реализуется принцип "Double-Checked Locking" в контексте создания экземпляров синглтонов и какие особенности данного подхода нужно учитывать, чтобы избежать проблем с многопоточностью?

В Java, "Double-Checked Locking" используется для минимизации затрат на синхронизацию при создании экземпляров синглтонов в многопоточных средах. Этот подход включает двойную проверку: сначала проверяется, был ли уже создан экземпляр без блокировки, а затем, если экземпляр не создан, происходит блокировка и повторная проверка. Важно использовать ключевое слово volatile для переменной экземпляра синглтона, чтобы обеспечить корректную работу в многопоточной среде из-за проблем с упорядоченностью чтения/записи в Java Memory Model.
👍19
Почему Map не наследуется от Collection?

Это связано с различиями в их целях и использовании. Интерфейс Collection представляет собой общие методы для работы с группой объектов, таких как добавление, удаление и проверка наличия элемента. Он ориентирован на работу с коллекциями объектов, где каждый объект является элементом коллекции.

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

Интерфейс Map включает в себя методы для управления парами ключ-значение и обеспечивает эффективный доступ к значениям по ключу. По этим причинам он не является подтипом Collection. Однако, классы, реализующие интерфейс Map, часто предоставляют методы, которые позволяют работать с элементами коллекции или возвращают представление коллекции ключей, значений или записей (ключ-значение).

Таким образом, хотя Map и Collection предоставляют абстракции для работы с группой объектов, они решают разные задачи, и поэтому не существует иерархического отношения наследования между ними.

#для_продвинутых
👍18
#Вопросы_с_собеседования
Расскажите о принципе Dependency Injection (внедрение зависимостей) в Java. Приведите пример кода, демонстрирующий использование Dependency Injection, и объясните, как его.


Объяснение:

Dependency Injection (внедрение зависимостей) — это паттерн проектирования, который заключается в том, что объект получает все свои зависимости извне, а не создает их сам. Это делает классы более независимыми, повышает их переиспользуемость и упрощает тестирование.

1. Интерфейс Engine: Определяет контракт для всех типов двигателей.
2. Реализация GasolineEngine: Конкретная реализация интерфейса Engine.
3. Класс Car: Класс автомобиля, зависящий от интерфейса Engine. Зависимость внедряется через конструктор. Мы можем легко заменить GasolineEngine другой реализацией Engine без изменения кода класса Car.
👍193