Пост для Java-разработчиков, которые ищут работу или собираются увольняться с текущего места.
👉 Подписывайтесь на наш канал — в нем каждый день выходят лучшие вакансии на рынке с нормальными зарплатными вилками и хорошими условиями.
Публикуем предложения для джунов, мидлов и сеньоров, на удаленке и в офисах — оффер мечты точно найдется 👨💻
🔸Подписаться🔸
👉 Подписывайтесь на наш канал — в нем каждый день выходят лучшие вакансии на рынке с нормальными зарплатными вилками и хорошими условиями.
Публикуем предложения для джунов, мидлов и сеньоров, на удаленке и в офисах — оффер мечты точно найдется 👨💻
🔸Подписаться🔸
Расскажите о различиях вложенных классов: простых и статических?
Простые вложенные классы используются для тесной связи с внешним классом, а статические — когда нужно логически сгруппировать некоторый функционал.
Основные различия:
— Простой вложенный класс имеет доступ к членам внешнего класса, статический — нет.
— Для создания экземпляра простого вложенного класса нужен экземпляр внешнего класса, для статического — нет.
— Простой вложенный класс зависит от экземпляра внешнего класса, статический — нет.
Простые вложенные классы используются для тесной связи с внешним классом, а статические — когда нужно логически сгруппировать некоторый функционал.
Основные различия:
— Простой вложенный класс имеет доступ к членам внешнего класса, статический — нет.
— Для создания экземпляра простого вложенного класса нужен экземпляр внешнего класса, для статического — нет.
— Простой вложенный класс зависит от экземпляра внешнего класса, статический — нет.
Для чего в стримах предназначен метод sorted() (Java 8)?
Метод sorted() является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator.
Порядок элементов в исходной коллекции остается нетронутым — sorted() всего лишь создает его отсортированное представление.
Метод sorted() является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator.
Порядок элементов в исходной коллекции остается нетронутым — sorted() всего лишь создает его отсортированное представление.
Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а экземпляры ссылочных типов данных в куче?
Ответ:
Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё, что явно или неявно создаётся при помощи оператора new) хранится в куче.
Ответ:
Зачем нужен HashMap, если есть Hashtable?
☕ Методы класса Hashtable синхронизированы, что приводит к снижению производительности, а HashMap — нет;
☕ HashTable не может содержать элементы null, тогда как HashMap может содержать один ключ null и любое количество значений null;
☕ Iterator у HashMap, в отличие от Enumeration у HashTable, работает по принципу «fail-fast» (выдает исключение при любой несогласованности данных).
Hashtable это устаревший класс и его использование не рекомендовано.
☕ Методы класса Hashtable синхронизированы, что приводит к снижению производительности, а HashMap — нет;
☕ HashTable не может содержать элементы null, тогда как HashMap может содержать один ключ null и любое количество значений null;
☕ Iterator у HashMap, в отличие от Enumeration у HashTable, работает по принципу «fail-fast» (выдает исключение при любой несогласованности данных).
Hashtable это устаревший класс и его использование не рекомендовано.
Какие существуют состояния потоков (thread)?
Существует 4 состояния потока в Java:
1) Новый поток.
2) Запускаемый (Runnable).
3) Незапускаемый (Non-Runnable).
4) Мертвый или прекращенный (Dead или Terminated).
Существует 4 состояния потока в Java:
1) Новый поток.
2) Запускаемый (Runnable).
3) Незапускаемый (Non-Runnable).
4) Мертвый или прекращенный (Dead или Terminated).
Что такое Local Variable?
Популярный вопрос на собеседовании Java-разработчика. Local variable — это переменная, которая определена внутри метода и существует вплоть до того момента, пока выполняется этот метод. Как только выполнение закончится, локальная переменная перестанет существовать.
Вот программа, которая использует локальную переменную helloMessage в методе main().
Популярный вопрос на собеседовании Java-разработчика. Local variable — это переменная, которая определена внутри метода и существует вплоть до того момента, пока выполняется этот метод. Как только выполнение закончится, локальная переменная перестанет существовать.
Вот программа, которая использует локальную переменную helloMessage в методе main().
Что такое «сессия»?
Сессия — это сеанс связи между клиентом и сервером, устанавливаемый на определенное время. Сеанс устанавливается непосредственно между клиентом и веб-сервером в момент получения первого запроса к веб-приложению. Каждый клиент устанавливает с сервером свой собственный сеанс, который сохраняется до окончания работы с приложением.
Сессия — это сеанс связи между клиентом и сервером, устанавливаемый на определенное время. Сеанс устанавливается непосредственно между клиентом и веб-сервером в момент получения первого запроса к веб-приложению. Каждый клиент устанавливает с сервером свой собственный сеанс, который сохраняется до окончания работы с приложением.
О чем говорит ключевое слово throws?
Ответ:
Модификатор throws прописывается в заголовке метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.
Ответ:
Модификатор throws прописывается в заголовке метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.
Какое худшее время работы метода get(key) для ключа, который есть в HashMap?
O(N). Худший случай — это поиск ключа в HashMap, вырожденного в список по причине совпадения ключей по hashCode() и для выяснения хранится ли элемент с определённым ключом может потребоваться перебор всего списка.
O(N). Худший случай — это поиск ключа в HashMap, вырожденного в список по причине совпадения ключей по hashCode() и для выяснения хранится ли элемент с определённым ключом может потребоваться перебор всего списка.
Что не так с кодом?
Он не скомпилируется. Это вопрос на знание иерархии исключений: FileNotFoundException унаследован от IOException, первый catch будет перехватывать все исключения, а в следующий блок catch управление передано не будет. Поэтому возникнет ошибка: exception FileNotFoundException has already been caught.
Он не скомпилируется. Это вопрос на знание иерархии исключений: FileNotFoundException унаследован от IOException, первый catch будет перехватывать все исключения, а в следующий блок catch управление передано не будет. Поэтому возникнет ошибка: exception FileNotFoundException has already been caught.
Что такое пул строк? Это набор строк, хранящийся в Heap.
☕ Пул строк возможен благодаря неизменяемости строк в Java и реализации идеи интернирования строк;
☕ Пул строк помогает экономить память, но по этой же причине создание строки занимает больше времени;
☕ Когда для создания строки используются ", то сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка на неё;
☕ При использовании оператора new создаётся новый объект String. Затем при помощи метода intern() эту строку можно поместить в пул или же получить из пула ссылку на другой объект String с таким же значением;
☕ Пул строк является примером паттерна «Приспособленец» (Flyweight).
☕ Пул строк возможен благодаря неизменяемости строк в Java и реализации идеи интернирования строк;
☕ Пул строк помогает экономить память, но по этой же причине создание строки занимает больше времени;
☕ Когда для создания строки используются ", то сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка на неё;
☕ При использовании оператора new создаётся новый объект String. Затем при помощи метода intern() эту строку можно поместить в пул или же получить из пула ссылку на другой объект String с таким же значением;
☕ Пул строк является примером паттерна «Приспособленец» (Flyweight).
Что такое Map.of()?
Map.of() — это метод, представленный в Java 9, который позволяет разработчикам создавать неизменяемый Map, содержащий до десяти пар ключ-значение. Он обеспечивает удобный и лаконичный способ создания Map без необходимости написания большого количества кода.
Map.of() является улучшением по сравнению с предыдущим способом создания небольших Map с использованием конструктора класса HashMap, который может быть довольно громоздким и многословным.
Map.of() — это метод, представленный в Java 9, который позволяет разработчикам создавать неизменяемый Map, содержащий до десяти пар ключ-значение. Он обеспечивает удобный и лаконичный способ создания Map без необходимости написания большого количества кода.
Map.of() является улучшением по сравнению с предыдущим способом создания небольших Map с использованием конструктора класса HashMap, который может быть довольно громоздким и многословным.
Какие есть особенности класса String?
🧠 Это неизменяемый (immutable) и финализированный тип данных;
🧠 Все объекты класса String JVM хранит в пуле строк;
🧠 Объект класса String можно получить, используя двойные кавычки;
🧠 Можно использовать оператор + для конкатенации строк;
🧠 Начиная с Java 7 строки можно использовать в конструкции switch.
🧠 Это неизменяемый (immutable) и финализированный тип данных;
🧠 Все объекты класса String JVM хранит в пуле строк;
🧠 Объект класса String можно получить, используя двойные кавычки;
🧠 Можно использовать оператор + для конкатенации строк;
🧠 Начиная с Java 7 строки можно использовать в конструкции switch.
Можно ли переопределить статический или частный метод в Java?
Частный метод недоступен вне класса, поэтому он не будет переопределен подклассом. Следовательно, его нельзя переопределить. Точно так же статический метод не может быть переопределен, потому что если мы создадим статические методы с одним и тем же именем метода и сигнатурой как в базовом, так и в производном классе, производный класс скроет методы в базовом классе. Это известно как сокрытие метода.
Частный метод недоступен вне класса, поэтому он не будет переопределен подклассом. Следовательно, его нельзя переопределить. Точно так же статический метод не может быть переопределен, потому что если мы создадим статические методы с одним и тем же именем метода и сигнатурой как в базовом, так и в производном классе, производный класс скроет методы в базовом классе. Это известно как сокрытие метода.
Какая разница между абстрактным классом и интерфейсом?
Абстрактный класс:
☕ абстрактные классы имеют дефолтный конструктор; он вызывается каждый раз, когда создается потомок этого абстрактного класса;
☕ содержит как абстрактные методы, так и не абстрактные. По большому счету может и не содержать абстрактных методов, но все равно быть абстрактным классом;
☕ класс, который наследуется от абстрактного, должен реализовать только абстрактные методы;
☕ абстрактный класс может содержать Instance Variable.
Интерфейс:
☕ не имеет никакого конструктора и не может быть инициализирован;
☕ только абстрактные методы должны быть добавлены (не считая default methods);
☕ классы, реализующие интерфейс, должны реализовать все методы (не считая default methods);
☕ интерфейсы могут содержать только константы.
Абстрактный класс:
☕ абстрактные классы имеют дефолтный конструктор; он вызывается каждый раз, когда создается потомок этого абстрактного класса;
☕ содержит как абстрактные методы, так и не абстрактные. По большому счету может и не содержать абстрактных методов, но все равно быть абстрактным классом;
☕ класс, который наследуется от абстрактного, должен реализовать только абстрактные методы;
☕ абстрактный класс может содержать Instance Variable.
Интерфейс:
☕ не имеет никакого конструктора и не может быть инициализирован;
☕ только абстрактные методы должны быть добавлены (не считая default methods);
☕ классы, реализующие интерфейс, должны реализовать все методы (не считая default methods);
☕ интерфейсы могут содержать только константы.
Что такое «поток-демон» (daemon thread)?
Потоками-демонами называются потоки, работающие в фоновом режиме для нашей программы.
В Java процесс завершается тогда, когда завершается последний его поток. Даже если метод main() уже завершился, но еще выполняются порожденные им потоки, система будет ждать их завершения.
Однако это правило не относится к особому виду потоков — демонам. Если завершился последний обычный поток процесса, и остались только потоки-демоны, то они будут принудительно завершены и выполнение процесса закончится. Чаще всего потоки-демоны используются для выполнения фоновых задач, обслуживающих процесс в течение его жизни.
Потоками-демонами называются потоки, работающие в фоновом режиме для нашей программы.
В Java процесс завершается тогда, когда завершается последний его поток. Даже если метод main() уже завершился, но еще выполняются порожденные им потоки, система будет ждать их завершения.
Однако это правило не относится к особому виду потоков — демонам. Если завершился последний обычный поток процесса, и остались только потоки-демоны, то они будут принудительно завершены и выполнение процесса закончится. Чаще всего потоки-демоны используются для выполнения фоновых задач, обслуживающих процесс в течение его жизни.
Как перебрать все пары «ключ-значение» в Map?
Использовать метод entrySet(), который возвращает множество Set пар «ключ-значение».
Использовать метод entrySet(), который возвращает множество Set пар «ключ-значение».
Зачем добавили ArrayList, если уже был Vector?
☕ Методы класса Vector синхронизированы, а ArrayList — нет;
☕ По умолчанию Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
☕ Методы класса Vector синхронизированы, а ArrayList — нет;
☕ По умолчанию Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
Чем Hashtable отличается от Hashmap?
Синхронизация:
Hashtable является синхронизированным, т. е. потокобезопасным. HashMap не синхронизирован и не является потокобезопасным.
null ключи и значения:
В HashMap можно использовать null в качестве ключа или значения. В Hashtable null в качестве ключа или значения вызовет ошибку.
Порядок элементов:
HashMap не гарантирует порядок элементов. Hashtable хранит элементы в том порядке, в котором они были вставлены.
Производительность:
Из-за синхронизации Hashtable работает медленнее, чем HashMap.
Размер таблицы:
В HashMap он динамически увеличивается, а в Hashtable изначально задается фиксированным.
Итерирование:
Hashtable использует Enumerator, а HashMap — Iterator.
Синхронизация:
Hashtable является синхронизированным, т. е. потокобезопасным. HashMap не синхронизирован и не является потокобезопасным.
null ключи и значения:
В HashMap можно использовать null в качестве ключа или значения. В Hashtable null в качестве ключа или значения вызовет ошибку.
Порядок элементов:
HashMap не гарантирует порядок элементов. Hashtable хранит элементы в том порядке, в котором они были вставлены.
Производительность:
Из-за синхронизации Hashtable работает медленнее, чем HashMap.
Размер таблицы:
В HashMap он динамически увеличивается, а в Hashtable изначально задается фиксированным.
Итерирование:
Hashtable использует Enumerator, а HashMap — Iterator.
Как и когда происходит увеличение количества корзин в HashMap?
Помимо capacity у HashMap есть еще поле loadFactor, на основании которого, вычисляется предельное количество занятых корзин capacity * loadFactor. По умолчанию loadFactor = 0.75. По достижению предельного значения, число корзин увеличивается в 2 раза и для всех хранимых элементов вычисляется новое «местоположение» с учетом нового числа корзин.
Помимо capacity у HashMap есть еще поле loadFactor, на основании которого, вычисляется предельное количество занятых корзин capacity * loadFactor. По умолчанию loadFactor = 0.75. По достижению предельного значения, число корзин увеличивается в 2 раза и для всех хранимых элементов вычисляется новое «местоположение» с учетом нового числа корзин.