Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
34 photos
2 videos
1.13K links
Download Telegram
📌 Зачем нужен JSP ?

💬 Спросят с вероятностью 6%

Java Server Pages (JSP) является мощной технологией для создания динамически генерируемых веб-страниц на стороне сервера. Предоставляет множество преимуществ и решает ряд задач, которые делают его необходимым в разработке веб-приложений:

1️⃣ Генерация динамического контента

Позволяет создавать веб-страницы, контент которых может изменяться в зависимости от запросов пользователя, данных из базы данных или других серверных ресурсов.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>Dynamic Content</noscript>
</head>
<body>
<h1>Welcome, <%= request.getParameter("username") %>!</h1>
</body>
</html>


2️⃣ Разделение логики и представления (MVC)

Используется в архитектуре для разделения бизнес-логики (которая обрабатывается сервлетами или другими компонентами) и представления (отображение данных пользователю).

Сервлет (Controller):

    @WebServlet("/greeting")
public class GreetingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
request.setAttribute("name", name);
request.getRequestDispatcher("/greeting.jsp").forward(request, response);
}
}


JSP (View):

    <html>
<head><noscript>Greeting</noscript></head>
<body>
<h1>Hello, ${name}!</h1>
</body>
</html>


3️⃣ Интеграция с JavaBeans и другими компонентами

Может легко интегрироваться с JavaBeans, EJB и другими серверными компонентами для управления данными и бизнес-логикой.
<jsp:useBean id="user" class="com.example.User" scope="request"/>
<p>Username: <jsp:getProperty name="user" property="username"/></p>


4️⃣ Поддержка выражений языка JSP (EL)

Упрощает доступ к данным и позволяет использовать упрощенный синтаксис для работы с атрибутами запросов, сессий и других областей.
<p>Current user: ${user.username}</p>


5️⃣ Повторное использование компонентов и модульность

Позволяет использовать теги и фрагменты JSP (JSP include и tag libraries) для создания модульных и повторно используемых компонентов.
<%@ include file="header.jsp" %>
<%@ include file="footer.jsp" %>


6️⃣ Простота и удобство разработки

Страницы по синтаксису похожи на HTML, что делает их доступными для веб-дизайнеров и разработчиков с минимальным опытом программирования на Java.

7️⃣ Высокая производительность

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

8️⃣ Поддержка международных стандартов и спецификаций.

Является частью спецификации Java EE, что обеспечивает соответствие стандартам и хорошую интеграцию с другими технологиями Java EE.

JSP нужен для создания динамически генерируемых веб-страниц, разделения логики и представления (MVC), интеграции с JavaBeans и другими компонентами, упрощенного доступа к данным с помощью EL, повторного использования компонентов и модульности, а также обеспечения высокой производительности и соответствия международным стандартам. Делает разработку веб-приложений удобной и эффективной, предоставляя мощные инструменты для создания интерактивного и динамичного контента.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
📌 Что такое иерархия коллекций ?

💬 Спросят с вероятностью 62%

Java Server Pages (JSP) является мощной технологией для создания динамически генерируемых веб-страниц на стороне сервера. Предоставляет множество преимуществ и решает ряд задач, которые делают его необходимым в разработке веб-приложений:

🤔 Основные интерфейсы

Collection Interface: Корневой интерфейс иерархии коллекций. Определяет методы, такие как add(), remove(), size(), isEmpty() и iterator(), которые должны быть реализованы всеми коллекциями.

List Interface: Представляет упорядоченную коллекцию. Элементы в списке могут быть доступны по индексам. Допускает дублирование элементов. Реализации включают ArrayList, LinkedList и Vector.

Set Interface: Набор уникальных элементов. Не допускает дублирования элементов. Реализации включают HashSet, LinkedHashSet и TreeSet.

Queue Interface: Для работы с коллекциями, используемыми для хранения элементов перед обработкой. Поддерживает операции вставки, извлечения и инспекции. LinkedList реализует как List, так и Queue. Также есть PriorityQueue для элементов, которые должны обрабатываться в порядке приоритета.

Map Interface: Не наследуется от Collection интерфейса. Описывает структуру для хранения пар ключ/значение. Ключи уникальны, а значения могут дублироваться. Реализации включают HashMap, LinkedHashMap, TreeMap и Hashtable.

🤔 Особенности классов

ArrayList: Динамический массив для хранения элементов, который автоматически расширяется. Предлагает быстрый доступ к элементам по индексу.

