Domande e risposte sull’intervista di Java SE 8 (Parte 2)

Nel mio post precedente, ho discusso alcune importanti domande e risposte dell’intervista su Java SE 8. In questo post, discuteremo ulteriori domande e risposte sull’intervista su Java SE 8. Prima di leggere questo post, ti prego di dare un’occhiata al mio post precedente su: “Domande di Intervista su Java SE 8 (Parte 1)“.

Domande di Intervista su Java SE 8

  1. Cos’è l’Iterazione Interna in Java SE 8?
  2. Differenze tra Iterazione Esterna e Iterazione Interna?
  3. Quali sono gli svantaggi principali dell’Iterazione Esterna?
  4. Quali sono i principali vantaggi dell’Iterazione Interna rispetto all’Iterazione Esterna?
  5. Qual è lo svantaggio principale dell’Iterazione Interna rispetto all’Iterazione Esterna?
  6. Qual è il principale vantaggio dell’Iterazione Esterna rispetto all’Iterazione Interna?
  7. Quando dobbiamo usare l’Iterazione Interna? Quando dobbiamo usare l’Iterazione Esterna?
  8. Differenze tra Operazioni Intermedie e Operazioni Terminali dell’API Stream di Java 8?
  9. È possibile fornire implementazioni di metodi nelle Interfacce Java? Se possibile, come le forniamo?
  10. Cos’è un Metodo Predefinito? Perché abbiamo bisogno di metodi predefiniti nelle Interfacce Java 8?
  11. Cos’è un Metodo Statico? Perché abbiamo bisogno di metodi statici nelle Interfacce Java 8?
  12. Differenze tra la programmazione funzionale e la programmazione orientata agli oggetti?
  13. Spiegare i problemi dell’API Date vecchia di Java? Quali sono i vantaggi dell’API Date e Time di Java 8 rispetto all’API Date vecchia e all’API Joda Time?
  14. Perché abbiamo bisogno di una nuova API Date e Time in Java SE 8? Spiegare come l’API Date e Time di Java SE 8 risolve i problemi dell’API Date vecchia di Java?
  15. Quali sono le differenze tra l’API Date vecchia di Java e l’API Date e Time di Java 8?
  16. Cosa si intende per ereditarietà multipla? Come Java 8 supporta l’ereditarietà multipla?
  17. Cosa si intende per problema del diamante nelle interfacce a causa dei metodi di default? Come risolve questo problema Java 8?

Domande e risposte sull’intervista a Java SE 8

Cosa si intende per iterazione interna in Java SE 8?

Prima di Java 8, non avevamo il concetto di Iterazione Interna. Java 8 ha introdotto una nuova funzionalità chiamata “Iterazione Interna”. Prima di Java 8, il linguaggio Java aveva solo l’Iterazione Esterna per iterare gli elementi di un oggetto aggregato come le collezioni, gli array, ecc. L’Iterazione Interna significa “Iterare gli elementi di un oggetto aggregato uno per uno internamente tramite l’API di Java”. Invece di far eseguire l’iterazione esternamente all’applicazione Java, chiediamo all’API di Java di svolgere questo compito internamente.

Differenze tra Iterazione Esterna e Iterazione Interna?

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.

Quali sono i principali svantaggi dell’Iterazione Esterna?

L’Iterazione Esterna presenta i seguenti svantaggi:

  • Dobbiamo scrivere codice in stile imperativo.
  • Non c’è una chiara separazione delle responsabilità. Accoppiamento stretto tra il codice “Cosa deve essere fatto” e “Come deve essere fatto”.
  • Codice meno leggibile.
  • Codice più verboso e di boilerplate.
  • Dobbiamo iterare gli elementi solo in ordine sequenziale.
  • Non supporta correttamente la concorrenza e la parallelità.

Quali sono i principali vantaggi dell’Iterazione Interna rispetto all’Iterazione Esterna?

