Библиотека собеса по 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
加入频道
Что делает метод 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
В чем разница между LinkedHashMap и TreeMap в Java?

🔹 Порядок хранения элементов:

▪️ LinkedHashMap сохраняет порядок вставки элементов. То есть, когда вы итерируете по коллекции, элементы будут возвращаться в том порядке, в котором они были добавлены.
▪️ TreeMap, с другой стороны, сортирует элементы по ключу. Это означает, что порядок следования элементов при итерации определяется натуральным порядком ключей (если ключи реализуют Comparable) или компаратором, который вы передадите.

🔹 Время доступа к элементам:

▪️ LinkedHashMap использует хеш-таблицу, и поэтому в среднем имеет более быстрый доступ к элементам — поиск, вставка и удаление выполняются в среднем за время, близкое к O(1).
▪️ TreeMap реализована на основе красно-чёрного дерева, что делает операции поиска, вставки и удаления в среднем более медленными — за время O(log n), так как элементы поддерживаются в отсортированном виде.

🔹 Использование в различных задачах:

▪️ LinkedHashMap подходит для задач, где важен порядок вставки элементов, например, при реализации кэша с ограниченным количеством элементов.
▪️ TreeMap полезна, когда необходимо хранить элементы в отсортированном порядке или когда важен быстрый поиск минимального/максимального ключа.
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между перегрузкой метода и переопределением метода?

🔵 Перегрузка метода (Overloading):

▪️ Параметры метода должны отличаться — это могут быть разные типы, количество или порядок параметров.
▪️ Наследование не требуется. Все происходит внутри одного класса.


public void Print(int number) {  }
public void Print(string text) { }


🔵 Переопределение метода (Overriding):


▪️ Параметры метода должны быть идентичны (тип, количество и порядок).
▪️ Наследование обязательно. Метод переопределяется в классе-наследнике для изменения поведения базового метода.


class Animal {
public void sound() { System.out.println("Animal sound"); }
}

class Dog extends Animal {
@Override
public void sound() { System.out.println("Dog barks"); }
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Как работает механизм компиляции JIT (Just-In-Time) в JVM?

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

1. Основные этапы работы JIT:

🔹 Интерпретация байт-кода:
Сначала JVM интерпретирует байт-код, строчка за строчкой. Это позволяет быстрее запускать программы.

🔹 Сбор статистики:
JVM отслеживает, какие методы выполняются чаще всего (горячие методы). Для этого используется счётчик вызовов.

🔹 Триггер для компиляции:
Когда счётчик вызовов достигает определённого порога, JVM принимает решение скомпилировать этот метод в машинный код с помощью JIT. Это позволяет ускорить выполнение программы, так как скомпилированный машинный код выполняется гораздо быстрее.

🔹 Оптимизации:
▪️ Inlining: Встраивание часто вызываемых методов прямо в вызывающий код, что уменьшает накладные расходы на вызов методов.
▪️ Unboxing и устранение лишних объектов: Это снижает затраты на выделение памяти и сборку мусора.
▪️ Удаление мёртвого кода: Устранение инструкций, которые никогда не будут выполнены.

2. Профилирование и адаптивная оптимизация:

JIT использует адаптивный подход, который позволяет JVM оптимизировать код на основе реальных данных профилирования. Например, если JVM видит, что одна ветка условия выполняется чаще, она может оптимизировать её исполнение.

3. Кэширование и компиляция на лету:

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

4. Видов JIT-компиляции несколько:

🔹C1-компилятор: Работает с менее оптимизированным кодом, но быстрее компилирует его. Обычно используется на ранних этапах работы программы.
🔹C2-компилятор: Более агрессивный и выполняет больше оптимизаций, но компиляция занимает больше времени. Используется для часто вызываемых методов.
Please open Telegram to view this post
VIEW IN TELEGRAM