LinkedList: Двусвязный список, который обеспечивает эффективное добавление/удаление элементов. Может использоваться как список и очередь.

HashSet: Использует хеш-таблицу для хранения уникальных элементов. Не гарантирует порядок элементов.

LinkedHashSet: Расширяет HashSet, сохраняя порядок вставки элементов.

TreeSet: Хранит элементы в отсортированном и восходящем порядке. Использует красно-черное дерево.

HashMap: Хеш-таблица для хранения пар ключ/значение. Не поддерживает упорядоченность ключей или значений.

LinkedHashMap: Расширяет HashMap, сохраняя порядок вставки ключей.

TreeMap: Реализует красно-черное дерево, сохраняет ключи в отсортированном порядке.

PriorityQueue: Элементы добавляются согласно их приоритету, определенному компаратором.

🤔 Суть иерархии коллекций

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
10🤯5👍3🔥1
🤔 Какой метод используется для завершения работы программы в Java?
Anonymous Quiz
76%
System.exit()
9%
Runtime.exit()
5%
Program.terminate()
10%
Application.shutdown()
1👍1
📌 Что такое SOLID ?

💬 Спросят с вероятностью 62%

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

🤔 Принцип единственной ответственности (SRP)

Подчеркивает важность разделения функциональности, чтобы каждый класс выполнял только одну задачу.
class UserSettings {
void changeEmail(User user) {
if(checkAccess(user)) {
// Изменение email пользователя
}
}

boolean checkAccess(User user) {
// Проверка прав доступа
return true;
}
}


Здесь класс UserSettings нарушает SRP, если бы в нем также были методы для управления пользователями. Лучше вынести метод checkAccess в отдельный класс.

2️⃣ Принцип открытости/закрытости (OCP): Можно добавлять новую функциональность, не изменяя существующий код.

3️⃣ Принцип подстановки Лисков (LSP): Классы-наследники должны дополнять, а не изменять поведение базовых классов.

4️⃣ Принцип разделения интерфейса (ISP): Этот принцип ведет к созданию узкоспециализированных интерфейсов, вместо одного "толстого" интерфейса.

5️⃣ Принцип инверсии зависимостей (DIP): Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей, а детали должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимостей между модулями программы.

🤔 Суть SOLID

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🎉1
📌 Что известно про иерархию исключений ?

💬 Спросят с вероятностью 69%

Иерархия исключений организована в виде дерева наследования, где все классы исключений являются потомками класса Throwable. Он делится на два основных подкласса: Error и Exception.

🤔 Throwable

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

🤔 Error

Error описывает серьёзные ошибки, возникающие на уровне виртуальной машины и библиотеки языка, из-за которых приложение обычно не может восстановиться. Примеры включают OutOfMemoryError и StackOverflowError. Ошибки этого типа обычно не предназначены для обработки приложением.

Непроверяемые исключения

Являются непроверяемыми исключениями. Они обозначают ошибки, такие как неверное приведение типов (ClassCastException), обращение по нулевой ссылке (NullPointerException) и выход за пределы массива (ArrayIndexOutOfBoundsException). Эти исключения не требуют обязательной обработки в блоке try-catch.

Проверяемые исключения

Требуют обязательной обработки в блоке try-catch или должны быть объявлены в сигнатуре метода с помощью throws. Они бозначают условия, с которыми приложение может предвидеть и справиться. Примеры включают IOException, FileNotFoundException и ClassNotFoundException.

🤔 Суть иерархии исключений

Иерархия исключений обеспечивает структурированный и гибкий способ обработки ошибок и исключительных ситуаций в приложениях. Позволяет различать серьёзные проблемы системного уровня, с которыми приложение не может справиться.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥8
🤔 Какой модификатор доступа делает поле доступным только внутри пакета?
Anonymous Quiz
2%
public
12%
private
37%
protected
49%
default
😁16👀31👍1
📌 Какие методы в классе Object есть ?

💬 Спросят с вероятностью 69%

Object - суперкласс для всех классов. Все объекты, включая массивы, наследуют методы этого класса. Они предоставляют функции, которые доступны для любого объекта. Вот основные методы:

1️⃣ clone() - создает и возвращает копию объекта. Метод защищенный, поэтому его можно вызвать только внутри класса объекта или в классах потомках.

2️⃣ equals(Object obj) - определяет равенство между двумя объектами. По умолчанию, этот метод сравнивает ссылки на объекты.

3️⃣ finalize() - вызывается перед удалением объекта сборщиком мусора. Метод устарел.

4️⃣ getClass() - возвращает Class, который представляет класс данного объекта. Можно использовать для получения имени во время выполнения.

5️⃣ hashCode() - возвращает хеш-код, который используется для оптимизации хранения в структурах данных.

6️⃣ notify() - пробуждает один поток, который ожидает на объекте (вызвавший wait()). Этот метод должен вызываться в синхронизированном контексте.

7️⃣ notifyAll() - пробуждает все ожидающие потоки. Должен вызываться в синхронизированном контексте.

8️⃣ toString() - возвращает строковое представление. По умолчанию, возвращает класс и хеш-код, но часто переопределяется для предоставления более информативного представления.

9️⃣ wait() - заставляет текущий поток ожидать, пока другой поток не вызовет notify() или notifyAll(). Существуют перегруженные версии wait(long timeout) и wait(long timeout, int nanos), позволяющие указать максимальное время ожидания.

Эти методы предоставляют основу для механизмов, таких как сравнение объектов, их клонирование, уведомление и ожидание в многопоточных средах, а также для работы с хеш-таблицами. Играют важную роль в проектировании и реализации Java-программ.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥103👍3
🤔 Какой интерфейс нужно реализовать для создания потока в Java?
Anonymous Quiz
65%
Runnable
33%
Thread
2%
Callable
1%
Future
🤯5👍32
📌 В чем разница между checked и unchecked исключениями ?

💬 Спросят с вероятностью 75%

Исключения (exceptions) важная часть обработки ошибок. Есть две основные категории: проверяемые (checked) и непроверяемые (unchecked).

🤔 Проверяемые исключения (Checked Exceptions)

Должны быть явно обработаны в коде с помощью блока try-catch или должны быть указаны в сигнатуре метода с помощью ключевого слова throws.

Они представляют ошибки, которые могут возникнуть во время выполнения программы и которые во многих случаях программист может предвидеть и обработать. Например, ошибка чтения файла, когда файл не существует.

Примеры классов проверяемых исключений включают IOException, FileNotFoundException, ClassNotFoundException и другие.

