В этом посте мы собираемся обсудить некоторые важные вопросы с собеседования по Java SE 8 с ответами. Я напишу еще один пост, чтобы обсудить оставшиеся вопросы с собеседования по Java SE 8.
Вопросы с собеседования по Java 8
- Зачем нам снова нужен Java?
- Новые возможности Java SE 8?
- Преимущества новых возможностей Java SE 8?
- Что такое лямбда-выражение?
- Какие три части входят в лямбда-выражение? Каков тип лямбда-выражения?
- Что такое функциональный интерфейс? Что такое интерфейс SAM?
- Можно ли определить собственный функциональный интерфейс? Что такое @FunctionalInterface? Каковы правила определения функционального интерфейса?
- Является ли аннотация @FunctionalInterface обязательной для определения функционального интерфейса? Каково использование аннотации @FunctionalInterface? Зачем нам нужны функциональные интерфейсы в Java?
- Когда мы используем Java 8 Stream API? Зачем нам нужно использовать Java 8 Stream API в наших проектах?
- Объясните различия между Collection API и Stream API?
- Что такое Spliterator в Java SE 8? В чем разница между Iterator и Spliterator в Java SE 8?
- Что такое Optional в Java 8? Каково назначение Optional? Преимущества Optional в Java 8?
- Что такое Type Inference? Доступен ли Type Inference в более старых версиях, таких как Java 7 и ранее, или он доступен только в Java SE 8?
Вопросы и ответы по Java 8 для собеседования
В этом разделе мы рассмотрим каждый вопрос из предыдущего раздела и предоставим на него подробный ответ. Если вам нужна дополнительная информация и примеры, пожалуйста, ознакомьтесь с предыдущими публикациями по Java SE 8, доступными в JournalDEV.
Почему нам снова нужен переход к Java?
Корпорация Oracle представила множество новых концепций в Java SE 8, чтобы внедрить следующие преимущества:
- Для эффективного использования текущих многоядерных процессоров
Недавно мы можем наблюдать радикальные изменения в области аппаратных средств. В настоящее время все системы используют многоядерные процессоры (2, 4, 8, 16 ядер и так далее), чтобы развертывать и запускать свои приложения. Нам нужны новые конструкции программирования на Java для эффективного использования этих многоядерных процессоров при разработке высококонкурентных и масштабируемых приложений. – Для использования функциональных возможностей FP
Корпорация Oracle ввела много концепций FP (функциональное программирование) в рамках Java SE 8 для использования преимуществ FP.
Новые возможности Java SE 8?
- Лямбда-выражения
- Функциональные интерфейсы
- API потоков
- API даты и времени
- Методы и статические методы по умолчанию интерфейса
- Сплитератор
- Ссылки на методы и конструкторы
- Улучшения API коллекций
- Улучшения утилит конкурентности
- Улучшения фреймворка Fork/Join
- Внутренняя итерация
- Параллельные операции с массивами и коллекциями
- Optional
- Аннотации типов и аннотации, поддерживающие повторение
- Отражение параметров метода
- Encoding и декодирование Base64
- Улучшения IO и NIO2
- Движок Nashorn JavaScript
- Улучшения javac
- Изменения в JVM
- Java 8 Compact Profiles: compact1,compact2,compact3
- JDBC 4.2
- JAXP 1.6
- Java DB 10.10
- Сетевое взаимодействие
- Изменения в безопасности
Преимущества новых функций Java SE 8?
Мы можем получить следующие преимущества от новых функций Java SE 8:
- Более лаконичный и читаемый код
- Более повторно используемый код
- Более тестируемый и поддерживаемый код
- Высоко конкурентоспособный и масштабируемый код
- Написание параллельного кода
- Написание операций, подобных базе данных
- Лучшая производительность приложений
- Более продуктивный код
Что такое лямбда-выражение?
Лямбда-выражение – это анонимная функция, которая принимает набор входных параметров и возвращает результаты. Лямбда-выражение представляет собой блок кода без имени, с параметрами или без них, а также с результатами или без них. Этот блок кода выполняется по требованию.
Каковы три части лямбда-выражения? Каков тип лямбда-выражения?
A Lambda Expression contains 3 parts:
- Список параметров
Лямбда-выражение может содержать ноль, один или более параметров. Это необязательно. – Оператор стрелки лямбда
“->” известен как оператор стрелки лямбда. Он разделяет список параметров и тело. – Тело лямбда-выражения
Тип “Journal Dev” – java.lang.String. Тип “true” – Boolean. Точно так же, каков тип лямбда-выражения? Тип лямбда-выражения – это Функциональный интерфейс. Пример: – Каков тип следующего лямбда-выражения?
() -> System.out.println("Hello World");
Это лямбда-выражение не имеет параметров и не возвращает результатов. Поэтому его тип – “java.lang.Runnable” Функциональный интерфейс.
Что такое функциональный интерфейс? Что такое интерфейс SAM?
A Functional Interface is an interface, which contains one and only one abstract method. Functional Interface is also known as SAM Interface because it contains only one abstract method. SAM Interface stands for Single Abstract Method Interface. Java SE 8 API has defined many Functional Interfaces.
Можно ли определить свой собственный функциональный интерфейс? Что такое @FunctionalInterface? Какие правила определения функционального интерфейса?
Да, возможно определить свои собственные функциональные интерфейсы. Мы используем аннотацию @FunctionalInterface Java SE 8, чтобы пометить интерфейс как функциональный. Мы должны следовать этим правилам для определения функционального интерфейса:
- Определите интерфейс с одним и только одним абстрактным методом.
- Мы не можем определить более одного абстрактного метода.
- Используйте аннотацию @FunctionalInterface в определении интерфейса.
- Мы можем определить любое количество других методов, таких как методы по умолчанию, статические методы.
- Если мы переопределяем метод класса java.lang.Object как абстрактный метод, это не считается абстрактным методом.
Это @FunctionalInterface аннотация обязательна для определения функционального интерфейса? Какова цель аннотации @FunctionalInterface? Зачем нам нужны функциональные интерфейсы в Java?
Не обязательно определять функциональный интерфейс с аннотацией @FunctionalInterface. Если мы не хотим, мы можем опустить эту аннотацию. Однако, если мы используем ее в определении функционального интерфейса, компилятор Java заставляет использовать ровно один абстрактный метод внутри этого интерфейса. Зачем нам нужны функциональные интерфейсы? Тип выражения лямбда в Java SE 8 – это функциональный интерфейс. Везде, где мы используем выражения лямбда, это означает, что мы используем функциональные интерфейсы.
Когда мы переходим к Java 8 Stream API? Зачем нам нужно использовать Java 8 Stream API в наших проектах?
Когда в нашем Java-проекте нужно выполнить следующие операции, лучше использовать Java 8 Stream API, чтобы получить множество преимуществ:
- Когда мы хотим выполнить операции, подобные операциям с базой данных. Например, мы хотим выполнить операцию groupby, операцию orderby и т. д.
- Когда мы хотим выполнять операции лениво.
- Когда мы хотим писать программы в функциональном стиле.
- Когда мы хотим выполнять параллельные операции.
- Когда мы хотим использовать внутреннюю итерацию.
- Когда мы хотим выполнять операции конвейера (pipelining).
- Когда мы хотим добиться лучшей производительности.
Объясните различия между API коллекций и API потоков (Stream API) Java?
S.No. | Collection API | Stream API |
---|---|---|
1. | It’s available since Java 1.2 | It is introduced in Java SE 8 |
2. | It is used to store Data (A set of Objects). | It is used to compute data (Computation on a set of Objects). |
3. | We can use both Spliterator and Iterator to iterate elements. We can use forEach to performs an action for each element of this stream. | We can’t use Spliterator or Iterator to iterate elements. |
4. | It is used to store unlimited number of elements. | Stream API is used to process on the elements of a Collection. |
5. | Typically, it uses External Iteration concept to iterate Elements such as Iterator. | Stream API uses internal iteration to iterate Elements, using forEach methods. |
6. | Collection Object is constructed Eagerly. | Stream Object is constructed Lazily. |
7. | We add elements to Collection object only after it is computed completely. | We can add elements to Stream Object without any prior computation. That means Stream objects are computed on-demand. |
8. | We can iterate and consume elements from a Collection Object at any number of times. | We can iterate and consume elements from a Stream Object only once. |
Что такое Spliterator в Java SE 8? В чем разница между Iterator и Spliterator в Java SE 8?
Spliterator расшифровывается как “Splitable Iterator”. Он был впервые представлен корпорацией Oracle в рамках Java SE 8. Как и Iterator и ListIterator, Spliterator также является одним из интерфейсов Iterator.
S.No. | Spliterator | Iterator |
---|---|---|
1. | It is introduced in Java SE 8. | It is available since Java 1.2. |
2. | Splitable Iterator | Non-Splitable Iterator |
3. | It is used in Stream API. | It is used for Collection API. |
4. | It uses Internal Iteration concept to iterate Streams. | It uses External Iteration concept to iterate Collections. |
5. | We can use Spliterator to iterate Streams in Parallel and Sequential order. | We can use Iterator to iterate Collections only in Sequential order. |
6. | We can get Spliterator by calling spliterator() method on Stream Object. | We can get Iterator by calling iterator() method on Collection Object. |
7. | Important Method: tryAdvance() | Important Methods: next(), hasNext() |
Что такое Optional в Java 8? Каково его использование? Преимущества Java 8 Optional?
Optional: Optional – это финальный класс, введенный в составе Java SE 8. Он определен в пакете java.util. Используется для представления необязательных значений, которые могут существовать или не существовать. Он может содержать либо одно значение, либо ноль. Если в нем есть значение, мы можем его получить. В противном случае мы получаем ничего. Это ограниченная коллекция, то есть она содержит не более одного элемента. Это альтернатива значению “null”. Основное преимущество Optional:
- Используется для избежания проверок на null.
- Используется для избежания “NullPointerException”.
Что такое вывод типов? Возможен вывод типов в более старых версиях, таких как Java 7 и ранее, или это доступно только в Java SE 8?
Вывод типов означает определение типа компилятором на этапе компиляции. Это не новая функция в Java SE 8. Она также доступна в Java 7 и ранее, чем Java 7. До Java 7:- Давайте изучим массивы Java. Определите массив строк со значениями, как показано ниже:
String str[] = { "Java 7", "Java 8", "Java 9" };
Здесь мы присвоили некоторые значения строк справа, но не определили его тип. Компилятор Java автоматически выводит его тип и создает массив строк. Java 7: Корпорация Oracle представила новую функцию “Diamond Operator” в Java SE 7, чтобы избежать ненужного определения типа в обобщениях.
Map<String,List<Customer>> customerInfoByCity = new HashMap<>();
Здесь мы не определяли информацию о типе справа, просто определили “Diamond Operator” Java SE 7. Java SE 8: Корпорация Oracle значительно усовершенствовала этот концепт вывода типов в Java SE 8. Мы используем этот концепт для определения лямбда-выражений, функций, ссылок на методы и т.д.
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
Здесь компилятор Java наблюдает за определением типа, доступным на левой стороне, и определяет тип параметров лямбда-выражения a и b как целые числа. Вот все, что касается вопросов на собеседовании по Java 8. Я обсудил некоторые вопросы на собеседовании по Java SE 8 в этом сообщении и обсудим еще некоторые вопросы на собеседовании по Java SE 8 в моих следующих сообщениях. Пожалуйста, оставьте комментарий, если вам понравилась моя публикация или у вас есть какие-либо вопросы/предложения.
Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1