Contrariamente all’Iterazione Esterna, l’Iterazione Interna ha i seguenti vantaggi:

  • Poiché segue lo stile della Programmazione Funzionale, possiamo scrivere Codice Dichiarativo.
  • Codice più leggibile e conciso.
  • Evita di scrivere codice verboso e ripetitivo
  • Non è necessario iterare gli elementi in ordine sequenziale.
  • Supporta la Concorrenza e il Parallelismo in modo appropriato.
  • Possiamo scrivere codice Parallelo per migliorare le prestazioni dell’applicazione.
  • Chiara separazione delle Responsabilità. Accoppiamento lasco tra il codice “Cosa deve essere fatto” e il codice “Come deve essere fatto”.
  • Dobbiamo scrivere codice solo per “Cosa deve essere fatto” e l’API Java si occupa del codice “Come deve essere fatto”.

Qual è il principale svantaggio dell’Iterazione Interna rispetto all’Iterazione Esterna?

Contrariamente all’Iterazione Esterna, l’Iterazione Interna ha un grosso svantaggio:

  • Nella Iterazione Interna, poiché l’API Java si occupa internamente dell’iterazione degli elementi, NON abbiamo il controllo sull’Iterazione.

Qual è il vantaggio principale dell’Iterazione Esterna rispetto all’Iterazione Interna?

Rispetto all’Iterazione Interna, l’Iterazione Esterna ha un vantaggio principale:

  • Nell’Iterazione Esterna, poiché l’API Java NON si occupa dell’iterazione degli elementi, abbiamo molto più controllo sull’Iterazione.

Quando dobbiamo utilizzare l’Iterazione Interna? Quando dobbiamo usare l’Iterazione Esterna?

Dobbiamo capire le situazioni in cui utilizzare l’Iterazione Interna o l’Iterazione Esterna.

  • Quando abbiamo bisogno di più controllo sull’Iterazione, possiamo utilizzare l’Iterazione Esterna.
  • Quando NON abbiamo bisogno di più controllo sull’Iterazione, possiamo utilizzare l’Iterazione Interna.
  • Quando dobbiamo sviluppare applicazioni altamente concorrenti e parallele, dovremmo utilizzare l’Iterazione Interna.

Differenze tra le operazioni intermedie e le operazioni terminali dell’API Stream di 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.

E’ possibile fornire implementazioni di metodi nelle interfacce Java? Se possibile, come li forniamo?

In Java 7 o versioni precedenti, non è possibile fornire implementazioni di metodi nelle interfacce. A partire da Java 8, è possibile farlo. In Java SE 8, possiamo fornire implementazioni di metodi nelle interfacce utilizzando i seguenti due nuovi concetti:

  • Metodi di default
  • Metodi statici

Cosa è un metodo di default? Perché abbiamo bisogno di metodi di default nelle interfacce 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:

  • Consente di fornire l’implementazione dei metodi nelle interfacce.
  • Per aggiungere nuove funzionalità all’interfaccia senza rompere le classi che implementano tale interfaccia.
  • Per fornire un’elegante funzionalità di compatibilità inversa.
  • Per facilitare l’estensione delle funzionalità esistenti.
  • Per facilitare la manutenzione delle funzionalità esistenti.

Cos’è un metodo statico? Perché abbiamo bisogno di metodi statici nelle interfacce di 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:

  • Possiamo mantenere i metodi di assistenza o utilità specifici per un’interfaccia nella stessa interfaccia anziché in una classe di utilità separata.
  • Non abbiamo bisogno di classi di utilità separate come Collections, Arrays, ecc. per mantenere i metodi di utilità.
  • Chiara separazione delle responsabilità. Non è necessaria una classe di utilità per conservare tutti i metodi di utilità dell’API di Collection come Collections, ecc.
  • Facile estensione dell’API.
  • Facile manutenzione dell’API.

Differenze tra la programmazione funzionale e la programmazione orientata agli oggetti?

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.

NOTA: Per ulteriori informazioni sulle comparazioni FP, IP e OOP, consulta il mio post precedente su: “Confronto FP, OOP (IP)

Spiega i problemi dell’API di data Java obsoleta? Quali sono i vantaggi dell’API di data e ora di Java 8 rispetto all’API di data obsoleta e all’API di Joda Time?

La vecchia API di data di Java, chiamata OLD Java Date API, si riferisce all’API di data disponibile prima di Java SE 8, ovvero Date, Calendar, SimpleDateFormat, ecc. L’API di data obsoleta di Java ha i seguenti problemi o svantaggi rispetto all’API di data e ora di Java 8 e all’API di Joda Time.

  • La maggior parte delle API è deprecata.
  • Meno leggibilità.
  • java.util.Date è mutabile e non thread-safe.
  • java.text.SimpleDateFormat non è thread-safe.
  • Meno prestazioni.

L’API di data e ora di Java SE 8 ha i seguenti vantaggi rispetto alla vecchia API di data di Java.

  • Molto semplice da usare.
  • Sintassi leggibile dall’essere umano, ovvero maggiore leggibilità.
  • Tutte le API sono thread-safe.
  • Migliore performance.

Perché abbiamo bisogno di una nuova API per data e ora in Java SE 8? Spiega come l’API Data e Ora di Java SE 8 risolve i problemi dell’antica API Date di Java?

Avere bisogno dell’API Data e Ora di Java 8 per sviluppare Applicazioni Java altamente performanti, Thread-Safe e Altamente Scalabili. L’API Data e Ora di Java 8 risolve tutti i problemi dell’antica API Date di Java seguendo i principi di Immutabilità e Sicurezza dei Thread.

Quali sono le differenze tra l’ANTICA API Date di Java e l’API Data e Ora di Java 8?

Differenze tra l’ANTICA API Date di Java e l’API Data e Ora di 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.

Cosa significa l’ereditarietà multipla? Come Java 8 supporta l’ereditarietà multipla?

L’ereditarietà multipla significa che una classe può ereditare o estendere caratteristiche e funzionalità da più di una classe genitore. In Java 7 o precedente, l’ereditarietà multipla non è possibile perché Java segue la regola “Una classe dovrebbe estendere una e una sola classe o classe astratta”. Tuttavia, è possibile fornire un’ereditarietà di implementazione multipla utilizzando le interfacce perché Java segue la regola “Una classe può estendere qualsiasi numero di interfacce”. Tuttavia, Java 8 supporta “L’implementazione dei metodi nelle interfacce” introducendo nuove funzionalità: metodi predefiniti nell’interfaccia. Grazie a questa funzionalità, Java 8 supporta l’ereditarietà multipla con alcune limitazioni.

Cosa significa il problema del diamante nelle interfacce dovuto ai metodi predefiniti? Come Java 8 risolve questo problema?

Java 8 i metodi predefiniti possono introdurre un problema di diamante quando una classe implementa più interfacce. Si verifica quando una classe estende più interfacce con implementazioni di metodo identiche (metodo predefinito). Codice di esempio Java SE 8 per mostrare il problema del diamante con i metodi predefiniti dell’interfaccia.

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 {
}

Nel frammento di codice sopra, la classe D restituisce un errore di compilazione come “Metodi predefiniti duplicati denominati display con i parametri () e () sono ereditati dai tipi C e B”. È perché il compilatore Java sarà confuso su quale display() utilizzare nella classe D. La classe D eredita il metodo display() da entrambe le interfacce B e C. Per risolvere questo problema, Java 8 ha dato la seguente soluzione.

class D implements B, C {

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

Questo B.super.display(); risolverà questo Problema del Diamante. Se vuoi utilizzare il metodo predefinito dell’interfaccia C, allora usa C.super.display();. Questo è tutto per le domande di intervista su Java 8. Discuteremo alcune altre domande di intervista su Java SE 8 nei miei prossimi post. Per favore lasciami un commento se ti è piaciuto il mio post o se hai problemi/suggerimenti.

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