#вопросы_с_собеседований
Чем различаются Thread и Runnable?
Чем различаются Thread и Runnable?
Thread - это класс, некоторая надстройка над физическим потоком.
Runnable - это интерфейс, представляющий абстракцию над выполняемой задачей.
Помимо того, что Runnable помогает разрешить проблему множественного наследования, несомненный плюс от его использования состоит в том, что он позволяет логически отделить логику выполнения задачи от непосредственного управления потоком.
Runnable - это интерфейс, представляющий абстракцию над выполняемой задачей.
Помимо того, что Runnable помогает разрешить проблему множественного наследования, несомненный плюс от его использования состоит в том, что он позволяет логически отделить логику выполнения задачи от непосредственного управления потоком.
#вопросы_с_собеседований
Что такое Stream?
Что такое Stream?
Интерфейс java.util.Stream представляет собой последовательность элементов, над которой можно производить различные операции.
Операции над стримами бывают или промежуточными (intermediate) или конечными (terminal). Конечные операции возвращают результат определенного типа, а промежуточные операции возвращают тот же стрим. Таким образом вы можете строить цепочки из несколько операций над одним и тем же стримом.
У стрима может быть сколько угодно вызовов промежуточных операций и последним вызов конечной операции. При этом все промежуточные операции выполняются лениво и пока не будет вызвана конечная операция никаких действий на самом деле не происходит (похоже на создание объекта Thread или Runnable, без вызова start()).
Стримы создаются на основе источников каких-либо, например классов из java.util.Collection.
Ассоциативные массивы (maps), например, HashMap, не поддерживаются.
Операции над стримами могут выполняться как последовательно, так и параллельно.
Потоки не могут быть использованы повторно. Как только была вызвана какая-нибудь конечная операция, поток закрывается.
Кроме универсальных объектных существуют особые виды стримов для работы с примитивными типами данных int, long и double: IntStream, LongStream и DoubleStream. Эти примитивные стримы работают так же, как и обычные объектные, но со следующими отличиями:
☕️ используют специализированные лямбда-выражения, например, IntFunction или IntPredicate вместо Function и Predicate;
☕️ поддерживают дополнительные конечные операции sum(), average(), mapToObj().
Операции над стримами бывают или промежуточными (intermediate) или конечными (terminal). Конечные операции возвращают результат определенного типа, а промежуточные операции возвращают тот же стрим. Таким образом вы можете строить цепочки из несколько операций над одним и тем же стримом.
У стрима может быть сколько угодно вызовов промежуточных операций и последним вызов конечной операции. При этом все промежуточные операции выполняются лениво и пока не будет вызвана конечная операция никаких действий на самом деле не происходит (похоже на создание объекта Thread или Runnable, без вызова start()).
Стримы создаются на основе источников каких-либо, например классов из java.util.Collection.
Ассоциативные массивы (maps), например, HashMap, не поддерживаются.
Операции над стримами могут выполняться как последовательно, так и параллельно.
Потоки не могут быть использованы повторно. Как только была вызвана какая-нибудь конечная операция, поток закрывается.
Кроме универсальных объектных существуют особые виды стримов для работы с примитивными типами данных int, long и double: IntStream, LongStream и DoubleStream. Эти примитивные стримы работают так же, как и обычные объектные, но со следующими отличиями:
☕️ используют специализированные лямбда-выражения, например, IntFunction или IntPredicate вместо Function и Predicate;
☕️ поддерживают дополнительные конечные операции sum(), average(), mapToObj().
#вопросы_с_собеседований
Что такое «ссылка на метод»?
Что такое «ссылка на метод»?
Если существующий в классе метод уже делает все, что необходимо, то можно воспользоваться механизмом method reference (ссылка на метод) для непосредственной передачи этого метода. Такая ссылка передается в виде:
☕️ имя_класса::имя_статического_метода для статического метода;
☕️ объект_класса::имя_метода для метода экземпляра;
☕️ название_класса::new для конструктора.
Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод.
Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более качественную информацию о типе и при возможности выбора между использованием ссылки на существующий метод и использованием лямбда-выражения, следует всегда предпочитать использование ссылки на метод.
☕️ имя_класса::имя_статического_метода для статического метода;
☕️ объект_класса::имя_метода для метода экземпляра;
☕️ название_класса::new для конструктора.
Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод.
Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более качественную информацию о типе и при возможности выбора между использованием ссылки на существующий метод и использованием лямбда-выражения, следует всегда предпочитать использование ссылки на метод.
#вопросы_с_собеседований
Что такое default методы интерфейса?
Что такое default методы интерфейса?
☕️ Если класс реализует интерфейс, он может, но не обязан, реализовать методы по-умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию.
☕️ Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется.
☕️ Метод по умолчанию не может переопределить метод класса java.lang.Object.
☕️ Помогают реализовывать интерфейсы без страха нарушить работу других классов.
☕️ Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.
☕️ Дают свободу классам выбрать метод, который нужно переопределить.
☕️ Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.
☕️ Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется.
☕️ Метод по умолчанию не может переопределить метод класса java.lang.Object.
☕️ Помогают реализовывать интерфейсы без страха нарушить работу других классов.
☕️ Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.
☕️ Дают свободу классам выбрать метод, который нужно переопределить.
☕️ Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.
#вопросы_с_собеседований
Что такое StringJoiner?
Что такое StringJoiner?
Класс StringJoiner используется, чтобы создать последовательность строк, разделенных разделителем с возможностью присоединить к полученной строке префикс и суффикс:
StringJoiner joiner = new StringJoiner(".", "prefix-", "-suffix");
for (String s : "Hello the brave world".split(" ")) {
joiner.add(s);
}
System.out.println(joiner); //prefix-Hello.the.brave.world-suffix
StringJoiner joiner = new StringJoiner(".", "prefix-", "-suffix");
for (String s : "Hello the brave world".split(" ")) {
joiner.add(s);
}
System.out.println(joiner); //prefix-Hello.the.brave.world-suffix
#вопросы_с_собеседований
Для чего нужны функциональные интерфейсы Predicate<T>, DoublePredicate, IntPredicate и LongPredicate?
Для чего нужны функциональные интерфейсы Predicate<T>, DoublePredicate, IntPredicate и LongPredicate?
Predicate<T> (предикат) - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса T и возвращающая на выходе значение типа boolean.
Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).
Predicate<String> predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
☕️ DoublePredicate - предикат, получающий на вход Double;
☕️ IntPredicate - предикат, получающий на вход Integer;
☕️ LongPredicate - предикат, получающий на вход Long.
Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).
Predicate<String> predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
☕️ DoublePredicate - предикат, получающий на вход Double;
☕️ IntPredicate - предикат, получающий на вход Integer;
☕️ LongPredicate - предикат, получающий на вход Long.
#вопросы_с_собеседований
Как получить вторую субботу текущего месяца используя Date Time API?
Как получить вторую субботу текущего месяца используя Date Time API?
LocalDate
.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
Интенсив по Docker для разработчиков без «капитанской теории». Отправляемся 25 февраля.
На 2 дня оставим за бортом всё то, о чём и так все знают и погрузимся в глубины крутейшей практики. Вы запустите сайт в контейнере, соберёте несколько контейнеров в рабочую систему, запустите готовый pipeline в Gitlab, рассмотрите подводные камни использования stateful и Docker и научитесь обходить ограничения DockerHub. Помимо этого расскажем об особенностях использования контейнеров с ruby, php, python, go, java, c#, c++ и работе Docker в облаках.
Интересно? А ведь это ещё не всё! Почитать всю программу (там много вкусного) и посмотреть реальные примеры практических заданий можно на сайте.
Йо-хо-хо, морские волки! На абордаж!
На 2 дня оставим за бортом всё то, о чём и так все знают и погрузимся в глубины крутейшей практики. Вы запустите сайт в контейнере, соберёте несколько контейнеров в рабочую систему, запустите готовый pipeline в Gitlab, рассмотрите подводные камни использования stateful и Docker и научитесь обходить ограничения DockerHub. Помимо этого расскажем об особенностях использования контейнеров с ruby, php, python, go, java, c#, c++ и работе Docker в облаках.
Интересно? А ведь это ещё не всё! Почитать всю программу (там много вкусного) и посмотреть реальные примеры практических заданий можно на сайте.
Йо-хо-хо, морские волки! На абордаж!
#вопросы_с_собеседований
Назовите основные принципы ООП.
Назовите основные принципы ООП.
Инкапсуляция — в информатике размещение в одном компоненте данных и методов, которые с ними работают. Также может означать скрытие внутренней реализации от других компонентов.
Наследование — создание новой сущности на базе уже существующей.
Полиморфизм — возможность иметь разные формы для одной и той же сущности.
Абстракция — набор общих характеристик.
Посылка сообщений — форма связи, взаимодействия между сущностями.
Переиспользование — все что перечислено выше работает на повторное использование кода.
Это единственно верный порядок парадигм ООП, так как каждая последующая использует предыдущие.
Наследование — создание новой сущности на базе уже существующей.
Полиморфизм — возможность иметь разные формы для одной и той же сущности.
Абстракция — набор общих характеристик.
Посылка сообщений — форма связи, взаимодействия между сущностями.
Переиспользование — все что перечислено выше работает на повторное использование кода.
Это единственно верный порядок парадигм ООП, так как каждая последующая использует предыдущие.
Java Software Solutions (2017)
Авторы: John Lewis, William Loftus
Количество страниц: 800
Java Software Solutions создает прочную основу методов программирования для создания хорошо разработанного объектно-ориентированного программного обеспечения. Книга помогает получить навыки решения задач и знакомит студентов с процессом создания высококачественных программных систем. Новый подход к обучению обеспечивает понимание программистами основных объектно-ориентированных принципов. В тексте используется естественная последовательность повествования с упором на использование объектов перед обучением их написанию, что дает учащимся знания и навыки, необходимые для разработки.
Скачать книгу
Авторы: John Lewis, William Loftus
Количество страниц: 800
Java Software Solutions создает прочную основу методов программирования для создания хорошо разработанного объектно-ориентированного программного обеспечения. Книга помогает получить навыки решения задач и знакомит студентов с процессом создания высококачественных программных систем. Новый подход к обучению обеспечивает понимание программистами основных объектно-ориентированных принципов. В тексте используется естественная последовательность повествования с упором на использование объектов перед обучением их написанию, что дает учащимся знания и навыки, необходимые для разработки.
Скачать книгу
Telegram
Книги для программистов (reserved)
Java Software Solutions (2017)
Авторы: John Lewis, William Loftus
Авторы: John Lewis, William Loftus
#вопросы_с_собеседований
1. Для чего в JUnit используется аннотация @Ignore?
2. Чем stub отличается от mock (в тестовых объектах)?
1. Для чего в JUnit используется аннотация @Ignore?
2. Чем stub отличается от mock (в тестовых объектах)?
Начал самостоятельно изучать Python? Хотел бы получить советы от практикующих специалистов?
С 1 по 3 февраля будет проходить бесплатный онлайн-интенсив Skillbox по программированию, где ты получишь полезные знания и советы практикующего специалиста, сооснователя и технического директора Lia с семилетним опытом в разработке на Python Никиты Левашова.
Подробности по ссылке: 👉 https://clc.am/va7GEw
На занятиях мы расскажем:
➕ как написать скрипт на Python по подбору паролей;
➕ как работать с файлами и запросами;
➕ как реализовать brute-force attack;
➕ как защититься от такой атаки;
➕ как написать консольный интерфейс.
🎁 Всех, кто дойдёт до конца, ждёт подарок — электронная книга Кей Петерсон и Дэвида Колба «Век живи — век учись» издательства МИФ!
С 1 по 3 февраля будет проходить бесплатный онлайн-интенсив Skillbox по программированию, где ты получишь полезные знания и советы практикующего специалиста, сооснователя и технического директора Lia с семилетним опытом в разработке на Python Никиты Левашова.
Подробности по ссылке: 👉 https://clc.am/va7GEw
На занятиях мы расскажем:
➕ как написать скрипт на Python по подбору паролей;
➕ как работать с файлами и запросами;
➕ как реализовать brute-force attack;
➕ как защититься от такой атаки;
➕ как написать консольный интерфейс.
🎁 Всех, кто дойдёт до конца, ждёт подарок — электронная книга Кей Петерсон и Дэвида Колба «Век живи — век учись» издательства МИФ!
1. @Ignore указывает JUnit на необходимость пропустить данный тестовый метод.
2. stub используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы.
mock использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его.
2. stub используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы.
mock использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его.