🤔 Пример:
try {
FileInputStream file = new FileInputStream("non_existent_file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}


В этом примере FileNotFoundException является проверяемым исключением, и его необходимо обрабатывать в блоке try-catch.

🤔 Непроверяемые исключения (Unchecked Exceptions)

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

К ним относятся ошибки времени выполнения (RuntimeException) и ошибки (Error).

Примеры включают NullPointerException, IndexOutOfBoundsException, ArithmeticException и другие.

🤔 Пример:
int result = 10 / 0; // Приводит к ArithmeticException


Здесь ArithmeticException является непроверяемым исключением, вызванным делением на ноль.

🤔 Почему разделение на checked и unchecked?

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9😁1
🤔 Какой метод используется для получения текущего времени в миллисекундах в Java?
Anonymous Quiz
61%
System.currentTimeMillis()
20%
System.getCurrentTime()
10%
Date.getTime()
9%
Calendar.getTimeInMillis()
👍81🤔1
🤔 Какой оператор используется для приведения типов в Java?
Anonymous Quiz
39%
cast
8%
convert
8%
as
44%
instanceof
🤯26😁9🤔62👍1
📌 Зачем нужны Hash Code & Equals Contract ?

💬 Спросят с вероятностью 56%

hashCode() и equals() играют важную роль в работе с объектами, особенно когда речь идет о коллекциях, таких как HashSet, HashMap, и Hashtable. Они определены в классе Object, и поэтому доступны для переопределения всеми классами. Правильное переопределение этих методов важно для эффективной работы коллекций, которые используют хеширование.

Контракт hashCode() и equals() - определяет, как эти методы должны взаимодействовать друг с другом:

🤔 Согласованность

Если два объекта равны согласно методу equals(Object obj), тогда вызов hashCode() на каждом из объектов должен возвращать одинаковое целое значение. Это не значит, что объекты, не равные друг другу, должны возвращать различные хеш-коды. Однако, разные хеш-коды могут помочь улучшить производительность хеш-таблиц.

🤔 Обратное не требуется

Если hashCode() двух объектов возвращает одинаковое значение, это не обязательно означает, что объекты равны согласно equals(). Ситуация, когда разные объекты имеют одинаковые хеш-коды, называется коллизией.

Переопределение equals(Object obj) используется для проверки равенства двух объектов. По умолчанию, этот метод проверяет равенство ссылок, что означает, что два объекта считаются равными, только если они указывают на одно и то же место в памяти. Переопределение метода equals() позволяет сравнивать объекты по содержанию.

🤔 При переопределении equals(), убедитесь, что он:

Рефлексивен: для любого ненулевого ссылочного значения x, x.equals(x) должно возвращать true.

Симметричен: для любых ненулевых ссылочных значений x и y, x.equals(y) должно возвращать true тогда и только тогда, когда y.equals(x) возвращает true.

Транзитивен: для любых ненулевых ссылочных значений x, y, и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то и x.equals(z) должно возвращать true.

Консистентен: для любых ненулевых ссылочных значений x и y, многократные вызовы x.equals(y) должны последовательно возвращать true или последовательно возвращать false.

Для любого ненулевого ссылочного значения x, x.equals(null) должно возвращать false.

🤔 Переопределение

Переопределение hashCode() возвращает хеш-код объекта, который используется хеш-таблицами для определения места хранения объекта. При переопределении equals(), необходимо также переопределить (), чтобы поддерживать общий контракт для методов hashCode() и equals().
public class Person {
private String name;
private int age;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}

В этом примере, equals() сравнивает объекты по name и age, а hashCode() использует эти же поля для генерации хеш-кода. Это обеспечивает соблюдение контракта между equals() и hashCode().

🤔 Правильное переопределение

Правильное переопределение equals() и hashCode() критически важно для корректной работы коллекций, основанных на хеш-таблицах. Это обеспечивает эффективное распределение объектов в коллекции и корректное сравнение объектов по содержанию.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143
🤔 Какое ключевое слово используется для импорта пакетов в Java?
Anonymous Quiz
97%
import
2%
include
1%
using
0%
require
🤯39👾5😁4👍2👀2
📌 Что такое deadlock ?

💬 Спросят с вероятностью 31%

Deadlock (взаимная блокировка) — это ситуация в многопоточном программировании, при которой два или более потока вечно ожидают друг друга, освободят ли они ресурсы, занятые в данный момент. Каждый из потоков держит замок (lock) на некотором ресурсе и ожидает получения замка на другом ресурсе, который в это время занят другим потоком. В результате ни один из потоков не может продолжить выполнение, поскольку каждый из них ждет освобождения ресурса, занятого другим потоком.

Представьте ситуацию, где есть два потока и два ресурса (например, два файла или два объекта в памяти).

Поток 1 захватывает ресурс A и ждет освобождения ресурса B.

Поток 2 захватывает ресурс B и ждет освобождения ресурса A.

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

🤔 Чтобы избежать такой ситуации, нужно использовать стратегии, такие как

1️⃣ Предотвращение зацикливания: Все потоки должны запрашивать ресурсы в одном и том же порядке, даже если это означает, что некоторым потокам придется ждать дольше.

2️⃣ Использование тайм-аутов: Потоки могут пытаться захватить ресурс с тайм-аутом. Если ресурс не получен за отведенное время, поток откатывает все свои текущие захваты ресурсов и пытается заново захватить их.

3️⃣ Обнаружение взаимных блокировок: Система может активно обнаруживать циклы ожидания и прерывать один из потоков для разрешения блокировки.

4️⃣ Использование однопоточных моделей: В некоторых случаях можно избежать проблем с многопоточностью, используя асинхронное программирование или реактивные модели, где логика выполнения не блокируется ожиданием ресурсов.

🤔 Понятие Deadlock

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍8
📌 В чём разница между final vs. finally vs. finalize ?

💬 Спросят с вероятностью 25%

Ключевые слова final, finally, и finalize имеют совершенно разные цели и контексты использования, хотя на первый взгляд могут показаться похожими из-за схожести их названий.

🤔 final

Это модификатор, который может быть использован с переменными, методами и классами.

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

Когда он используется с методом, это предотвращает переопределение метода в подклассах.

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

🤔 finally

Это блок кода, который используется вместе с блоками try и catch для обработки исключений. Блок finally выполняется всегда после выполнения блока try/catch, независимо от того, было ли выброшено исключение или нет. Это идеальное место для кода очистки, например, для закрытия файловых потоков или освобождения других ресурсов.

final используется для создания констант, предотвращения наследования классов и переопределения методов.

finally гарантирует выполнение кода после блока try/catch, обычно для очистки ресурсов.

finalize предназначен для очистки перед уничтожением объекта, но его использование не рекомендуется.

Каждое из этих ключевых слов имеет уникальное применение и важно в контексте разработки.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁21