Вопросы и ответы на собеседовании по Java SE 8 (Часть 2)

В моем предыдущем посте я обсуждал некоторые важные вопросы и ответы по Java SE 8. В этом посте мы собираемся обсудить еще несколько вопросов и ответов по Java SE 8. Прежде чем приступить к чтению этого поста, пожалуйста, ознакомьтесь с моим предыдущим постом по ссылке: “Java SE 8 Вопросы и ответы на собеседование (Часть 1)“.

Java SE 8 Вопросы и ответы на собеседование

  1. Что такое Внутреннее Итерирование в Java SE 8?
  2. Каковы различия между Внешним Итерированием и Внутренним Итерированием?
  3. Каковы основные недостатки Внешнего Итерирования?
  4. Каковы основные преимущества Внутреннего Итерирования по сравнению с Внешним Итерированием?
  5. Каков основной недостаток Внутреннего Итерирования по сравнению с Внешним Итерированием?
  6. Каков основной преимущество Внешнего Итерирования по сравнению с Внутренним Итерированием?
  7. Когда нам нужно использовать Внутреннее Итерирование? Когда нам нужно использовать Внешнее Итерирование?
  8. Каковы различия между Промежуточными Операциями и Терминальными Операциями Stream API Java 8?
  9. Возможно ли предоставить реализацию методов в интерфейсах Java? Если да, как это делается?
  10. Что такое Метод по умолчанию? Зачем нам нужны Методы по умолчанию в интерфейсах Java 8?
  11. Что такое Статический Метод? Зачем нам нужны Статические методы в интерфейсах Java 8?
  12. Различия между функциональным программированием и объектно-ориентированным программированием?
  13. Объясните проблемы старого Java Date API? Каковы преимущества API даты и времени в Java 8 по сравнению со старым API даты и времени и API времени Joda?
  14. Зачем нам нужен новый API даты и времени в Java SE 8? Объясните, как API даты и времени Java SE 8 решает проблемы старого Java Date API?
  15. Каковы различия между старым Java Date API и API даты и времени в Java 8?
  16. Что такое множественное наследование? Как Java 8 поддерживает множественное наследование?
  17. Что такое проблема алмаза в интерфейсах из-за методов по умолчанию? Как Java 8 решает эту проблему?

Вопросы и ответы на собеседовании по Java SE 8

Что такое внутренняя итерация в Java SE 8?

До Java 8 у нас не было концепции Внутренней Итерации. В Java 8 была введена новая функция, известная как “Внутренняя Итерация”. До Java 8 в языке Java была только Внешняя Итерация для итерации элементов Агрегированного Объекта, такого как Коллекции, Массивы и т. д. Внутренняя Итерация означает “Итерацию элементов Агрегированного Объекта по одному внутренне с использованием API Java”. Вместо того, чтобы приложение на Java выполняло итерацию внешне, мы просим API Java выполнить эту задачу внутренне.

В чем разница между Внешней Итерацией и Внутренней Итерацией?

S.No. External Iteration Internal Iteration
1. Available before Java 8 too. It is introduced in Java SE 8
2. Iterating an Aggregated Object elements externally. Iterating an Aggregated Object elements internally (background).
3. Iterate elements by using for-each loop and Iterators like Enumeration, Iterator, ListIterator. Iterate elements by using Java API like “forEach” method.
4. Iterating elements in Sequential and In-Order only. Not required to iterate elements in Sequential order.
5. It follows OOP approach that is Imperative Style. It follows Functional Programming approach that is Declarative Style.
6. It does NOT separate responsibilities properly that is, it defines both “What is to be done” and “How it is to be done”. It defines only “What is to be done”. No need to worry about “How it is to be done”. Java API takes care about “How to do”.
7. Less Readable Code. More Readable code.

Каковы основные недостатки Внешней Итерации?

Внешняя Итерация имеет следующие недостатки:

  • Нам нужно писать код в императивном стиле.
  • Отсутствует четкое разделение обязанностей. Тесная связь между кодом “Что нужно сделать” и “Как это нужно сделать”.
  • Менее читаемый код.
  • Больше многословного и шаблонного кода.
  • Мы должны итерировать элементы только в последовательном порядке.
  • Он не поддерживает Параллелизм и Конкурентность должным образом.

Каковы основные преимущества внутренней итерации перед внешней итерацией?

По сравнению с внешней итерацией, внутренняя итерация имеет следующие преимущества:

  • Поскольку она следует функциональному стилю программирования, мы можем писать декларативный код.
  • Более читаемый и краткий код.
  • Избегает написания объемного и стандартного кода.
  • Нет необходимости итерировать элементы в последовательном порядке.
  • Он поддерживает конкурентность и параллелизм должным образом.
  • Мы можем писать параллельный код для улучшения производительности приложения.
  • Четкое разделение обязанностей. Свободная связь между кодом “Что нужно сделать” и “Как это нужно сделать”.
  • Нам нужно писать код только о “Что нужно сделать”, и Java API заботится о коде “Как это нужно сделать”.

Каков основной недостаток внутренней итерации по сравнению с внешней итерацией?

По сравнению с внешней итерацией, у внутренней итерации есть один основной недостаток:

  • Во внутренней итерации, поскольку Java API самостоятельно заботится об итерации элементов, мы НЕ имеем контроля над итерацией.

Каково основное преимущество внешней итерации перед внутренней итерацией?

В сравнении с внутренней итерацией, внешняя итерация имеет одно основное преимущество:

  • Во внешней итерации, поскольку Java API не заботится об итерации элементов, мы имеем гораздо больший контроль над итерацией.

Когда нам нужно использовать внутреннюю итерацию? Когда нам нужно использовать внешнюю итерацию?

Нам необходимо понимать ситуации, когда использовать внутреннюю итерацию или внешнюю итерацию.

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

Различия между промежуточными операциями и терминальными операциями Stream API в Java 8?

S.No. Stream Intermediate Operations Stream Terminal Operations
1. Stream Intermediate operations are not evaluated until we chain it with Stream Terminal Operation. Stream Terminal Operations are evaluated on it’s own. No need other operations help.
2. The output of Intermediate Operations is another Stream. The output of Intermediate Operations is Not a Stream. Something else other than a Stream.
3. Intermediate Operations are evaluated Lazily. Terminal Operations are evaluated Eagerly.
4. We can chain any number of Stream Intermediate Operations. We can NOT chain Stream Terminal Operations.
5. We can use any number of Stream Intermediate Operations per Statement. We can use only one Stream Terminal Operation per Statement.

Возможно ли предоставление реализации методов в интерфейсах Java? Если да, как мы это делаем?

В Java 7 или ранее невозможно предоставление реализации методов в интерфейсах. Начиная с Java 8, это стало возможным. В Java SE 8 мы можем предоставлять реализацию методов в интерфейсах, используя следующие два новых концепта:

  • Методы по умолчанию
  • Статические методы

Что такое метод по умолчанию? Зачем нам нужны методы по умолчанию в интерфейсах Java 8?

A Default Method is a method which is implemented in an interface with “default” keyword. It’s new featured introduced in Java SE 8. We need Default Methods because of the following reasons:

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

Что такое статический метод? Зачем нам нужны статические методы в интерфейсах Java 8?

A Static Method is an Utility method or Helper method, which is associated to a class (or interface). It is not associated to any object. We need Static Methods because of the following reasons:

  • Мы можем хранить вспомогательные или утилитарные методы, специфичные для интерфейса, прямо в самом интерфейсе, а не в отдельном классе утилит.
  • Нам не нужны отдельные классы утилит, такие как Collections, Arrays и т. д., для хранения утилитарных методов.
  • Четкое разделение обязанностей. Мы не нуждаемся в одном классе утилит для хранения всех утилитарных методов API коллекций, таких как Collections и т. д.
  • Легко расширять API.
  • Легко обслуживать API.

Различия между функциональным программированием и объектно-ориентированным программированием?

Functional Programming OOP
Does not exist State Exists State
Uses Immutable data Uses Mutable data
It follows Declarative Programming Model It follows Imperative Programming Model
Stateless Programming Model Stateful Programming Model
Main Fcous on: “What you are doing” Main focus on “How you are doing”
Good for Parallel (Concurrency) Programming Poor for Parallel (Concurrency) Programming
Good for BigData processing and analysis NOT Good for BigData processing and analysis
Supports pure Encapsulation It breaks Encapsulation concept
Functions with No-Side Effects Methods with Side Effects
Functions are first-class citizens Objects are first-class citizens
Primary Manipulation Unit is “Function” Primary Manipulation Unit is Objects(Instances of Classes)
Flow Controls: Function calls, Function Calls with Recursion Flow Controls: Loops, Conditional Statements
It uses “Recursion” concept to iterate Collection Data. It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java
Order of execution is less importance. Order of execution is must and very important.
Supports both “Abstraction over Data” and “Abstraction over Behavior”. Supports only “Abstraction over Data”.
We use FP when we have few Things with more operations. We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java.

