ar
Feedback
Java | Вопросы собесов

Java | Вопросы собесов

الذهاب إلى القناة على Telegram

📈 نظرة تحليلية على قناة تيليجرام Java | Вопросы собесов

تُعد قناة Java | Вопросы собесов (@easy_java_ru) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 11 455 مشتركاً، محتلاً المرتبة 10 899 في فئة التكنولوجيات والتطبيقات والمرتبة 57 429 في منطقة روسيا.

📊 مؤشرات الجمهور والحراك

منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 11 455 مشتركاً.

بحسب آخر البيانات بتاريخ 12 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار 8، وفي آخر 24 ساعة بمقدار -3، مع بقاء الوصول العام مرتفعاً.

  • حالة التحقق: غير موثّقة
  • معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 11.26‎%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 7.29‎% من ردود الفعل نسبةً إلى إجمالي المشتركين.
  • وصول المنشورات: يحصل كل منشور على متوسط 1 290 مشاهدة. وخلال اليوم الأول يجمع عادةً 835 مشاهدة.
  • التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 7.
  • الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل ставь, void, string, строка, static.

📝 الوصف وسياسة المحتوى

يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy

بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 13 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.

11 455
المشتركون
-324 ساعات
+47 أيام
+830 أيام
أرشيف المشاركات
Какие отличия и что эффективнее HashTable и ConcurrentHashMap ? Спросят с вероятностью 12% HashTable и ConcurrentHashMap — это две разные реализации ассоциативных массивов, предназначенные для использования в многопоточных средах, но с различными подходами к синхронизации и производительности. HashTable - Потокобезопасность: Является потокобезопасной коллекцией, что достигается за счёт синхронизации всех публичных методов. Это означает, что только один поток может выполнять операции с таблицей в любой момент времени. - Производительность: Вследствие глобальной блокировки, производительность она может существенно снижаться в многопоточных средах, где требуется высокая степень параллелизма. - Устаревшая: Несмотря на то что класс всё ещё доступен в Java для обратной совместимости, он считается устаревшим, и его использование в новом коде обычно не рекомендуется. ConcurrentHashMap - Потокобезопасность: Также предоставляет потокобезопасную реализацию ассоциативного массива, но использует более изощренную стратегию для синхронизации. Вместо блокировки всей таблицы ConcurrentHashMap использует сегментирование (разделение таблицы на части), благодаря чему поддерживает более высокий уровень параллелизма. - Производительность: Благодаря более тонкой синхронизации она обеспечивает лучшую производительность в многопоточных приложениях, особенно когда имеется много операций чтения и записи. - Функциональность: Вводит дополнительные полезные методы, которые не доступны в `HashTable. Основные отличия: 1️⃣ Механизм синхронизации: HashTable блокирует всю таблицу, что может привести к узкому месту при большом количестве потоков. ConcurrentHashMap использует разделение на сегменты для минимизации конфликтов блокировок и поддержания высокой производительности. 2️⃣ Производительность: ConcurrentHashMap обычно обеспечивает лучшую производительность в многопоточных приложениях за счёт более эффективной синхронизации. 3️⃣ Итераторы: Итераторы в HashTable могут бросать исключение ConcurrentModificationException, если коллекция была изменена во время итерации. В то время как итераторы ConcurrentHashMap не бросают это исключение, предоставляя слабую консистентность и отражая состояние коллекции на момент создания итератора. 4️⃣ Null значения: HashTable допускает использование null в качестве значения, но не в качестве ключа. В ConcurrentHashMap не допускается использование null ни в качестве ключей, ни в качестве значений. ConcurrentHashMap является более современной и эффективной реализацией для использования в многопоточных приложениях по сравнению с HashTable. Она обеспечивает лучшую производительность и гибкость управления благодаря более продвинутым методам синхронизации и параллелизма. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых

Какой уровень нормализации базы данных устраняет аномалии, вызванные зависимостями атрибутов, не являющимися ключевыми, от части составного ключа?
Anonymous voting

Какие Scop'ы есть у bean'ов ? Спросят с вероятность 19% "scope" (область видимости) бина определяет жизненный цикл и видимость экземпляра бина в контексте приложения. Вот основные области видимости (scopes) бинов: 1️⃣ Singleton - Описание: По умолчанию. Он создает и хранит один единственный экземпляр бина на каждый контейнер Spring IoC. Это означает, что каждый запрос на получение бина возвращает один и тот же объект. - Применение: Используется для состояний без сохранения (stateless) бинов, общих настройках и конфигурациях. 2️⃣ Prototype - Описание: Для каждого запроса на получение бина создается новый экземпляр бина. Это означает, что если вы запросите бин дважды, вы получите два разных объекта. - Применение: Используется для всех операций, требующих независимого экземпляра бина для каждого использования. 3️⃣ Request - Описание: Бин создается один раз для каждого HTTP запроса. Доступен только в веб-приложениях. - Применение: Используется для хранения информации, специфичной для каждого запроса. 4️⃣ Session - Описание: Бин создается один раз для каждой HTTP сессии. Доступен только в веб-приложениях. - Применение: Используется для хранения информации, специфичной для каждой сессии пользователя. 5️⃣ Application - Описание: Бин создается один раз для всего сервлет-контекста (ServletContext). Доступен только в веб-приложениях. - Применение: Используется для хранения глобальной информации, общей для всех сессий и запросов в рамках одного веб-приложения. 6️⃣ WebSocket - Описание: Бин создается один раз для каждого WebSocket соединения. Доступен только при использовании веб-сокетов. - Применение: Используется для хранения информации, специфичной для каждого WebSocket соединения. Выбор области видимости бина зависит от конкретных требований приложения и желаемого жизненного цикла объектов. Важно понимать различия между этими областями видимости, чтобы корректно управлять состоянием и доступностью бинов в приложении. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых

Как изменится производительность чтения данных из таблицы базы данных, если добавить несоставной индекс к часто используемому полю?
Anonymous voting

Что такое пул строк ? Спросят с вероятностью 19% Пул строк (String Pool) — это специальная область в куче (Heap), предназначенная для хранения уникальных экземпляров строковых литералов. JVM создает пул строк для экономии памяти и увеличения скорости выполнения программы за счет повторного использования объектов типа String. Как работает пул строк? Когда в коде создается строка через строковый литерал (например, String s = "Hello";), JVM сначала проверяет пул строк. Если строка с таким же значением уже присутствует в пуле, то новый объект не создается. Вместо этого переменной s присваивается ссылка на уже существующий объект в пуле. Если же такой строки в пуле нет, JVM создает новый объект строки в пуле и возвращает ссылку на него. Это поведение отличается от создания строк через оператор new (например, String s = new String("Hello");). В этом случае в куче всегда создается новый объект String, независимо от того, содержится ли такая же строка в пуле строк или нет. Примеры:
String s1 = "Hello"; // Создается в пуле строк, если такой строки еще нет
String s2 = "Hello"; // Не создается новый объект, s2 ссылается на тот же объект, что и s1
String s3 = new String("Hello"); // Создается новый объект вне пула строк

System.out.println(s1 == s2); // true, т.к. s1 и s2 указывают на один и тот же объект в пуле строк
System.out.println(s1 == s3); // false, т.к. s3 указывает на другой объект вне пула строк
Зачем он нужен? Помогает оптимизировать использование памяти и повысить производительность приложений: ✅ Экономия памяти: Поскольку строки, созданные как литералы, разделяются и хранятся в пуле, это сокращает общее количество создаваемых объектов String, экономя память. ✅ Повышение скорости: Проверка наличия строки в пуле и повторное использование существующих строковых объектов может быть быстрее, чем создание новых объектов. Как поместить строку в пул строк? Можно использовать метод intern() класса String. Если строка, вызывающая метод intern(), еще не находится в пуле, то она добавляется туда, а затем возвращается ссылка на эту строку из пула. Если строка уже присутствует в пуле, то просто возвращается ссылка на уже существующую строку. Пул строк — это механизм для оптимизации использования памяти и повышения производительности за счет повторного использования уникальных строковых литералов. Он позволяет избежать создания множественных копий одинаковых строковых объектов. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых

Привет! Ты сейчас ищешь работу? Если да, то у меня для тебя классные новости. Мы с Максом решили провести вебинар на тему пои
Привет! Ты сейчас ищешь работу? Если да, то у меня для тебя классные новости. Мы с Максом решили провести вебинар на тему поиска работы и того, как быстрее получить оффер. Зачем? Да потому что найти работу просто откликаясь на вакансии теперь практически нереально. На Junior вакансии откликаются по 1500 кандидатов. 1500 человек, Карл... Вопрос: Как искать работу в таких условиях? Ответ: Нужно менять подходы, и использовать новые способы поиска работы. А вот какие способы, и как искать работу в 2024 году, расскажет мой товарищ - Макс, который помогает разработчикам с трудоустройством. Он расскажет тебе как ПРАВИЛЬНО откликаться на вакансии, на что смотрят рекрутеры, и как ты должен быть упакован, чтобы получить работу в это непростое время. 🗓 Когда? Во вторник – 18 июня, в 19:00 по мск. 🎁 После регистрации он также обещал прислать: 1) Анализ рынка труда. 2) Разбор кейсов тех, кто сейчас находит работу. 3) Пошаговый план, что нужно делать, чтобы прийти к оферу. 👉 Записаться на вебинар по поиску работы.

Что является необходимым условием для возникновения тупика (deadlock)?
Anonymous voting

🔥Тесты для подготовки к собеседованию🔥 Выбери своё направление: 1. Frontend 2. Python 3. Java 4. Тестировщик QA 5. Data Sci
🔥Тесты для подготовки к собеседованию🔥 Выбери своё направление: 1. Frontend 2. Python 3. Java 4. Тестировщик QA 5. Data Science 6. DevOps 7. C# 8. С/C++ 9. Golang 10. PHP 11. Kotlin 12. Swift

Каким образом HashMap связан с Set'ом ? Спросят с вероятностью 25% HashMap и Set связаны друг с другом через использование коллекции HashSet. Он внутренне использует HashMap для хранения своих элементов. Основная идея этой связи заключается в том, что HashSet обеспечивает уникальность своих элементов с помощью хеш-таблицы, а HashMap предоставляет эту хеш-таблицу как основу для хранения данных. Как HashSet использует HashMap Когда вы добавляете элемент в него, этот элемент используется как ключ во внутреннем HashMap. Значением для этого ключа является предопределённый статический объект, общий для всех элементов (обычно PRESENT, просто маркер, который не используется). Это делается для оптимизации памяти и производительности, так как интерес представляет только наличие ключа (элемента в HashSet), а не значение, ассоциированное с этим ключом.
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    private transient HashMap<E,Object> map;

    // Предопределенный объект, используемый в качестве значения для всех ключей
    private static final Object PRESENT = new Object();

    public HashSet() {
        map = new HashMap<>();
    }

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

    // Другие методы...
}
Преимущества этой связи Уникальность элементов: HashSet гарантирует, что каждый элемент будет уникальным, так как HashMap не допускает дублирования ключей. ✅ Высокая производительность: операции добавления, удаления и поиска в HashSet выполняются за константное время O(1) в среднем, благодаря хеш-таблице HashMap. ✅ Эффективное использование памяти: хранение значения PRESENT для всех элементов минимизирует потребление памяти, так как не требуется отдельно выделять память под значения элементов. Эта связь между HashSet и HashMap позволяет HashSet эффективно управлять уникальными элементами, используя хеш-таблицу, и предоставляет разработчикам мощный инструмент для создания коллекций, которые требуют уникальности элементов с высокой производительностью поиска, добавления и удаления. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых

Почему тебя не зовут на интервью? Исправь это в своем резюме… Получить приглашение на интервью сейчас сложнее, чем с нуля обу
Почему тебя не зовут на интервью? Исправь это в своем резюме… Получить приглашение на интервью сейчас сложнее, чем с нуля обучиться разработке. И к сожалению, это не шутка. Скорее всего только 1-2% работодателей сейчас позовут тебя на интервью. Это статистика, которую мы собирали по 10.000 откликам. Но над этой цифрой можно и нужно работать. Если правильно оформить свое резюме, и поменять свою стратегию с откликами, то конверсию можно увеличить до 10%. Т.е почти в 10 раз! Как это сделать? 1. Проверить свое резюме по нашему чек листу, и внести в него то, чего будет не хватать. 2. Поменять свой подход к поиску работы, ведь одними откликами на hh.ru сыт не будешь. 18 июня, в 18:00 по москве, мы вместе с Максом из CodeReview проведем вебинар на тему эффективного поиска работы в 2024 году. На нем Макс покажет как сейчас нужно искать работу. В прямом эфире. А также раскроет что именно нужно писать в свое резюме, чтобы оно ПРОДАВАЛО. Получить чек лист по составлению резюме, а также зарегистрироваться на вебинар можно по этой ссылке. Регистрируйся сейчас и увидимся 18 июня, в 18:00 по мск. 👉 Зарегистрироваться и получить чек-лист по резюме.

Какой результат получится, если лямбда-выражение (x, y) -> x + y используется с reduce на потоке целых чисел [1, 2, 3]?
Anonymous voting

В нашей приватной 🔐 Базе собесов уже есть собесы практически из всех банков РФ, а также пара крупных fintech компаний. Получить доступ можно, "вложившись" в базу 1-им своим реальным собеседованием.

Что такое итератор и зачем он нужен ? Спросят с вероятностью 19% Итератор — это объект, который позволяет поочерёдно обходить элементы коллекции без раскрытия её внутреннего представления (структуры). Они используются для работы с различными структурами данных, такими как списки, множества и очереди. Основное предназначение — предоставить универсальный способ доступа к элементам коллекции, а также возможность их удаления в процессе итерации. Зачем он нужен?Абстракция: Скрывает детали реализации коллекции, предоставляя простой интерфейс для её перебора. Это позволяет использовать один и тот же способ обхода для коллекций с различными внутренними структурами. ✅ Безопасность: Использование его для изменения коллекции во время итерации (например, удаление элементов) является безопасным. При попытке модифицировать коллекцию напрямую во время итерации может возникнуть ConcurrentModificationException, но многие реализации итераторов предоставляют метод remove(), который позволяет безопасно удалять элементы. ✅ Универсальность: Итераторы предоставляют единый способ работы с различными типами коллекций, что упрощает написание гибкого и переиспользуемого кода. Как он работает? Предоставляет как минимум три метода: 1️⃣ hasNext(): возвращает true, если итератор имеет ещё элементы. 2️⃣ next(): возвращает следующий элемент коллекции и переводит курсор итератора на одну позицию вперёд. 3️⃣ remove(): удаляет последний элемент, который был возвращён итератором с помощью метода next(), из коллекции. Пример:
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");

Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
    String element = iterator.next();
    System.out.println(element);
    // Можно безопасно удалять элементы с помощью итератора
    if("Python".equals(element)) {
        iterator.remove();
    }
}
Итератор — это механизм для безопасного и универсального обхода элементов коллекций, позволяющий избежать проблем с изменением коллекции во время итерации и скрывающий внутреннее устройство коллекции. Он необходим для реализации стандартного способа перебора элементов без необходимости знать, как устроена коллекция, и предоставляет безопасный способ её модификации в процессе обхода. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых

Привет, мне нужно несколько контент-менеджеров для новых телеграм каналов в тематике программирования. Если вам интересна такая работа напиши мне @kivaiko и лучше сразу напишите какие языки программирования учите/знаете

Как оформить свой профиль на Github, чтобы работодатель тебя заметил? Хей! А ты знал, что 68% работодателей отбирают себе jun
Как оформить свой профиль на Github, чтобы работодатель тебя заметил? Хей! А ты знал, что 68% работодателей отбирают себе junior разработчиков основываясь на их портфолио на Github? Следовательно если ты никогда не занимался оформлением своего Github портфолио и профиля – тебе вероятнее всего пришлют отказ. Это работает именно у начинающих разработчиков. И что делать в таком случае? – На самом деле страшного ничего нет, нужно просто уделить время и оформить его по чек листу, который подготовил Макс из codereview со своей командой. Получить этот чек лист ты можешь по этой ссылке. Помимо чек листа, мы с Максом проведем вебинар 18 июня в 18:00 по мск, на тему того, как искать эффективно искать работу разработчиком в 2024 году. Чек лист будет доступен после регистрации на вебинар. 👉 Регистрируйся по этой ссылке.

Какой функциональный интерфейс из Java 8+ подходит для реализации операции, принимающей один аргумент и возвращающей boolean?
Anonymous voting

Какие правила переопределения hashcode и equals ? Спросят с вероятностью 31% Методы hashCode() и equals(Object obj) играют центральную роль в работе коллекций, особенно в таких структурах данных, как HashSet, HashMap, Hashtable и HashTable. Правильное переопределение этих методов критически важно для корректной работы этих и многих других коллекций. Вот основные правила и рекомендации для их переопределения: 1️⃣ Согласованность с equals: Если два объекта считаются равными согласно методу equals(Object obj), то вызов hashCode() на этих объектах должен возвращать одно и то же целочисленное значение. Это не значит, что объекты, не равные друг другу, обязательно должны иметь различные хеш-коды, но разные хеш-коды помогают улучшить производительность хеш-таблиц. 2️⃣ Повторяемость результата в течение одного выполнения программы: Пока информация, используемая в equals(Object obj), не изменяется, hashCode() должен всегда возвращать одно и то же значение. Это значение не обязано оставаться неизменным между разными выполнениями программы. 3️⃣ Переопределение equals требует переопределенияделения hash: Если вы переопределите его, вы должны также переопределить код. Несоблюдение этого правила может привести к нарушению контракта hashCode, что, в свою очередь, приведет к некорректной работе объекта в коллекциях, основанных на хеш-таблицах. 4️⃣ Консистентность equals: Метод equals(Object obj) должен быть рефлексивным (любой объект должен быть равен самому себе), симметричным (если a.equals(b) == true, то b.equals(a) == true), транзитивным (если a.equals(b) == true и b.equals(c) == true, то a.equals(c) == true) и консистентным (повторные вызовы должны возвращать одинаковые значения). Для любого ненулевого ссылочного значения x, x.equals(null) должен возвращать false.
public class Person {
    private String name;
    private int age;

    // Конструкторы, геттеры и сеттеры

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
В этом примере equals проверяет, равен ли текущий объект переданному объекту, а hashCode вычисляет хеш-код, используя поля name и age. Использование класса Objects из стандартной библиотеки Java упрощает и безопасно осуществляет эти операции. Для корректной работы объектов в хеш-основанных коллекциях важно правильно переопределить методы hashCode и equals, следуя вышеуказанным правилам и рекомендациям. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых

🖥 Java - самый крупный обучающий ресурс в Telegram, посвященный Java разработке! По контенту: 1. Собрали для вас лучшие бесплатные курсы по Java 2024 года. 2. 2250 вопросов с собесов с разбором от Senior разработчика. 3. Пишем пет-проекты на JAVA - лучшая практика. А здесь я собрал лучшие ресурсы Java разработчика, тут и бесплтаные книги по Java и вакансии лдя джунов, много полезного. Подписывайтесь, такие знания в 2024-м году на вес золота: @javatg

Какой scope бина следует использовать, если необходимо, чтобы экземпляр бина был уникальным для каждого запроса в веб-приложении?
Anonymous voting

Какие имплементации ExecutorService есть ? Спросят с вероятностью 12% ExecutorService — это интерфейс, предоставляющий фреймворк для асинхронного выполнения задач. Он является частью пакета java.util.concurrent и позволяет управлять потоками на высоком уровне, без необходимости явного управления ими. Есть несколько реализаций интерфейса, каждая из которых предназначена для различных сценариев использования: 1️⃣ThreadPoolExecutor Это наиболее гибкая и мощная его реализация. Она позволяет создать пул потоков с настраиваемым количеством потоков, управлять временем жизни потоков, а также настраивать очередь задач и поведение при отклонении задач. 2️⃣ScheduledThreadPoolExecutor Расширяет ThreadPoolExecutor и предоставляет возможность запланировать выполнение задач после заданной задержки или периодически. Это идеальный выбор для задач, которые должны выполняться с определённой периодичностью. 3️⃣Executors.newCachedThreadPool() Возвращает экземпляр ThreadPoolExecutor, созданный с параметрами, которые подходят для пула потоков с динамически изменяемым количеством потоков. Пул автоматически расширяется при добавлении задач и сжимается, когда задачи выполняются. Это хороший выбор для приложений, испытывающих различные уровни параллельной загрузки. 4️⃣Executors.newFixedThreadPool(int nThreads) Создаёт пул потоков, в котором количество рабочих потоков фиксировано. Это обеспечивает контроль над максимальным числом одновременно выполняемых потоков. Подходит для ситуаций, когда вы знаете максимальную степень параллелизма вашего приложения. 5️⃣Executors.newSingleThreadExecutor() Создаёт экзекьютор, который гарантирует, что все задачи выполняются последовательно (в одном и том же потоке) и в том порядке, в котором они были добавлены в executor. Это может быть полезно для синхронизации доступа к ресурсам без использования synchronized. 6️⃣Executors.newScheduledThreadPool(int corePoolSize) Возвращает экземпляр ScheduledThreadPoolExecutor с заданным основным количеством потоков, который может использоваться для задач, требующих планирования или периодического выполнения. Различные реализации ExecutorService предоставляют мощные средства для управления асинхронным выполнением задач в многопоточных приложениях. Выбор подходящей реализации зависит от конкретных требований приложения, таких как необходимость планирования задач, требования к числу рабочих потоков и предпочтительный способ обработки задач. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых