Fatti trovare pronto al tuo prossimo colloquio di lavoro Java, con questa lista di domande e risposte sulla programmazione Java.
Ci sono le domande più frequenti con le relative risposte, di livello base e di livello più avanzato.
Non perdiamo altro tempo, e buttiamoci sulle domande Java!
Cos’è Java?
Java è un ecosistema composto dal linguaggio di programmazione generico utilizzato per lo sviluppo web, la Java Virtual Machine (JVM), un ambiente di esecuzione virtuale, il Java Runtime Environment (JRE), un ambiente runtime, e il Java Development Kit (JDK), il componente principale dell’ambiente Java che contiene JRE insieme al compilatore Java, al debugger Java e ad altre classi.
Per maggiori dettagli vedi la definizione completa di Java.
Perché Java è un linguaggio indipendente dalla piattaforma?
Il linguaggio di programmazione Java è stato sviluppato in modo tale da non dipendere da alcun hardware o software. Ciò è possibile grazie al compilatore Java che compila il codice e lo converte in codice byte eseguibile su diversi sistemi a prescindere dalla piattaforma. Infatti l’unico requisito per far girare il codice byte è aver installato sulla macchina l’ambiente di runtime JRE.
Perché Java non è un linguaggio ad oggetti puro?
Java non è un linguaggio di pura OP, ma un linguaggio orientato agli oggetti, ad esempio perché i valori dei tipi primitivi non sono oggetti (byte, boolean, char, short, int, float, long e double).
Java utilizza i puntatori?
No, per vari motivi: I puntatori sono complicati, il che va contro il principio di Java sulla semplicità del codice. L’uso dei puntatori può anche causare potenziali errori, oltre a compromettere la sicurezza (con l’aiuto dei puntatori gli utenti possono accedere direttamente alla memoria). Java usa i riferimenti al posto dei puntatori, perché i riferimenti non possono essere manipolati.
Che IDE usare con Java?
Alcuni IDE che si possono usare per programmare in Java sono Eclipse, NetBeans, IntelliJ IDEA e Android Studio.
Cos’è il compilatore JIT?
Il compilatore Just in Time (JIT) viene usato per convertire insieme le parti del bytecode che hanno funzionalità simili, e quindi ridurre la quantità di tempo necessaria per la compilazione. In questo modo le prestazioni aumentano quasi al livello di una compilazione in linguaggio macchina.
Che differenza c’è tra una variabile locale e una variabile di istanza?
Le variabili di istanza (instance variable) descrivono le proprietà di un oggetto e sono vincolate ad esso. Dichiarate all’interno della classe e all’esterno dei metodi, sono variabili accessibili da tutti i metodi della classe.
Le variabili locali (local variable) sono presenti all’interno di un blocco, funzione o costruttore, e la loro visibilità è limitata all’ambito del blocco. Infatti gli altri metodi della classe non hanno alcuna conoscenza della variabile locale dichiarata all’interno di un metodo.
Cosa significa il motto di Java “WORA (write once and run anywhere)”?
Write Once and Run Anywhere fa riferimento alla natura indipendente da piattaforma di Java. Infatti il compilatore Java converte i programmi Java nel bytecode, il linguaggio intermedio tra il codice sorgente e il codice macchina. Il bytecode non è specifico della piattaforma, e quindi può essere eseguito su qualsiasi computer, da qui il motto ‘scrivi una volta, esegui ovunque’.
L’ordine degli specificatori ha importanza in Java?
No: un programma Java viene compilato ed eseguito correttamente a prescindere dall’ordine usato.
Cosa sono i modificatori di accesso?
In Java, i modificatori di accesso sono parole chiave usate per definire l’ambito di accesso del metodo, della classe o di una variabile.
Quali sono i modificatori di accesso di Java?
Nel linguaggio Java ci sono quattro identificatori di accesso per metodi, classi e variabili:
- pubblico, ovvero accessibile da qualsiasi classe o metodo
- protetto, ovvero accessibile solo dalla classe dello stesso package, o dalla sottoclasse di questa classe, o all’interno della stessa classe
- default, ovvero accessibile solo all’interno del package (è l’impostazione predefinita di tutti i metodi, classi e variabili)
- privato, ovvero accessibile solo all’interno della classe.
Cos’è una Classe (Class)?
Una Classe è la definizione di un tipo di oggetto, ovvero un progetto o prototipo definito dall’utente da cui vengono creati tutti gli oggetti. Rappresenta l’insieme di proprietà e metodi comuni a tutti gli oggetti di un tipo, ma non specifica il loro valore.
Cos’è un Oggetto (Object)?
L’Oggetto in Java è una istanza della classe, l’entità unitaria con stato e comportamento definiti a priori. Gli stati degli oggetti sono veicolati dagli attributi (o variabili) di istanza, mentre i metodi ne stabiliscono il comportamento. L’oggetto viene solitamente creato con la keyword ‘new’.
A cosa serve la garbage collection in Java?
L’obiettivo principale di questo processo è ottimizzare l’uso delle risorse di memoria, eliminando tutto ciò che non serve – d’altronde, si raccoglie la spazzatura per buttarla via. Dunque la garbage collection libera lo spazio di memoria occupato da oggetti non necessari e irraggiungibili durante l’esecuzione del programma.
Cos’è l’ereditarietà (inheritance)?
L’ereditarietà è uno dei quattro concetti fondamentali della programmazione orientata agli oggetti, insieme a incapsulamento, polimorfismo e astrazione. Ereditarietà in Java significa che una classe può estendersi a un’altra classe, consentendo di riutilizzare il codice da una classe all’altra. La classe esistente viene chiamata superclasse mentre quella derivata è chiamata sottoclasse.
Cos’è l’incapsulamento (encapsulation)?
L’incapsulamento è uno dei quattro concetti fondamentali della programmazione orientata agli oggetti, insieme a ereditarietà, polimorfismo e astrazione. L’incapsulamento in Java è un meccanismo che riunisce in una singola unità i dati (variabili) e il codice che agisce sui dati (metodi). Allo stesso tempo, si tratta di una procedura di sicurezza, perché le variabili di una classe sono nascoste alle altre classi, e l’accesso è consentito solo tramite i metodi della loro classe corrente. Sostanzialmente impedisce l’accesso ai dati da parte del codice al di fuori di questa capsula. Questo concetto viene chiamato anche occultamento dei dati.
Cos’è il poliformismo (polymorphism)?
Il polimorfismo è uno dei quattro concetti fondamentali della programmazione orientata agli oggetti, insieme a ereditarietà, incapsulamento e astrazione. Il polimorfismo di per sé è la capacità di un oggetto di assumere molte forme. In Java, questo indica la possibilità di eseguire la stessa azione in molti modi diversi, ovvero consente di definire un’interfaccia e avere più implementazioni.
Cos’è l’astrazione?
L’astrazione è uno dei quattro concetti fondamentali della programmazione orientata agli oggetti, insieme a ereditarietà, incapsulamento e polimorfismo. In Java l’astrazione consiste nello scegliere i dati da un insieme più ampio per mostrare all’utente solo i dettagli rilevanti dell’oggetto. Significa mostrare solo gli attributi essenziali e nascondere le informazioni non necessarie, per ridurre la complessità di programmazione.
Quanti tipi di polimorfismo ci sono in Java?
Ci sono due tipi di polimorfismo in Java: polimorfismo in fase di compilazione e polimorfismo in fase di esecuzione.
Il polimorfismo in fase di compilazione (compile time polymorphism) è anche noto come polimorfismo statico. Questo tipo di polimorfismo si ottiene con l’overload di metodi.
Il polimorfismo in fase di esecuzione (runtime polymorphism) viene chiamato anche polimorfismo dinamico o dynamic method dispatch. Si ottiene quando una chiamata ad un metodo overriden viene risolta in fase di runtime.
Cos’è il method overriding?
L’override del metodo è una funzionalità che consente a una sottoclasse di fornire un’implementazione specifica di un metodo già fornito da una delle sue superclassi. Quando un metodo in una sottoclasse ha lo stesso nome, gli stessi parametri e lo stesso tipo restituito di un metodo della sua superclasse, allora si dice che il metodo nella sottoclasse sovrascrive (override) il metodo nella superclasse. L’override del metodo è uno dei modi con cui Java realizza il polimorfismo in fase di esecuzione (runtime polymorphism).
Cos’è il method overloading?
L’overload del metodo (method overloading) consente di definire più versioni dello stesso metodo, variando il numero e il tipo dei parametri e/o la visibilità. L’overloading può essere fatto nella stessa classe o anche nelle classi derivate. L’overloading è correlato al polimorfismo in fase di compilazione (o statico)
Cos’è un’interfaccia in Java?
L’interfaccia (interface) in Java è un insieme di nomi di metodi astratti che possono essere implementati su più classi. Ha una struttura simile a una classe, ma può contenere solo e soltanto metodi d’istanza astratti e costanti. Un’interfaccia quindi non può contenere costruttori, variabili statiche, variabili di istanza e metodi statici.
Cos’è una classe astratta (abstract class)?
Una classe astratta in Java è una classe dichiarata con la keyword ‘abstract’ che definisce una interfaccia senza implementarla, definendo caratteristiche comuni fra classi di una determinata gerarchia. La classe astratta può avere costruttori e metodi statici, metodi astratti e non astratti, ma non può essere istanziata.
Che differenza c’è tra interfaccia e classe astratta?
In Java interfacce e classi astratte sono dichiarate ma non istanziate, ma le classi astratte, a differenza delle interfacce, possono avere costruttori, variabili di istanza e metodi non astratti.
Che cos’è una funzione Lambda in Java?
La funzione Lambda è stata introdotta con Java 8 (2014). Un’espressione lambda è un breve blocco di codice che accetta parametri e restituisce un valore. Le espressioni lambda sono simili ai metodi, ma non necessitano di un nome e possono essere implementate direttamente nel corpo di un metodo. Si tratta sostanzialmente di una funzione anonima, cioè priva di una dichiarazione che le dia un nome (è un approccio tipico della programmazione funzionale).
Quali sono le differenze tra List e ArrayList?
Una delle differenze più importanti tra List e ArrayList è che List è un’interfaccia che estende il framework Collection mentre ArrayList è una classe Collection standard che estende la classe AbstractList e implementa le interfacce List.
L’interfaccia List crea una raccolta di elementi archiviati in una sequenza e identificabili o accessibili dal loro numero di indice. Al contrario, ArrayList crea un array di oggetti in cui l’array può crescere dinamicamente quando richiesto.
Infine il namespace per l’interfaccia List è System.Collection.Generic mentre il namespace per ArrayList è System.Collection.
Quali sono le differenze tra Array e ArrayList?
La principale differenza tra Array e ArrayList in Java è la natura statica dell’Array e la natura dinamica di ArrayList. La dimensione di Array deve essere definita al momento della creazione, non può essere modificata e per inserire un elemento bisogna specificare l’index. Al contrario ArrayList può ridimensionarsi quando necessario, e l’inserimento non è posizionabile.
Un’altra notevole differenza è che Array fa parte della programmazione Java di base, mentre ArrayList fa parte del framework Collections.
➤ Scopri le domande più frequenti per il colloquio di lavoro back-end
Quali sono le differenze tra HashMap e HashTable?
HashMap non è sincronizzato, ed è quindi indicato per le applicazioni senza thread. Consente solo una chiave null ma un qualsiasi numero di null nei valori. Inoltre supporta l’ordine di inserimento utilizzando la sua sottoclasse LinkedHashMap.
HashTable al contrario è is synchronized è sincronizzato, ed è quindi indicato per le applicazioni con thread. Non consente null in chiavi o valori, e non garantisce l’ordine di inserimento.
Che cos’è Collection in Java?
Collection è un framework, cioè un insieme di classi e interfacce che forniscono un’architettura già pronta. Il framework Collection in Java fornisce un’architettura per archiviare e manipolare un insieme di oggetti singoli come se fossero una singola unità. Le Java Collections possono eseguire tutte le operazioni consentite su un dato come la ricerca, l’ordinamento, l’inserimento, la manipolazione e l’eliminazione.
Come si inverte un albero binario in Java?
In Java è possibile invertire un albero binario usando il metodo descendingSet() per rendere un elemento TreeSet in ordine decrescente.
Se invece bisogna cambiarne l’ordine da sinistra a destra, ecco un esempio pratico di come codificare l’inversione dell’albero binario in Java:
static void reverseTree(final TreeNode root) {
if (root == null) {
return;
}
final TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
reverseTree(root.left);
reverseTree(root.right);
}
Qual è la differenza tra Java e JavaScript?
Related posts
Scopri GeekandJob
Lavoro, formazione e informazione: tre elementi combinati per dare il massimo valore a talenti e aziende del settore tecnologico.