Примечание: Для получения дополнительной информации о сравнении ФП, ООП и ООП, пожалуйста, ознакомьтесь с моим предыдущим постом на: “Сравнение ФП, ООП(ИП)

Объясните проблемы старого Java Date API? Каковы преимущества Java 8 Date and Time API по сравнению со старым Date API и Joda Time API?

Старое Java Date API в Java означает API дат, доступные до Java SE 8, такие как Date, Calendar, SimpleDateFormat и т. д. У старого Date API в Java есть следующие проблемы или недостатки по сравнению с Java 8 Date and Time API и Joda Time API.

  • Большая часть API устарела.
  • Меньшая читаемость.
  • java.util.Date является изменяемым и не потокобезопасным.
  • java.text.SimpleDateFormat не потокобезопасен.
  • Меньшая производительность.

У Java SE 8 Date and Time API есть следующие преимущества по сравнению со старым Date API в Java.

  • Очень прост в использовании.
  • Читаемый для человека синтаксис, который обеспечивает большую читаемость.
  • Все API потокобезопасны.
  • Лучшая производительность.

Зачем нам нужен новый API для работы с датой и временем в Java SE 8? Объясните, как API для работы с датой и временем в Java SE 8 решает проблемы старого API для даты в Java?

Нам нужен API для работы с датой и временем в Java 8 для разработки высокопроизводительных, потокобезопасных и масштабируемых приложений на Java. API для работы с датой и временем в Java 8 решает все проблемы старого API для даты в Java, следуя принципам неизменяемости и безопасности потоков.

Каковы различия между старым API для даты в Java и новым API для работы с датой и временем в Java 8?

Различия между старым API для даты в Java и API для работы с датой и временем в Java 8:

S.No. Java’s OLD Java Date API Java 8’s Date and Time API
1. Available before Java 8 too. It is introduced in Java SE 8
2. Not Thread Safe. Thread Safe.
3. Mutable API. Immutable API.
4. Less Performance. Better Performance.
5. Less Readability. More Readability.
6. It’s not recommended to use as its deprecated. It’s always recommended to use.
7. Not Extendable. Easy to Extend.
8. It defines months values from 0 to 11, that is January = 0. It defines months values from 1 to 12, that is January = 1.
9. It’s an old API. It’s a new API.

Что такое Множественное Наследование? Как Java 8 поддерживает Множественное Наследование?

Множественное Наследование означает, что класс может наследовать характеристики и особенности от более чем одного родительского класса. В Java 7 или ранее множественное наследование невозможно, потому что Java следует правилу “Класс должен расширять только один класс или абстрактный класс”. Тем не менее, возможно обеспечить Множественное Наследование Реализации с использованием интерфейса, потому что Java следует правилу “Класс может расширять любое количество интерфейсов”. Однако Java 8 поддерживает “Реализацию методов в интерфейсах”, введя новые возможности: методы по умолчанию в интерфейсе. Благодаря этой функции Java 8 поддерживает Множественное Наследование с некоторыми ограничениями.

Что такое Проблема Алмаза в интерфейсах из-за методов по умолчанию? Как Java 8 решает эту проблему?

Методы по умолчанию Java 8 могут вызывать проблему алмаза, когда класс реализует несколько интерфейсов. Это происходит, когда класс расширяет более одного интерфейса с одинаковыми реализациями методов (методы по умолчанию). Пример кода Java SE 8 для демонстрации проблемы алмаза с методами по умолчанию интерфейса.

interface A {
	default void display() {
		System.out.println("A");
	}
}

interface B extends A {
	default void display() {
		System.out.println("B");
	}
}

interface C extends A {
	default void display() {
		System.out.println("C");
	}
}

class D implements B, C {
}

В приведенном выше фрагменте кода класс D дает ошибку времени компиляции “Дублированные методы по умолчанию с именем display с параметрами () и () наследуются от типов C и B”. Это происходит потому, что компилятор Java путается в том, какой display() использовать в классе D. Класс D наследует метод display() как от интерфейса B, так и от C. Для решения этой проблемы Java 8 предоставила следующее решение.

class D implements B, C {

	@Override
	public void display() {
		B.super.display();
	}
	
}

Этот B.super.display(); решит эту проблему алмаза. Если вы хотите использовать метод по умолчанию интерфейса C, то используйте C.super.display();. Это все, что касается вопросов собеседования по Java 8. Мы обсудим еще некоторые вопросы собеседования по Java SE 8 в моих последующих сообщениях. Пожалуйста, оставьте комментарий, если вам понравилась моя публикация или у вас есть какие-либо проблемы/предложения.

Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part2