Java è uno dei linguaggi di programmazione più popolari al mondo, noto per la sua versatilità, portabilità e un'ampia gamma di applicazioni. Java è il linguaggio più utilizzato nelle migliori aziende come Uber, Airbnb, Google, Netflix, Instagram, Spotify, Amazon e molte altre grazie alle sue funzionalità e prestazioni.
In questo articolo forniremo Oltre 200 domande per interviste Core Java su misura sia per matricole che per professionisti esperti con 3, 5 e 8 anni di esperienza. Qui copriamo tutto, inclusi i concetti fondamentali di Java, la programmazione orientata agli oggetti (OOP), il multithreading, la gestione delle eccezioni, i modelli di progettazione, le raccolte Java e altro ancora, che ti aiuteranno sicuramente a superare le interviste Java.

Tabella dei contenuti
- Domande per l'intervista Java per le matricole
- Domande per l'intervista intermedia Java
- Domande di intervista Java per esperti
- Domande per l'intervista sulla differenza Java
Domande per l'intervista Java per le matricole
1. Java è indipendente dalla piattaforma e come?
Sì, Java è un linguaggio indipendente dalla piattaforma. A differenza di molti linguaggi di programmazione, il compilatore Java compila il programma per formare un bytecode o un file .class. Questo file è indipendente dal software o dall'hardware in esecuzione ma necessita di un file JVM (Java Virtual Machine) preinstallato nel sistema operativo per l'ulteriore esecuzione del bytecode.
Sebbene JVM dipende dalla piattaforma , il bytecode può essere creato su qualsiasi sistema e può essere eseguito in qualsiasi altro sistema nonostante venga utilizzato hardware o software che rende indipendente la piattaforma Java.
2. Quali sono le principali funzionalità Java?
Java è uno dei linguaggi più famosi e più utilizzati nel mondo reale, ci sono molte funzionalità in Java che lo rendono migliore di qualsiasi altro linguaggio, alcune di esse sono menzionate di seguito:

- Semplice : Java è abbastanza semplice da capire e la sintassi
- Piattaforma indipendente: Java è indipendente dalla piattaforma, il che significa che possiamo eseguire lo stesso programma su qualsiasi software e hardware e otterremo lo stesso risultato.
- Interpretato : Java viene interpretato come un linguaggio basato sul compilatore.
- Robusto : funzionalità come Garbage collection, gestione delle eccezioni, ecc. che rendono il linguaggio robusto.
- Orientato agli oggetti : Java è un linguaggio orientato agli oggetti che supporta i concetti di classe, oggetti, quattro pilastri di OOPS, ecc.
- Protetto : Poiché possiamo condividere direttamente un'applicazione con l'utente senza condividere il programma vero e proprio, Java è un linguaggio sicuro.
- Alte prestazioni: più velocemente di altri linguaggi di programmazione interpretati tradizionali.
- Dinamico : supporta il caricamento dinamico di classi e interfacce.
- Distribuito : funzionalità di Java ci consente di accedere ai file chiamando i metodi da qualsiasi macchina connessa.
- Multithread : gestire più attività contemporaneamente definendo più thread
- Architettura neutrale : non dipende dall'architettura.
3. Cos'è la JVM?

JVM sta per Java Virtual Machine ed è un interprete Java. È responsabile del caricamento, della verifica e dell'esecuzione del bytecode creato in Java.
Sebbene dipenda dalla piattaforma, il che significa che il software di JVM è diverso per i diversi sistemi operativi, svolge un ruolo fondamentale nel rendere la piattaforma Java indipendente.
Per saperne di più sull'argomento fare riferimento a JVM in Java .
4. Cos'è il JIT?

JIT sta per compilatore (Just-in-Time) e fa parte di JRE (Java Runtime Environment), viene utilizzato per migliorare le prestazioni delle applicazioni Java durante il runtime. L'uso di JIT è menzionato nel processo passo passo menzionato di seguito:
- Il codice sorgente è compilato con javac compilatore per formare bytecode
- Il bytecode viene ulteriormente trasmesso a JVM
- JIT fa parte di JVM, JIT è responsabile della compilazione del bytecode nel codice macchina nativo in fase di esecuzione.
- Il compilatore JIT è sempre abilitato, mentre viene attivato quando viene richiamato un metodo. Per un metodo compilato, la JVM chiama direttamente il codice compilato invece di interpretarlo.
- Poiché JVM chiama il codice compilato che aumenta le prestazioni e la velocità di esecuzione.
Per saperne di più sull'argomento fare riferimento a JIT in Java .
5. Quali sono gli archivi di memoria disponibili con JVM?

JVM è costituita da alcuni archivi di memoria come indicato di seguito:
- Area classe (metodo): memorizza i dati a livello di classe di ogni classe come il pool delle costanti di runtime, i dati dei campi e dei metodi e il codice per i metodi.
- Heap: gli oggetti vengono creati o gli oggetti vengono archiviati. Viene utilizzato per allocare memoria agli oggetti durante il runtime.
- Stack: memorizza i dati e i risultati parziali che saranno necessari durante la restituzione del valore per il metodo e l'esecuzione del collegamento dinamico
- Registro del contatore del programma: memorizza l'indirizzo dell'istruzione della macchina virtuale Java attualmente in esecuzione.
- Stack di metodi nativi: memorizza tutti i metodi nativi utilizzati nell'applicazione.
Per saperne di più sull'argomento fare riferimento a Archivi di memoria JVM .
6. Cos'è un caricatore di classi?
Classloader è la parte di JRE (Java Runtime Environment), durante l'esecuzione del bytecode o del file .class creato classloader è responsabile del caricamento dinamico delle classi e delle interfacce Java su JVM (Java Virtual Machine). A causa dei classloader, il sistema runtime Java non ha bisogno di conoscere file e file system.
Per saperne di più sull'argomento fare riferimento a ClassLoader in Java.
7. Differenza tra JVM, JRE e JDK.
JVM : JVM nota anche come Java Virtual Machine fa parte di JRE. JVM è un tipo di interprete responsabile della conversione del bytecode in codice leggibile dalla macchina. La stessa JVM dipende dalla piattaforma ma interpreta il bytecode che è il motivo indipendente dalla piattaforma per cui Java è indipendente dalla piattaforma.
JRE : JRE sta per Java Runtime Environment, è un pacchetto di installazione che fornisce un ambiente per eseguire il programma o l'applicazione Java su qualsiasi macchina.
JDK : JDK sta per Java Development Kit che fornisce l'ambiente per sviluppare ed eseguire programmi Java. JDK è un pacchetto che include due strumenti di sviluppo per fornire un ambiente per sviluppare i programmi Java e JRE per eseguire programmi o applicazioni Java.
Per approfondire l'argomento fare riferimento al Differenze tra JVM, JRE e JDK .
8. Quali sono le differenze tra Java e C++?
Base | C++ | Giava |
|---|---|---|
piattaforma | C++ dipende dalla piattaforma | Java è indipendente dalla piattaforma |
Applicazione | Il C++ viene utilizzato principalmente per la programmazione di sistema | Java è utilizzato principalmente per la programmazione di applicazioni |
Hardware | Il C++ è più vicino all'hardware | Java non è così interattivo con l'hardware |
Ambito globale | C++ supporta l'ambito globale e dello spazio dei nomi. | Java non supporta l'ambito globale. |
Non supportato | Le funzionalità supportate in Java ma non in C++ sono:
| Le funzionalità supportate in C++ ma non in Java sono:
|
OPS | C++ è un linguaggio orientato agli oggetti. Non è una gerarchia a radice singola. | Java è anche un linguaggio orientato agli oggetti. È una gerarchia a radice singola poiché tutto deriva da una singola classe (java.lang.Object). |
Albero dell'eredità | Il C++ crea sempre un nuovo albero di ereditarietà. | Java utilizza un albero di ereditarietà singolo poiché le classi in Java sono figlie delle classi di oggetti in Java. |
9. Spiegare public static void main(String args[]) in Java.

A differenza di qualsiasi altro linguaggio di programmazione come C, C++, ecc. In Java, abbiamo dichiarato la funzione main come void main pubblico statico (String args[]). I significati dei termini sono menzionati di seguito:
- pubblico : il pubblico è il modificatore di accesso responsabile di menzionare chi può accedere all'elemento o al metodo e qual è il limite. È responsabile di rendere la funzione principale disponibile a livello globale. Viene reso pubblico in modo che JVM possa invocarlo dall'esterno della classe poiché non è presente nella classe corrente.
- statico : static è una parola chiave utilizzata in modo da poter utilizzare l'elemento senza avviare la classe in modo da evitare un'allocazione non necessaria della memoria.
- vuoto : void è una parola chiave e viene utilizzata per specificare che un metodo non restituisce nulla. Poiché la funzione main non restituisce nulla, utilizziamo void.
- principale : main rappresenta che la funzione dichiarata è la funzione principale. Aiuta JVM a identificare che la funzione dichiarata è la funzione principale.
- Argomenti stringa[] : Memorizza gli argomenti della riga di comando Java ed è un array di tipo classe java.lang.String.
10. Cos'è il pool di stringhe Java?
Un Java String Pool è uno spazio nella memoria heap in cui sono archiviate tutte le stringhe definite nel programma. Una posizione separata nello stack è quella in cui viene memorizzata la variabile che memorizza la stringa. Ogni volta che creiamo un nuovo oggetto stringa, JVM verifica la presenza dell'oggetto nel pool String, se String è disponibile nel pool, lo stesso riferimento all'oggetto viene condiviso con la variabile, altrimenti viene creato un nuovo oggetto.

Esempio:
String str1='Hello'; // 'Hello' will be stored in String Pool // str1 will be stored in stack memory>
11. Cosa accadrà se dichiariamo di non dichiarare il main come statico?
Possiamo dichiarare il metodo main senza utilizzare static e senza ottenere errori. Tuttavia, il metodo principale non verrà considerato come il punto di accesso all'applicazione o al programma.
12. Cosa sono i pacchetti in Java?
I pacchetti in Java possono essere definiti come il raggruppamento di tipi correlati di classi, interfacce, ecc. che forniscono accesso alla protezione e alla gestione dello spazio dei nomi.
13. Perché vengono utilizzati i pacchetti?
I pacchetti vengono utilizzati in Java per prevenire conflitti di denominazione, controllare l'accesso e facilitare la ricerca/localizzazione e l'utilizzo di classi, interfacce, ecc.
14. Quali sono i vantaggi dei pacchetti in Java?
Ci sono vari vantaggi nel definire i pacchetti in Java.
- I pacchetti evitano conflitti di nomi.
- Il pacchetto fornisce un controllo degli accessi più semplice.
- Possiamo anche avere le classi nascoste che non sono visibili all'esterno e vengono utilizzate dal pacchetto.
- È più semplice individuare le classi correlate.
15. Quanti tipi di pacchetti esistono in Java?
Esistono due tipi di pacchetti in Java
- Pacchetti definiti dall'utente
- Pacchetti integrati
16. Spiegare i diversi tipi di dati in Java.
Esistono 2 tipi di tipi di dati in Java come indicato di seguito:
- Tipo di dati primitivo
- Tipo di dati non primitivo o tipo di dati oggetto
Tipo di dati primitivi: i dati primitivi sono valori singoli senza funzionalità speciali. Esistono 8 tipi di dati primitivi:
- booleano : memorizza il valore vero o falso
- byte : memorizza un numero intero in complemento a due con segno a 8 bit
- car : memorizza un singolo carattere Unicode a 16 bit
- corto : memorizza un numero intero in complemento a due con segno a 16 bit
- int : memorizza un numero intero in complemento a due con segno a 32 bit
- lungo : memorizza un numero intero in complemento a due a 64 bit
- galleggiante : memorizza un valore in virgola mobile IEEE 754 a 32 bit a precisione singola
- Doppio : memorizza un valore in virgola mobile IEEE 754 a 64 bit a doppia precisione
Tipo di dati non primitivi: i tipi di dati di riferimento conterranno un indirizzo di memoria dei valori della variabile perché non è in grado di archiviare direttamente i valori nella memoria. I tipi di non primitivi sono menzionati di seguito:
- stringhe
- Vettore
- Classe
- Oggetto
- Interfaccia
17. Quando viene utilizzato un tipo di dati byte?
Un byte è un numero intero a due complementi con segno a 8 bit. Il valore minimo supportato dai byte è -128 e 127 è il valore massimo. Viene utilizzato in condizioni in cui è necessario risparmiare memoria e il limite dei numeri necessari è compreso tra -128 e 127.
18. Possiamo dichiarare Pointer in Java?
No, Java non fornisce il supporto di Pointer. Poiché Java doveva essere più sicuro perché la funzionalità del puntatore non è fornita in Java.
19. Qual è il valore predefinito del tipo di dati byte in Java?
Il valore predefinito del tipo di dati byte in Java è 0.
20. Qual è il valore predefinito di float e double datatype in Java?
Il valore predefinito di float è 0.0f e di double è 0.0d in Java.
21. Cos'è la classe Wrapper in Java?
Il wrapper, in generale, si riferisce a un'entità più grande che incapsula un'entità più piccola. Qui in Java, la classe wrapper è una classe di oggetti che incapsula i tipi di dati primitivi.
I tipi di dati primitivi sono quelli da cui potrebbero essere creati ulteriori tipi di dati. Ad esempio, gli interi possono ulteriormente portare alla costruzione di long, byte, short, ecc. D'altra parte, la stringa non può, quindi non è primitiva.
Tornando alla classe wrapper, Java contiene 8 classi wrapper. Sono Boolean, Byte, Short, Integer, Character, Long, Float e Double. Inoltre, in Java è possibile creare anche classi wrapper personalizzate, il che è simile al concetto di struttura nel linguaggio di programmazione C. Creiamo la nostra classe wrapper con i tipi di dati richiesti.
22. Perché abbiamo bisogno delle classi wrapper?
La classe wrapper è una classe di oggetti che incapsula i tipi di dati primitivi e ne abbiamo bisogno per i seguenti motivi:
- Le classi wrapper sono definitive e immutabili
- Fornisce metodi come valueOf(), parseInt(), ecc.
- Fornisce la funzionalità di autoboxing e unboxing.
23. Distinguere tra variabili di istanza e variabili locali.
Variabile di istanza | Variabile locale |
|---|---|
Dichiarato all'esterno del metodo, richiamato direttamente dal metodo. | Dichiarato all'interno del metodo. |
Ha un valore predefinito. | Nessun valore predefinito |
Può essere utilizzato durante tutta la lezione. | L'ambito è limitato al metodo. |
24. Quali sono i valori predefiniti assegnati alle variabili e alle istanze in Java?
In Java Quando non abbiamo inizializzato le variabili di istanza, il compilatore le inizializza con valori predefiniti. I valori predefiniti per istanze e variabili dipendono dai relativi tipi di dati. Alcuni tipi comuni di tipi di dati predefiniti sono:
- Il valore predefinito per i tipi numerici (byte, short, int, long, float e double) è 0.
- Il valore predefinito per il tipo booleano è false.
- Il valore predefinito per i tipi di oggetto (classi, interfacce e array) è null.
- Il carattere null, u0000, è il valore predefinito per il tipo char.
Esempio:
Giava // Java Program to demonstrate use of default values import java.io.*; class GFG { // static values static byte b; static int i; static long l; static short s; static boolean bool; static char c; static String str; static Object object; static float f; static double d; static int[] Arr; public static void main(String[] args) { // byte value System.out.println('byte value' + b); // short value System.out.println('short value' + s); // int value System.out.println('int value' + i); // long value System.out.println('long value' + l); System.out.println('boolean value' + bool); System.out.println('char value' + c); System.out.println('float value' + f); System.out.println('double value' + d); System.out.println('string value' + str); System.out.println('object value' + object); System.out.println('Array value' + Arr); } }> Produzione
byte value0 short value0 int value0 long value0 boolean valuefalse char value float value0.0 double value0.0 string valuenull object valuenull Array valuenull>
25. Cos'è una variabile di classe?
In Java, una variabile di classe (nota anche come variabile statica) è una variabile dichiarata all'interno di una classe ma all'esterno di qualsiasi metodo, costruttore o blocco. Le variabili di classe vengono dichiarate con la parola chiave static e sono condivise da tutte le istanze (oggetti) della classe nonché dalla classe stessa. Non importa quanti oggetti derivano da una classe, ciascuna variabile di classe esisterebbe solo una volta.
Esempio:
Giava // Java program to demonstrate use of Clas Variable class GFG { public static int ctr = 0; public GFG() { ctr++; } public static void main(String[] args) { GFG obj1 = new GFG(); GFG obj2 = new GFG(); GFG obj3 = new GFG(); System.out.println('Number of objects created are ' + GFG.ctr); } }> Produzione
Number of objects created are 3>
26. Qual è il valore predefinito memorizzato nelle variabili locali?
Non esiste un valore predefinito memorizzato con le variabili locali. Inoltre, le variabili e gli oggetti primitivi non hanno valori predefiniti.
27. Spiega la differenza tra variabile di istanza e variabile di classe.
Variabile di istanza: Una variabile di classe senza un modificatore statico noto come variabile di istanza è generalmente condivisa da tutte le istanze della classe. Queste variabili possono avere valori distinti tra diversi oggetti. Il contenuto di una variabile di istanza è completamente indipendente da un'istanza di oggetto a un'altra perché è correlato a un'istanza di oggetto specifica della classe.
Esempio:
Giava // Java Program to demonstrate Instance Variable import java.io.*; class GFG { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public static void main(String[] args) { GFG obj = new GFG(); obj.setName('John'); System.out.println('Name ' + obj.getName()); } }> Produzione
Name John>
Variabile di classe: La variabile Classe Variabile può essere dichiarata ovunque a livello di classe utilizzando la parola chiave static. Queste variabili possono avere un solo valore se applicate a vari oggetti. Queste variabili possono essere condivise da tutti i membri della classe poiché non sono collegate a nessun oggetto specifico della classe.
Esempio:
Giava // Java Program to demonstrate Class Variable import java.io.*; class GFG { // class variable private static final double PI = 3.14159; private double radius; public GFG(double radius) { this.radius = radius; } public double getArea() { return PI * radius * radius; } public static void main(String[] args) { GFG obj = new GFG(5.0); System.out.println('Area of circle: ' + obj.getArea()); } }> Produzione
Area of circle: 78.53975>
28. Cos'è una variabile statica?
La parola chiave static viene utilizzata per condividere la stessa variabile o metodo di una determinata classe. Le variabili statiche sono le variabili che una volta dichiarate, viene creata e condivisa una singola copia della variabile tra tutti gli oggetti a livello di classe.
29. Qual è la differenza tra System.out, System.err e System.in?
Sistema.out – È un PrintStream che viene utilizzato per scrivere caratteri o si può dire che può emettere i dati che vogliamo scrivere sulla console/terminale dell'interfaccia della riga di comando.
Esempio:
Giava // Java Program to implement // System.out import java.io.*; // Driver Class class GFG { // Main Function public static void main(String[] args) { // Use of System.out System.out.println(''); } }>
Errore di sistema – Viene utilizzato per visualizzare i messaggi di errore.
Esempio:
Giava // Java program to demonstrate // System.err import java.io.*; // Driver Class class GFG { // Main function public static void main(String[] args) { // Printing error System.err.println( 'This is how we throw error with System.err'); } }> Produzione:
This is how we throw error with System.err>
Sebbene System.err abbia molte somiglianze, entrambi hanno anche molte differenze, controlliamoli.
| Sistema.out | Errore.sistema |
|---|---|
Verrà stampato secondo lo standard fuori dal sistema. | Verrà stampato con l'errore standard. |
Viene utilizzato principalmente per visualizzare i risultati sulla console. | Viene utilizzato principalmente per emettere testi di errore. |
Fornisce l'output sulla console con il colore predefinito (nero). | Fornisce anche l'output sulla console, ma la maggior parte degli IDE gli dà un colore rosso per differenziarlo. |
Sistema.in – È un InputStream utilizzato per leggere l'input dalla finestra del terminale. Non possiamo utilizzare direttamente System.in, quindi utilizziamo la classe Scanner per ricevere input con system.in.
Esempio:
Giava // Java Program to demonstrate // System.in import java.util.*; // Driver Class class Main { // Main Function public static void main(String[] args) { // Scanner class with System.in Scanner sc = new Scanner(System.in); // Taking input from the user int x = sc.nextInt(); int y = sc.nextInt(); // Printing the output System.out.printf('Addition: %d', x + y); } }> Produzione:
3 4 Addition: 7>
30. Cosa intendi per flusso IO?

Java porta vari Stream con il suo pacchetto I/O che aiuta l'utente a eseguire tutte le operazioni di input-output. Questi flussi supportano tutti i tipi di oggetti, tipi di dati, caratteri, file, ecc. per eseguire completamente le operazioni di I/O.
31. Qual è la differenza tra la gerarchia delle classi Reader/Writer e la gerarchia delle classi InputStream/OutputStream?
La differenza fondamentale tra loro è che i dati del flusso di byte vengono letti e scritti dalle classi del flusso di input/output. I caratteri sono gestiti dalle classi Reader e Writer. A differenza delle classi Reader/Writer, che accettano matrici di caratteri come parametri, i metodi della classe del flusso di input/output accettano matrici di byte. Rispetto ai flussi di input/output, le classi Reader/Writer sono più efficienti, gestiscono tutti i caratteri Unicode e sono utili per l'internalizzazione. Utilizza le classi Reader/Writer invece dei dati binari, come le immagini, a meno che non lo faccia tu.
Esempio:
Giava // Java Program to demonstrate Reading Writing Binary Data // with InputStream/OutputStream import java.io.*; class GFG { public static void main(String[] args) { try { // Writing binary data to a file using OutputStream byte[] data = {(byte) 0xe0, 0x4f, (byte) 0xd0, 0x20, (byte) 0xea}; OutputStream os = new FileOutputStream('data.bin'); os.write(data); os.close(); // Reading binary data from a file using InputStream InputStream is = new FileInputStream('data.bin'); byte[] newData = new byte[5]; is.read(newData); is.close(); // Printing the read data for (byte b : newData) { System.out.println(b); } } catch (IOException e) { e.printStackTrace(); } } }> Produzione
-32 79 -48 32 -22>
32. Quali sono le classi super più numerose per tutti gli stream?
Tutte le classi di flusso possono essere divise in due tipi di classi che sono classi ByteStream e classi CharacterStream. Le classi ByteStream sono ulteriormente suddivise in classi InputStream e classi OutputStream. Le classi CharacterStream sono anche divise in classi Reader e classi Writer. Le classi SuperMost per tutte le classi InputStream sono java.io.InputStream e per tutte le classi del flusso di output è java.io.OutPutStream. Allo stesso modo, per tutte le classi di lettura, la classe super-most è java.io.Reader e per tutte le classi di scrittura è java.io.Writer.
33. Cosa sono FileInputStream e FileOutputStream?
Per leggere e scrivere dati, Java offre flussi I/O. Uno stream rappresenta una sorgente di input o una destinazione di output, che potrebbe essere un file, un dispositivo di i/o, un altro programma, ecc. FileInputStream in Java viene utilizzato per leggere i dati da un file come un flusso di byte. Viene utilizzato principalmente per leggere dati binari come immagini, file audio o oggetti serializzati.
Esempio:
File file = new File('path_of_the_file'); FileInputStream inputStream = new FileInputStream(file);>In Giava, il FileOutputStream la funzione viene utilizzata per scrivere dati byte per byte in un determinato file o descrittore di file. Di solito, i dati grezzi in byte, come le immagini, vengono scritti in un file utilizzando FileOutputStream.
Esempio:
File file = new File('path_of_the_file'); FileOutputStream outputStream = new FileOutputStream(file);>34. Qual è lo scopo dell'utilizzo delle classi BufferedInputStream e BufferedOutputStream?
Quando lavoriamo con i file o lo stream, per aumentare le prestazioni di Input/Output del programma dobbiamo utilizzare le classi BufferedInputStream e BufferedOutputStream. Entrambe le classi forniscono la capacità di buffering, il che significa che i dati verranno archiviati in un buffer prima di essere scritti su un file o leggerli da un flusso. Riduce inoltre il numero di volte in cui il nostro sistema operativo deve interagire con la rete o il disco. Il buffering consente ai programmi di scrivere una grande quantità di dati invece di scriverli in piccoli blocchi. Ciò riduce anche il sovraccarico di accesso alla rete o al disco.
BufferedInputStream(InputStream inp); // used to create the bufferinput stream and save the arguments.>
BufferedOutputStream(OutputStream output); // used to create a new buffer with the default size.>
35. Cosa sono i FilterStream?
Filtro flusso o Filtra flussi restituisce un flusso costituito dagli elementi di questo flusso che corrispondono al predicato specificato. Mentre funziona filter() in realtà non esegue il filtraggio ma crea invece un nuovo flusso che, una volta attraversato, contiene gli elementi dei flussi iniziali che corrispondono al predicato specificato.
Esempio:
FileInputStream fis =new FileInoutStream('file_path'); FilterInputStream = new BufferedInputStream(fis);>
36. Cos'è un filtro I/O?
Un filtro I/O definito anche come filtro Input Output è un oggetto che legge da un flusso e scrive dati su origini di input e output. Ha utilizzato il pacchetto java.io per utilizzare questo filtro.
cena vs ora di cena
37. In quanti modi puoi ricevere input dalla console?
Esistono due metodi per ricevere input dalla console in Java menzionati di seguito:
- Utilizzo dell'argomento della riga di comando
- Utilizzo della classe Reader bufferizzata
- Utilizzo della classe console
- Utilizzo della classe scanner
Di seguito è riportato il programma che dimostra l'uso di ciascun metodo.
Esempio:
Giava // Java Program to implement input // using Command line argument import java.io.*; class GFG { public static void main(String[] args) { // check if length of args array is // greater than 0 if (args.length > 0) { System.out.println( 'The command line arguments are:'); // iterating the args array and printing // the command line arguments for (String val : args) System.out.println(val); } else System.out.println('No command line ' + 'arguments found.'); } } // Use below commands to run the code // javac GFG.java // java Main techcodeview.com> Giava // Java Program to implement // Buffer Reader Class import java.io.*; class GFG { public static void main(String[] args) throws IOException { // Enter data using BufferReader BufferedReader read = new BufferedReader( new InputStreamReader(System.in)); // Reading data using readLine String x = read.readLine(); // Printing the read line System.out.println(x); } }> Giava // Java program to implement input // Using Console Class public class GfG { public static void main(String[] args) { // Using Console to input data from user String x = System.console().readLine(); System.out.println('You entered string ' + x); } }> Giava // Java program to demonstrate // working of Scanner in Java import java.util.Scanner; class GfG { public static void main(String args[]) { // Using Scanner for Getting Input from User Scanner in = new Scanner(System.in); String str = in.nextLine(); System.out.println('You entered string ' + str); } }> Produzione:
techcodeview.com>
38. Differenza nell'uso di print, println e printf.
print, println e printf vengono tutti utilizzati per stampare gli elementi ma print stampa tutti gli elementi e il cursore rimane sulla stessa riga. println sposta il cursore alla riga successiva. E con printf possiamo usare anche gli identificatori di formato.
39. Cosa sono gli operatori?
Gli operatori sono tipi speciali di simboli utilizzati per eseguire alcune operazioni su variabili e valori.
40. Quanti tipi di operatori sono disponibili in Java?
Tutti i tipi di operatori in Java sono menzionati di seguito:
- Operatori aritmetici
- Operatori unari
- Operatore di assegnazione
- Operatori relazionali
- Operatori logici
- Operatore ternario
- Operatori bit a bit
- Operatori di turno
- istanza di operatore
Gli operatori suffissi sono considerati come la precedenza più alta in base alla precedenza degli operatori Java.
41. Spiega la differenza tra gli operatori>> e>>>.
Operatori come>> e>>> sembrano essere gli stessi ma si comportano in modo leggermente diverso.>> l'operatore sposta i bit di segno e l'operatore>>> viene utilizzato per spostare i bit contenenti zeri.
Esempio:
Giava // Java Program to demostrate //>> e>>> operatori import java.io.*; // Classe driver GFG { public static void main(String[] args) { int a = -16, b = 1; // Utilizzo di>> System.out.println(a >> b); a = -17; b = 1; // Utilizzo di>>> System.out.println(a >>> b); } }> Produzione
-8 2147483639>
42. Quale operatore Java è associativo giusto?
C'è solo un operatore che è associativo giusto che è = operatore.
43. Cos'è l'operatore punto?
L'operatore Punto in Java viene utilizzato per accedere alle variabili di istanza e ai metodi degli oggetti di classe. Viene utilizzato anche per accedere alle classi e ai sottopacchetti dal pacchetto.
44. Cos'è il tipo di rendimento covariante?
Il tipo restituito covariante specifica che il tipo restituito può variare nella stessa direzione della sottoclasse. È possibile avere tipi restituiti diversi per un metodo di override nella classe figlia, ma il tipo restituito del figlio dovrebbe essere un sottotipo del tipo restituito del genitore e, a causa di tale metodo di override, diventa variante rispetto al tipo restituito.
Usiamo il tipo di ritorno covariante per i seguenti motivi:
- Evita i cast di tipi confusi presenti nella gerarchia delle classi e rende il codice leggibile, utilizzabile e gestibile.
- Dà la libertà di avere tipi di restituzione più specifici durante l'override dei metodi.
- Aiuta a prevenire ClassCastException in fase di esecuzione sui resi.
45. Qual è la parola chiave temporanea?
La parola chiave transitoria viene utilizzata al momento della serializzazione se non vogliamo salvare il valore di una particolare variabile in un file. Quando JVM incontra una parola chiave temporanea, ignora il valore originale della variabile e salva il valore predefinito di quel tipo di dati variabile.
46. Qual è la differenza tra i metodi sleep() e wait()?
Sonno() | Aspettare() |
|---|---|
Il metodo sleep() appartiene alla classe thread. | Il metodo Wait() appartiene alla classe dell'oggetto. |
La modalità di sospensione non rilascia il blocco mantenuto dal thread corrente. | wait() rilascia il blocco che consente ad altri thread di acquisirlo. |
Questo metodo è un metodo statico. | Questo metodo non è un metodo statico. |
| Sleep() non genera un'InterruptedException. | InterruptedException viene visualizzato se il thread viene interrotto durante l'attesa. |
Utilizzato principalmente per ritardare un thread per una durata di tempo specifica. | Utilizzato principalmente per mettere in pausa un thread finché non viene notificato da un altro thread. |
Sleep() ha due metodi di sovraccarico:
| Wait() ha tre metodi di sovraccarico:
|
47. Quali sono le differenze tra String e StringBuffer?
Corda | StringBuffer |
|---|---|
| Memorizzazione di una sequenza di caratteri. | Fornisce funzionalità per lavorare con le stringhe. |
| È immutabile. | È mutabile (può essere modificato e su di esso possono essere eseguite altre operazioni sulle stringhe). |
| Nessuna operazione di thread in una stringa. | È thread-safe (due thread non possono chiamare contemporaneamente i metodi di StringBuffer) |
48. Quali sono le differenze tra StringBuffer e StringBuilder?
StringBuffer | StringBuilder |
|---|---|
| StringBuffer fornisce funzionalità per lavorare con le stringhe. | StringBuilder è una classe utilizzata per creare una stringa mutabile. |
| È thread-safe (due thread non possono chiamare contemporaneamente i metodi di StringBuffer) | Non è thread-safe (due thread possono chiamare i metodi contemporaneamente) |
| Relativamente lento poiché è sincronizzato. | Essendo non sincronizzato, l'implementazione è più rapida |
49. Quale tra String o String Buffer dovrebbe essere preferito quando sono necessari molti aggiornamenti da eseguire nei dati?
La stringa è preferita rispetto a StringBuffer poiché StringBuilder è più veloce di StringBuffer, ma gli oggetti StringBuffer sono preferiti in quanto forniscono maggiore sicurezza del thread.
50. Perché StringBuffer è chiamato mutabile?
La classe StringBuffer in Java viene utilizzata per rappresentare una stringa di caratteri modificabile. Offre un'alternativa alla classe String immutabile consentendo di modificare il contenuto di una stringa senza creare costantemente nuovi oggetti. Le stringhe mutabili (modificabili) vengono create con l'aiuto della classe StringBuffer. La classe StringBuffer in Java è identica alla classe String tranne per il fatto che è modificabile.
Esempio:
Giava // Java Program to demonstrate use of stringbuffer public class StringBufferExample { public static void main(String[] args) { StringBuffer s = new StringBuffer(); s.append('Geeks'); s.append('for'); s.append('Geeks'); String message = s.toString(); System.out.println(message); } }> Produzione
techcodeview.com>
51. In che modo la creazione di una stringa utilizzando new() è diversa da quella di un valore letterale?
La stringa che utilizza new() è diversa dal letterale poiché quando dichiariamo string memorizza gli elementi all'interno della memoria dello stack mentre quando viene dichiarata utilizzando new() alloca una memoria dinamica nella memoria heap. L'oggetto viene creato nella memoria heap anche se è presente lo stesso oggetto contenuto.
Sintassi:
String x = new String('ABC');>

52. Cos'è un array in Java?
Un array in Java è una struttura dati utilizzata per memorizzare una sequenza di elementi dello stesso tipo di dimensione fissa. È possibile accedere agli elementi di un array tramite il loro indice, che inizia da 0 e arriva fino a una lunghezza pari a meno 1. La dichiarazione dell'array in Java viene eseguita con l'aiuto di parentesi quadre e durante la dichiarazione viene specificata anche la dimensione.
Sintassi:
int[] Arr = new int[5];>
53. Su quali array di memoria vengono creati in Java?
Gli array in Java vengono creati nella memoria heap. Quando viene creato un array con l'aiuto di una nuova parola chiave, la memoria viene allocata nell'heap per archiviare gli elementi dell'array. In Java, la memoria heap è gestita dalla Java Virtual Machine (JVM) ed è anche condivisa tra tutti i thread del programma Java. La memoria che non è più utilizzata dal programma, JVM utilizza un garbage collector per recuperare la memoria. Gli array in Java vengono creati dinamicamente, il che significa che la dimensione dell'array viene determinata durante il runtime del programma. La dimensione dell'array viene specificata durante la dichiarazione dell'array e non può essere modificata una volta creato l'array.
54. Quali sono i tipi di un array?
Esistono due tipi di array, ovvero array primitivi e array di riferimenti.
- Array monodimensionali: Gli array che hanno una sola dimensione, ovvero un array di numeri interi o un array di stringhe, sono noti come array unidimensionali.

Sintassi:
data_type[] Array_Name = new data_type[ArraySize];>
- Array multidimensionali: Matrici che hanno due o più dimensioni come matrici bidimensionali o tridimensionali.
55. Perché l'indice dell'array Java inizia con 0?
L'indice di un array indica la distanza dall'inizio dell'array. Quindi, il primo elemento ha distanza 0 quindi l'indice iniziale è 0.
Sintassi:
[Base Address + (index * no_of_bytes)]>
56. Qual è la differenza tra int array[] e int[] array?
Sia int array[] che int[] array vengono utilizzati per dichiarare un array di numeri interi in Java. L'unica differenza tra loro è che nella loro sintassi non è presente alcuna differenza di funzionalità tra loro.
int arr[] is a C-Style syntax to declare an Array.>
int[] arr is a Java-Style syntax to declare an Array.>
Tuttavia, in genere è consigliabile utilizzare la sintassi in stile Java per dichiarare un Array. Poiché è facile da leggere e comprendere, è anche più coerente con altri costrutti del linguaggio Java.
57. Come copiare un array in Java?
In Java esistono diversi modi per copiare un array in base ai requisiti.
- metodo clone() in Java: Questo metodo in Java viene utilizzato per creare una copia superficiale dell'array specificato, il che significa che il nuovo array condividerà la stessa memoria dell'array originale.
int[] Arr = { 1, 2, 3, 5, 0}; int[] tempArr = Arr.clone();>- metodo arraycopy(): Per creare una copia profonda dell'array possiamo utilizzare questo metodo che crea un nuovo array con gli stessi valori dell'array originale.
int[] Arr = {1, 2, 7, 9, 8}; int[] tempArr = new int[Arr.length]; System.arraycopy(Arr, 0, tempArr, 0, Arr.length);>- metodo copyOf(): Questo metodo viene utilizzato per creare un nuovo array con una lunghezza specifica e copia il contenuto dell'array originale nel nuovo array.
int[] Arr = {1, 2, 4, 8}; int[] tempArr = Arrays.copyOf(Arr, Arr.length);>- metodo copyOfRange(): Questo metodo è molto simile al metodo copyOf() in Java, ma questo metodo permette anche di specificare l'intervallo degli elementi da copiare dall'array originale.
int[] Arr = {1, 2, 4, 8}; int[] temArr = Arrays.copyOfRange(Arr, 0, Arr.length);>58. Cosa intendi per array frastagliato?
Un array frastagliato in Java è semplicemente un array bidimensionale in cui ciascuna riga dell'array può avere una lunghezza diversa. Poiché tutte le righe in una matrice 2-d hanno la stessa lunghezza, una matrice frastagliata consente una maggiore flessibilità nella dimensione di ciascuna riga. Questa funzionalità è molto utile in condizioni in cui i dati hanno lunghezze variabili o quando è necessario ottimizzare l'utilizzo della memoria.
Sintassi:
int[][] Arr = new int[][] { {1, 2, 8}, {7, 5}, {6, 7, 2, 6} };>59. È possibile rendere volatile un array?
In Java non è possibile creare un file volatile. Le parole chiave volatili in Java possono essere applicate solo a variabili individuali ma non ad array o raccolte. Il valore della variabile viene sempre letto e scritto nella memoria principale quando è definito come volatile anziché essere memorizzato nella cache nella memoria locale di un thread. Ciò rende più semplice assicurarsi che tutti i thread che accedono alla variabile possano vedere le modifiche apportate ad essa.
60. Quali sono i vantaggi e gli svantaggi di un array?

I vantaggi degli Array sono:
- L'accesso diretto ed efficace a qualsiasi elemento della raccolta è reso possibile dagli array. È possibile accedere agli elementi di un array utilizzando un’operazione O(1), il che significa che la quantità di tempo necessaria per farlo è costante e indipendente dalla dimensione dell’array.
- I dati possono essere archiviati in modo efficace in memoria utilizzando gli array. La dimensione di un array è nota in fase di compilazione poiché i suoi elementi sono archiviati in regioni di memoria contigue.
- Dato che i dati vengono archiviati in aree di memoria contigue, gli array consentono un rapido recupero dei dati.
- Gli array sono facili da implementare e comprendere, il che li rende la scelta ideale per i principianti che imparano a programmare.
Gli svantaggi degli array sono:
- Gli array vengono creati con una dimensione predeterminata che viene scelta in quel momento. Ciò significa che se è necessario estendere la dimensione dell'array, sarà necessario creare un nuovo array e copiare i dati dal vecchio array al nuovo, il che può richiedere molto tempo e memoria.
- Potrebbe esserci spazio di memoria inutilizzato nello spazio di memoria di un array se l'array non è completamente occupato. Se hai una memoria scarsa, questo può essere un problema.
- Rispetto ad altre strutture dati come elenchi collegati e alberi, gli array potrebbero essere rigidi a causa della loro dimensione fissa e del supporto limitato per tipi di dati sofisticati.
- Poiché gli elementi di un array devono essere tutti dello stesso tipo di dati, non supporta tipi di dati complessi come oggetti e strutture.
61. Cos'è un paradigma orientato agli oggetti?
Paradigma significa letteralmente un modello o un metodo. I paradigmi di programmazione sono i metodi per risolvere un programma di quattro tipi: imperativo, logico, funzionale e orientato agli oggetti. Quando gli oggetti vengono utilizzati come entità di base su cui vengono applicati i metodi, vengono eseguite funzionalità di incapsulamento o ereditarietà, è noto come paradigma orientato agli oggetti.
62. Quali sono i concetti principali degli OOP in Java?
I concetti principali degli OOP in Java sono menzionati di seguito:
- Eredità
- Polimorfismo
- Astrazione
- Incapsulamento
63. Qual è la differenza tra un linguaggio di programmazione orientato agli oggetti e un linguaggio di programmazione basato sugli oggetti?
Linguaggio di programmazione orientato agli oggetti | Linguaggio di programmazione basato su oggetti |
|---|---|
| Il linguaggio di programmazione orientato agli oggetti copre concetti più ampi come ereditarietà, polimorfismo, astrazione, ecc. | L'ambito della programmazione basata su oggetti è limitato all'uso di oggetti e all'incapsulamento. |
| Supporta tutti gli oggetti integrati | Non supporta tutti gli oggetti integrati |
| Esempi: Java, C#, ecc. | Esempi: script Java, nozioni di base visive, ecc. |
64. In che modo l'operatore 'new' è diverso dall'operatore 'newInstance()' in Java?
l'operatore new viene utilizzato per creare oggetti, ma se vogliamo decidere il tipo di oggetto da creare in fase di runtime, non è possibile utilizzare l'operatore new. In questo caso dobbiamo utilizzare il file metodo newInstance() .
65. Cosa sono le classi in Java?
In Java, le classi sono la raccolta di oggetti che condividono caratteristiche e attributi simili. Le classi rappresentano il progetto o il modello da cui vengono creati gli oggetti. Le classi non sono entità del mondo reale ma ci aiutano a creare oggetti che sono entità del mondo reale.
66. Qual è la differenza tra metodo statico (classe) e metodo di istanza?
Metodo statico (classe). | Metodo di istanza |
|---|---|
Il metodo statico è associato a una classe anziché a un oggetto. | Il metodo di istanza è associato a un oggetto anziché a una classe. |
I metodi statici possono essere chiamati utilizzando solo il nome della classe senza creare un'istanza di una classe. | Il metodo di istanza può essere chiamato su un'istanza specifica di una classe utilizzando il riferimento all'oggetto. |
I metodi statici non hanno accesso a Questo parola chiave . | I metodi di istanza hanno accesso a Questo parola chiave . |
Questo metodo può accedere solo ai membri statici della classe | Questo metodo può accedere sia ai metodi statici che non statici della classe. |
67. Cos'è questa parola chiave in Java?

'this' è una parola chiave utilizzata per fare riferimento a una variabile che si riferisce all'oggetto corrente.
68. Cosa sono gli specificatori di accesso brevi e i tipi di specificatori di accesso?

Gli specificatori di accesso in Java aiutano a limitare l'ambito di una classe, costruttore, variabile, metodo o membro dati. Esistono quattro tipi di specificatori di accesso in Java menzionati di seguito:
- Pubblico
- Privato
- Protetto
- Predefinito
69. Quale sarà il valore iniziale di un riferimento a un oggetto definito come variabile di istanza?
Il valore iniziale di un riferimento a un oggetto definito come variabile di istanza è un valore NULL.
70. Cos'è un oggetto?
L'oggetto è un'entità della vita reale a cui sono associati determinate proprietà e metodi. L'oggetto è anche definito come l'istanza di una classe. Un oggetto può essere dichiarato utilizzando una nuova parola chiave.
71. Quali sono i diversi modi per creare oggetti in Java?
I metodi per creare oggetti in Java sono menzionati di seguito:
- Utilizzando una nuova parola chiave
- Utilizzo della nuova istanza
- Utilizzando il metodo clone()
- Utilizzando la deserializzazione
- Utilizzando il metodo newInstance() della classe Constructor
Per saperne di più sui metodi per creare oggetti in Java fare riferimento a Questo articolo .
72. Quali sono i vantaggi e gli svantaggi della clonazione degli oggetti?
Ci sono molti vantaggi e svantaggi nell'usare la clonazione degli oggetti, come menzionato di seguito:
Vantaggi:
- In Java, l'operatore di assegnazione '=' non può essere utilizzato per la clonazione poiché crea semplicemente una copia delle variabili di riferimento. Per superare tale discrepanza è possibile utilizzare il metodo clone() della classe Object sull'operatore di assegnazione.
- Il metodo clone() è un metodo protetto della classe Object, il che significa che solo la classe Employee può clonare gli oggetti Employee. Ciò significa che nessuna classe diversa da Employee può clonare gli oggetti Employee poiché non conosce gli attributi della classe Employee.
- La dimensione del codice diminuisce al diminuire della ripetizione.
- Consente la replica (una sorta di modello prototipo) inizializzando manualmente ciascun campo crea codice di grandi dimensioni se l'oggetto è complesso, è più veloce con la clonazione.
Svantaggi:
- Poiché il metodo Object.clone() è protetto, è necessario fornire il nostro clone() e richiamare indirettamente Object.clone() da esso.
- Se non disponiamo di alcun metodo, dobbiamo fornire un'interfaccia clonabile poiché dobbiamo fornire informazioni JVM in modo da poter eseguire un clone() sul nostro oggetto. In caso contrario, non possiamo clonare clone esegue una copia superficiale dei campi se lo facciamo basta restituire super.clone() dal metodo clone che può essere problematico.
73. Quali sono i vantaggi di passarlo in un metodo invece che nell'oggetto classe corrente stesso?
Ci sono alcuni vantaggi nel passarlo in un metodo invece che nell'oggetto classe corrente stesso, questi sono:
- questa è la variabile finale per cui non può essere assegnata ad alcun nuovo valore mentre l'oggetto della classe corrente potrebbe non essere finale e può essere modificato.
- questo può essere utilizzato nel blocco sincronizzato.
74. Qual è il costruttore?
Il costruttore è un metodo speciale utilizzato per inizializzare gli oggetti. Il costruttore viene chiamato quando viene creato un oggetto. Il nome del costruttore è lo stesso della classe.
Esempio:
// Class Created class XYZ{ private int val; // Constructor XYZ(){ val=0; } };>75. Cosa succede se non fornisci un costruttore in una classe?
Se non fornisci un costruttore in una classe in Java, il compilatore genera automaticamente un costruttore predefinito senza argomenti e senza operazioni che è un costruttore predefinito.
76. Quanti tipi di costruttori vengono utilizzati in Java?
Esistono due tipi di costruttori in Java come menzionato di seguito:
- Costruttore predefinito
- Costruttore parametrizzato
Costruttore predefinito: è il tipo che non accetta alcun valore di parametro. Viene utilizzato per impostare i valori iniziali per gli attributi dell'oggetto.
class_Name(); // Default constructor called>
Costruttore con parametri: è il tipo di costruttore che accetta parametri come argomenti. Questi vengono utilizzati per assegnare valori alle variabili di istanza durante l'inizializzazione degli oggetti.
class_Name(parameter1, parameter2......); // All the values passed as parameter will be // allocated accordingly>
77. Qual è lo scopo di un costruttore predefinito?
I costruttori aiutano a creare istanze di una classe o si può dire che creino oggetti di una classe. Il costruttore viene chiamato durante l'inizializzazione degli oggetti. Un costruttore predefinito è un tipo di costruttore che non accetta alcun parametro, quindi qualunque valore venga assegnato alle proprietà degli oggetti è considerato valore predefinito.
78. Cosa intendi per costruttore di copie in Java?
Il costruttore di copie è il tipo di costruttore in cui passiamo un altro oggetto come parametro perché le proprietà di entrambi gli oggetti sembrano le stesse, ecco perché sembra che i costruttori creino una copia di un oggetto.
79. Dove e come puoi utilizzare un costruttore privato?
Un costruttore privato viene utilizzato se non si desidera che nessun'altra classe istanzia l'oggetto per evitare la creazione di sottoclassi. Il costruttore use private può essere visto come implementato nell'esempio.
Esempio:
Giava // Java program to demonstrate implementation of Singleton // pattern using private constructors. import java.io.*; class GFG { static GFG instance = null; public int x = 10; // private constructor can't be accessed outside the // class private GFG() {} // Factory method to provide the users with instances static public GFG getInstance() { if (instance == null) instance = new GFG(); return instance; } } // Driver Class class Main { public static void main(String args[]) { GFG a = GFG.getInstance(); GFG b = GFG.getInstance(); a.x = a.x + 10; System.out.println('Value of a.x = ' + a.x); System.out.println('Value of b.x = ' + b.x); } }> Produzione
Value of a.x = 20 Value of b.x = 20>
80. Quali sono le differenze tra costruttori e metodi?
I costruttori Java vengono utilizzati per inizializzare gli oggetti. Durante la creazione, i costruttori vengono chiamati per impostare gli attributi per gli oggetti oltre a queste poche differenze fondamentali tra loro:
- I costruttori vengono chiamati solo quando viene creato l'oggetto, ma altri metodi possono essere chiamati più volte durante la vita di un oggetto.
- I costruttori non restituiscono nulla, mentre altri metodi possono restituire qualsiasi cosa.
- I costruttori vengono utilizzati per impostare lo stato iniziale, ma i metodi vengono utilizzati per eseguire azioni specifiche.
81. Cos'è un'interfaccia?
Un'interfaccia in Java è una raccolta di variabili finali statiche e metodi astratti che definiscono il contratto o l'accordo per un insieme di classi collegate. Qualsiasi classe che implementa un'interfaccia deve implementare un insieme specifico di metodi. Specifica il comportamento che una classe deve esibire ma non le specifiche di come dovrebbe essere implementata.
Sintassi:
interface { // constant fields // methds that are abstract by default }>Esempio:
Giava // Java Program to demonstrate Interface import java.io.*; interface Shape { double getArea(); double getPerimeter(); } class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } public double getArea() { return Math.PI * radius * radius; } public double getPerimeter() { return 2 * Math.PI * radius; } } class GFG { public static void main(String[] args) { Circle circle = new Circle(5.0); System.out.println('Area of circle is ' + circle.getArea()); System.out.println('Perimeter of circle is' + circle.getPerimeter()); } }> Produzione
Area of circle is 78.53981633974483 Perimeter of circle is31.41592653589793>
82. Fornire alcune caratteristiche dell'interfaccia.
Un'interfaccia nel linguaggio di programmazione Java è definita come un tipo astratto utilizzato per specificare il comportamento di una classe. Un'interfaccia in Java è un modello di comportamento. Un'interfaccia Java contiene costanti statiche e metodi astratti.
Le caratteristiche dell'interfaccia sono menzionate di seguito:
- L'interfaccia può aiutare a raggiungere l'astrazione totale.
- Ci consente di utilizzare più eredità in Java.
- Qualsiasi classe può implementare più interfacce anche quando una classe può estendere solo una classe.
- Viene utilizzato anche per ottenere un accoppiamento lasco.
83. Cos'è un'interfaccia marcatore?
Un'interfaccia è riconosciuta come un'interfaccia vuota (senza campo o metodi), è chiamata interfaccia marcatore. Esempi di interfacce marcatore sono le interfacce serializzabile, clonabile e remota.
84. Quali sono le differenze tra classe astratta e interfaccia?

Classe astratta | Classe di interfaccia |
|---|---|
Sia i metodi astratti che quelli non astratti possono essere trovati in una classe astratta. | L'interfaccia contiene solo metodi astratti. |
La classe astratta supporta i metodi finali. | La classe dell'interfaccia non supporta i metodi Final. |
L'ereditarietà multipla non è supportata dalla classe Abstract. | Le eredità multiple sono supportate dalla classe di interfaccia. |
La parola chiave astratta viene utilizzata per dichiarare la classe astratta. | La parola chiave dell'interfaccia viene utilizzata per dichiarare la classe dell'interfaccia. |
| estendere la parola chiave viene utilizzata per estendere una classe astratta. | implementa La parola chiave viene utilizzata per implementare l'interfaccia. |
La classe astratta ha membri come protetto, privato, ecc. | Tutti i membri della classe sono pubblici per impostazione predefinita. |
85. Cosa intendi per incapsulamento dei dati?

L'incapsulamento dei dati è il concetto di proprietà OOPS e caratteristiche delle classi che l'interfaccia è collegata insieme. Fondamentalmente, raggruppa dati e metodi che operano su tali dati all'interno di una singola unità. L'incapsulamento si ottiene dichiarando le variabili di istanza di una classe come private, il che significa che è possibile accedervi solo all'interno della classe.
86. Quali sono i vantaggi dell'incapsulamento in Java?
I vantaggi dell'incapsulamento in Java sono menzionati di seguito:
- Data Hiding: è un modo per limitare l'accesso dei nostri dati membri nascondendo i dettagli di implementazione. L'incapsulamento fornisce anche un modo per nascondere i dati. L'utente non avrà idea dell'implementazione interna della classe.
- Maggiore flessibilità: possiamo rendere le variabili della classe di sola lettura o di sola scrittura a seconda delle nostre esigenze.
- Riutilizzabilità: l'incapsulamento migliora anche la riutilizzabilità ed è facile da modificare con nuovi requisiti.
- Testare il codice è semplice: il codice è reso semplice da testare per i test unitari.
87. Qual è il vantaggio principale dell'incapsulamento?
Il vantaggio principale dell'incapsulamento in Java è la sua capacità di proteggere lo stato interno di un oggetto da modifiche o accessi esterni. È un modo per nascondere i dettagli di implementazione di una classe all'accesso esterno ed esporre solo un'interfaccia pubblica che può essere utilizzata per interagire con la classe. Il vantaggio principale è quello di fornire un modo per controllare e gestire lo stato e il comportamento di un oggetto e allo stesso tempo proteggerlo da modifiche e accessi non autorizzati.
Esempio:
Giava // Java Program to demonstrate use of Encapsulation import java.io.*; class Person { private String Name; private int age; public String getName() { return Name; } public void setName(String Name) { this.Name = Name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // Driver class class GFG { // main function public static void main(String[] args) { Person p = new Person(); p.setName('Rohan'); p.setAge(29); System.out.println('Name is ' + p.getName()); System.out.println('Age is ' + p.getAge()); } }> Produzione
Name is Rohan Age is 29>
88. Cosa intendi per aggregazione?

L'aggregazione è un termine relativo alla relazione tra due classi meglio descritta come una relazione ha-a. Questo tipo è la versione più specializzata dell'associazione. È un'associazione unidirezionale significa che è una relazione unidirezionale. Contiene il riferimento a un'altra classe e si dice che abbia la proprietà di quella classe.
89. Qual è la relazione 'IS-A' in OOPs Java?
'IS-A' è un tipo di relazione in Java OOP in cui una classe eredita un'altra classe.
90. Definire l'ereditarietà.
Quando un oggetto che appartiene a una sottoclasse acquisisce tutte le proprietà e il comportamento di un oggetto genitore che appartiene alla superclasse, si parla di ereditarietà. Una classe all'interno di una classe è chiamata sottoclasse e quest'ultima è chiamata superclasse. Si dice che la sottoclasse o la classe figlia sia specifica mentre la superclasse o la classe genitore è generica. L'ereditarietà fornisce la riusabilità del codice.
91. Quali sono i diversi tipi di ereditarietà in Java?
L'ereditarietà è il metodo con cui la classe Child può ereditare le funzionalità della classe Super o Parent. In Java, l'ereditarietà è di quattro tipi:
- Eredità singola: Quando una figlia o una sottoclasse estende solo una superclasse, si parla di ereditarietà singola. Le proprietà della classe genitore singolo vengono passate alla classe figlia.
- Eredità multilivello: Quando un figlio o una sottoclasse estende qualsiasi altra sottoclasse viene creata una gerarchia di ereditarietà nota come ereditarietà multilivello. In altre parole, una sottoclasse diventa la classe genitore di un’altra.
- Eredità gerarchica: Quando più sottoclassi derivano dalla stessa classe genitore è nota come ereditarietà gerarchica. In altre parole, una classe che ha un unico genitore ha molte sottoclassi.
- Eredità multipla: Quando una classe figlia eredita da più classi genitori è nota come eredità multipla. In Java supporta solo l'ereditarietà multipla delle interfacce, non delle classi.
92. Cos'è l'ereditarietà multipla? È supportato da Java?
Una componente della nozione orientata agli oggetti nota come eredità multiple consente a una classe di ereditare proprietà da molte classi madri. Quando metodi con la stessa firma sono presenti sia nelle superclassi che nelle sottoclassi, sorge un problema. Il chiamante del metodo non può specificare al compilatore quale metodo di classe dovrebbe essere chiamato o anche a quale metodo di classe dovrebbe essere data la precedenza.
Nota: Java non supporta l'ereditarietà multipla
Esempio:
Giava // Java Program to show multiple Inheritance import java.io.*; interface Animal { void eat(); } interface Mammal { void drink(); } class Dog implements Animal, Mammal { public void eat() { System.out.println('Eating'); } public void drink() { System.out.println('Drinking'); } void bark() { System.out.println('Barking'); } } class GFG { public static void main(String[] args) { Dog d = new Dog(); d.eat(); d.drink(); d.bark(); } }> Produzione
Eating Drinking Barking>
93. In che modo l'ereditarietà in C++ è diversa da Java?
Ereditarietà in C++ | Eredità in Java |
|---|---|
| C++ consente all'utente di ereditare più classi. | Java non supporta eredità multiple. |
| Quando una classe viene creata in C++, non eredita dalla classe oggetto, ma esiste da sola. | Si dice sempre che Java abbia un'unica eredità poiché tutte le classi ereditano in un modo o nell'altro dalla classe dell'oggetto. |
94. Esistono limitazioni all'uso dell'ereditarietà?
Sì, esiste una limitazione nell'utilizzo dell'ereditarietà in Java, poiché a causa dell'ereditarietà è possibile ereditare tutto dalla superclasse e dall'interfaccia a causa della quale la sottoclasse è troppo raggruppata e talvolta soggetta a errori quando viene eseguito l'override dinamico o l'overload dinamico in determinate situazioni.
95. Sebbene l’ereditarietà sia un concetto popolare di OOP, è meno vantaggioso della composizione. Spiegare.
L'ereditarietà è un concetto popolare della programmazione orientata agli oggetti (OOP), in cui una classe può ereditare le proprietà e i metodi da qualsiasi altra classe, denominata genitore o superclasse. D'altra parte in Composition, una classe può contenere un'istanza di un'altra classe come variabile membro a cui spesso ci si riferisce come parte o componente. Di seguito sono riportati alcuni motivi per cui la composizione è più vantaggiosa dell'ereditarietà:
- Accoppiamento stretto: Ogni volta che vengono apportate modifiche alla superclasse, queste modifiche possono influenzare il comportamento di tutti i suoi figli o sottoclassi. Questo problema rende il codice meno flessibile e crea anche problemi durante la manutenzione. Questo problema porta anche allo stretto accoppiamento tra le classi.
- Problema della classe base fragile: Quando le modifiche alla classe base possono interrompere la funzionalità delle sue classi derivate. Questo problema può rendere difficile l'aggiunta di nuove funzionalità o la modifica di quelle esistenti. Questo problema è noto come problema della classe Fragile Base.
- Riutilizzo limitato: L'ereditarietà in Java può portare a un riutilizzo limitato del codice e anche alla duplicazione del codice. Poiché una sottoclasse eredita tutte le proprietà e i metodi della sua superclasse, a volte potrebbe ritrovarsi con codice non necessario che non è necessario. Ciò porta a una base di codice meno gestibile.
96. Cos'è un'associazione?
L'associazione è una relazione tra due classi separate stabilita attraverso i loro Oggetti. Rappresenta la relazione di Has-A.
97. Cosa intendi per aggregazione?
La composizione è una forma ristretta di aggregazione in cui due entità sono fortemente dipendenti l'una dall'altra. Rappresenta parte di il rapporto.
98. Qual è la composizione di Java?
La composizione implica una relazione in cui il bambino non può esistere indipendentemente del genitore. Ad esempio il cuore umano, il cuore non esiste separatamente da un essere umano.
99. Dichiara la differenza tra Composizione e Aggregazione.
Aggregazione | Composizione |
|---|---|
Definisce una relazione tra gli oggetti | Rappresenta la parte della relazione |
Gli oggetti sono indipendenti l'uno dall'altro. | Gli oggetti dipendono gli uni dagli altri. |
Rappresentatelo utilizzando il diamante pieno. | Rappresentatelo utilizzando il diamante vuoto. |
Gli oggetti secondari non hanno una vita. | Gli oggetti secondari hanno una vita. |
100. Il costruttore può essere ereditato?
No, non possiamo ereditare un costruttore.
101. Cos'è il polimorfismo?
Il polimorfismo è definito come la capacità di assumere più di una forma. È di due tipi, vale a dire polimorfismo in fase di compilazione o sovraccarico del metodo, una funzione chiamata durante la fase di compilazione. Ad esempio, prendi una classe 'area'. In base al numero di parametri può calcolare l'area di un quadrato, triangolo o cerchio. Polimorfismo in fase di esecuzione o override del metodo: collegamenti durante l'esecuzione. Il metodo all'interno di una classe sovrascrive il metodo della classe genitore.
102. Cos'è il polimorfismo di runtime o l'invio di metodi dinamici?
L'invio dinamico del metodo è un meccanismo di risoluzione per l'override del metodo durante il runtime. L'override del metodo è quello in cui il metodo in una sottoclasse ha lo stesso nome, parametri e tipo restituito di un metodo nella superclasse. Quando il metodo sovrascritto viene chiamato tramite un riferimento alla superclasse, Java determina quale versione (superclasse o sottoclasse) di quel metodo deve essere eseguita in base al tipo di oggetto a cui si fa riferimento nel momento in cui avviene la chiamata. Pertanto la decisione viene presa in fase di esecuzione. Questo è indicato come invio del metodo dinamico.
103. Cos'è il metodo prevalente?
L'override del metodo, noto anche come polimorfismo in fase di esecuzione, è quello in cui la classe figlia contiene lo stesso metodo della classe genitore. Ad esempio, abbiamo un metodo chiamato 'gfg()' nella classe genitore. Nella sottoclasse è nuovamente definito un metodo gfg(). Pertanto, quando gfg() viene chiamato nella sottoclasse, il metodo all'interno della classe viene eseguito. Qui, gfg() all'interno della classe ha sovrascritto il metodo all'esterno.
104. Cos'è l'overloading del metodo?

L'override del metodo è un metodo per ottenere il polimorfismo runtime in Java. L'override del metodo è una funzionalità che consente a una classe figlia di fornire un'implementazione specifica di un metodo già fornito da una delle sue classi genitori. Quando un metodo in una classe figlia ha lo stesso nome, gli stessi parametri o firma e lo stesso tipo restituito (o sottotipo) di un metodo nella sua classe genitore, si dice che il metodo nella sottoclasse sovrascrive il metodo in la superclasse.
105. Possiamo sovrascrivere il metodo statico?
No, poiché i metodi statici fanno parte della classe anziché dell'oggetto, quindi non possiamo sovrascriverli.
106. Possiamo sovrascrivere il metodo sovraccaricato?
Sì, poiché il metodo sovraccaricato è un metodo completamente diverso agli occhi del compilatore. L’override non è affatto la stessa cosa. La decisione su quale metodo chiamare è rinviata al runtime.
107. Possiamo sovraccaricare il metodo main()?
Sì, in Java possiamo sovraccaricare il metodo main per chiamarlo con l'aiuto del suo metodo di chiamata predefinito.
108. Cosa sono l'overloading e l'override del metodo?
Sovraccarico del metodo: È noto anche come polimorfismo in fase di compilazione. Nell'overload dei metodi due o più metodi sono condivisi nella stessa classe con una firma diversa.
Esempio:
Giava // Java Program to demonstrate use of Method Overloading import java.io.*; class GFG { static int multiply(int a, int b) { return a * b; } static int multiply(int a, int b, int c) { return a * b * c; } static int multiply(int a, int b, int c, int d) { return a * b * c * d; } public static void main(String[] args) { System.out.println('multiply() with 2 parameters'); System.out.println(multiply(4, 5)); System.out.println('multiply() with 3 parameters'); System.out.println(multiply(2, 3, 4)); System.out.println('multiply() with 4 parameters'); System.out.println(multiply(2, 3, 4, 1)); } }> Produzione
multiply() with 2 parameters 20 multiply() with 3 parameters 24 multiply() with 4 parameters 24>
Metodo di sostituzione: Il metodo overriding si verifica quando una sottoclasse può fornire l'implementazione di un metodo già definito nella classe o superclasse genitore. Il tipo restituito, il nome e gli argomenti devono essere simili ai metodi della superclasse.
Esempio:
Giava // Java Program to demonstrate use of Method Overriding import java.io.*; class Vehicle { void drive() { System.out.println('drive() method of base class'); System.out.println('driving the Car.'); } } class Car extends Vehicle { void drive() { System.out.println( 'drive() method of derived class'); System.out.println('Car is driving.'); } } class GFG { public static void main(String[] args) { Car c1 = new Car(); Vehicle v1 = new Vehicle(); c1.drive(); v1.drive(); Vehicle vehicle = new Car(); // drive() method of Vehicle class is overridden by // Car class drive() vehicle.drive(); } }> Produzione
drive() method of derived class Car is driving. drive() method of base class driving the Car. drive() method of derived class Car is driving.>
Sovraccarico del metodo | Metodo prioritario |
|---|---|
Quando due o più metodi si trovano nella stessa classe con parametri diversi ma con lo stesso nome. | Quando una sottoclasse fornisce la propria implementazione di un metodo già definito nella classe genitore. |
L'overload del metodo può avvenire solo nella stessa classe o tra una sottoclasse o una classe genitore. | L'override del metodo può avvenire solo nella sottoclasse. |
Quando si verifica un errore, viene rilevato al momento della compilazione del programma. | Quando si verifica un errore, viene rilevato durante il runtime del programma. |
Esempio di polimorfismo in fase di compilazione. | Esempio di polimorfismo in fase di esecuzione. |
Il sovraccarico del metodo può richiedere o meno l'ereditarietà. | L'override del metodo richiede sempre l'ereditarietà. |
Avviene all'interno della classe. | Viene eseguito in due classi con una relazione di ereditarietà. |
109. Possiamo sovrascrivere i metodi privati?
Non è possibile sovrascrivere i metodi privati in Java. L'override del metodo avviene quando viene implementato il metodo nella sottoclasse anziché il metodo della classe genitore. I metodi privati sono accessibili solo all'interno della classe in cui è dichiarato. Poiché questo metodo non è visibile ad altre classi e non è possibile accedervi, non può essere sovrascritto.
110. Possiamo modificare l'ambito del metodo sovrascritto nella sottoclasse?
In Java non è possibile modificare l'ambito del metodo sottoposto a override. L'ambito del metodo della sottoclasse deve essere uguale o più ampio dell'ambito del metodo sottoposto a override del metodo della superclasse. Il metodo sottoposto a override nella sottoclasse, ad esempio, può avere un ambito pubblico o un ambito più accessibile come protetto o predefinito se il metodo sottoposto a override nella superclasse ha un ambito pubblico. Non può, tuttavia, avere una portata più esclusiva come quella privata.
111. Possiamo modificare la clausola Throws del metodo della superclasse sovrascrivendola nella sottoclasse?
Possiamo modificare la clausola Throws del metodo Superclasse con alcune limitazioni, possiamo modificare la clausola Throws del metodo Superclasse sovrascrivendola nella sottoclasse. Il metodo sottoposto a override della sottoclasse può specificare eccezioni non controllate solo se il metodo della superclasse non dichiara alcuna eccezione. Se il metodo della superclasse dichiara un'eccezione, il metodo della sottoclasse può dichiarare la stessa eccezione, un'eccezione della sottoclasse o nessuna eccezione. Tuttavia, il metodo della sottoclasse non può dichiarare un'eccezione genitore più ampia di quelle dichiarate nel metodo della superclasse.
112. Puoi avere funzioni virtuali in Java?
Sì, Java supporta le funzioni virtuali. Le funzioni sono virtuali per impostazione predefinita e possono essere rese non virtuali utilizzando la parola chiave final.
113. Cos'è l'astrazione?
L'astrazione si riferisce all'atto di rappresentare le caratteristiche essenziali senza includere i dettagli dello sfondo. Le informazioni dettagliate o l'implementazione sono nascoste. L'esempio più comune di astrazione è un'auto, sappiamo come accendere il motore, accelerare e muoverci, tuttavia, il modo in cui funziona il motore e i suoi componenti interni sono una logica complessa nascosta agli utenti generali. Questo di solito viene fatto per gestire la complessità.
114. Cos'è la classe Abstract?
Una classe dichiarata come astratta non può essere istanziata, ovvero l'oggetto non può essere creato. Può contenere o meno metodi astratti ma se una classe ha almeno un metodo astratto, deve essere dichiarata astratta.
Esempio di una classe astratta con metodo astratto:
Giava // Java Program to implement // abstract method import java.io.*; // Abstract class abstract class Fruits { abstract void run(); } // Driver Class class Apple extends Fruits { void run() { System.out.println('Abstract class example'); } // main method public static void main(String args[]) { Fruits obj = new Apple(); obj.run(); } }> 115. Quando si utilizzano i metodi astratti?
Un metodo astratto viene utilizzato quando vogliamo utilizzare un metodo ma vogliamo che le classi figlie ne decidano l'implementazione, in tal caso utilizziamo metodi astratti con le classi madri.
116. Come puoi evitare la serializzazione nella classe figlia se la classe base implementa l'interfaccia Serializable?
Serializzazione nella classe figlia se la classe base implementa l'interfaccia Serializable, possiamo evitarla definendo il metodo writeObject() e lanciando NotSerializableException().
117. Cos'è il Collection Framework in Java?
Le raccolte sono unità di oggetti in Java. Il framework della raccolta è un insieme di interfacce e classi in Java utilizzate per rappresentare e manipolare raccolte di oggetti in vari modi. Il framework di raccolta contiene classi (ArrayList, Vector, LinkedList, PriorityQueue, TreeSet) e più interfacce (Set, List, Queue, Deque) in cui ogni interfaccia viene utilizzata per archiviare un tipo specifico di dati.
118. Spiegare le varie interfacce utilizzate nel framework Collection.
Implementa il framework della raccolta
- Interfaccia di raccolta
- Elenco interfaccia
- Imposta l'interfaccia
- Interfaccia della coda
- E l'interfaccia
- Interfaccia della mappa
Interfaccia di raccolta: Collection è l'interfaccia principale disponibile che può essere importata utilizzando java.util.Collection.
Sintassi:
public interface Collection extends iterable>
119. Come puoi sincronizzare un ArrayList in Java?
Un ArrayList può essere sincronizzato utilizzando due metodi menzionati di seguito:
- Utilizzo di Collections.synchronizedList()
- Utilizzando CopyOnWriteArrayList
Utilizzando Collections.synchronizedList():
public static List synchronizedList(List list)>
Utilizzando CopyOnWriteArrayList:
- Crea un elenco vuoto.
- Implementa l'interfaccia Elenco
- È una variante thread-safe di ArrayList
- T rappresenta generico
120. Perché abbiamo bisogno di un ArrayList sincronizzato quando abbiamo i vettori (che sono sincronizzati) in Java?
ArrayList è necessario anche quando disponiamo di vettori per determinati motivi:
- ArrayList è più veloce di Vectors.
- ArrayList supporta il multithreading mentre Vectors supporta solo l'uso a thread singolo.
- ArrayList è più sicuro da usare, poiché Vector supporta thread singoli e le singole operazioni sono meno sicure e richiedono più tempo per la sincronizzazione.
- I vettori sono considerati obsoleti in Java a causa della loro natura sincronizzata.
121. Perché non possiamo creare un array generico?
Non è possibile creare array generici perché an vettore porta digitare le informazioni dei suoi elementi in fase di esecuzione per cui durante l'esecuzione lancia 'ArrayStoreException' se il tipo degli elementi non è simile. Poiché le informazioni sui tipi generici vengono cancellate in fase di compilazione da Type Erasure, il controllo dell'archivio array verrebbe superato laddove avrebbe dovuto fallire.
122. Locazioni di memoria contigue vengono solitamente utilizzate per memorizzare valori effettivi in un array ma non in ArrayList. Spiegare.
Gli elementi di un array vengono archiviati in posizioni di memoria contigue, il che significa che ciascun elemento viene archiviato in un blocco separato in base alla sua posizione all'interno dell'array. Poiché gli elementi dell'array sono memorizzati in posizioni contigue, può essere relativamente semplice accedere a qualsiasi elemento tramite il suo indice, poiché l'indirizzo dell'elemento può essere calcolato in base alla posizione dell'elemento. Ma Java implementa gli ArrayList come array dinamici, il che significa che la dimensione può cambiare man mano che gli elementi vengono rimossi o aggiunti. Gli elementi ArrayList non vengono archiviati in posizioni di memoria contigue per soddisfare questa natura dinamica. Invece, ArrayList utilizza un metodo noto come array espandibile in cui l'array sottostante viene espanso a una dimensione maggiore secondo necessità e gli elementi vengono quindi copiati nella nuova posizione. A differenza di un ArrayList, che ha una dimensione dinamica e non memorizza i suoi elementi in posizioni di memoria contigue, un array ha una dimensione fissa e i suoi elementi vengono memorizzati lì.
123. Spiegare il metodo per convertire ArrayList in Array e Array in ArrayList.
Conversione di List in ArrayList
Esistono più metodi per convertire List in ArrayList

I programmatori possono convertire un Array in ArrayList utilizzando il metodo asList() della classe Arrays. È un metodo statico della classe Arrays che accetta l'oggetto List.
Sintassi:
Arrays.asList(item)>
Esempio:
Giava // Java program to demonstrate conversion of // Array to ArrayList of fixed-size. import java.util.*; // Driver Class class GFG { // Main Function public static void main(String[] args) { String[] temp = { 'Abc', 'Def', 'Ghi', 'Jkl' }; // Conversion of array to ArrayList // using Arrays.asList List conv = Arrays.asList(temp); System.out.println(conv); } }> Produzione
[Abc, Def, Ghi, Jkl]>
Conversione di ArrayList in Array

I programmatori Java possono convertire ArrayList in
Sintassi:
List_object.toArray(new String[List_object.size()])>
Esempio:
Giava // Java program to demonstrate working of // Objectp[] toArray() import java.io.*; import java.util.List; import java.util.ArrayList; // Driver Class class GFG { // Main Function public static void main(String[] args) { // List declared List<Integer> arr = new ArrayList<Integer>(); arr.add(1); arr.add(2); arr.add(3); arr.add(2); arr.add(1); // Conversion Object[] objects = arr.toArray(); // Printing array of objects for (Object obj : objects) System.out.print(obj + ' '); } }> Produzione
1 2 3 2 1>
124. In che modo la dimensione di ArrayList cresce dinamicamente? E indicare anche come viene implementato internamente.
A causa della natura basata su array di ArrayList, le sue dimensioni crescono dinamicamente garantendo che ci sia sempre spazio sufficiente per gli elementi. Quando viene creato per la prima volta un elemento ArrayList, la capacità predefinita è di circa 10-16 elementi, che dipende sostanzialmente dalla versione Java. Gli elementi ArrayList vengono copiati dall'array originale al nuovo array quando la capacità dell'array originale è piena. Man mano che la dimensione dell'ArrayList aumenta dinamicamente, la classe crea un nuovo array di dimensioni maggiori e copia tutti gli elementi dal vecchio array al nuovo array. Ora il riferimento del nuovo array viene utilizzato internamente. Questo processo di crescita dinamica di un array è noto come ridimensionamento.
125. Cos'è un vettore in Java?
I vettori in Java sono simili e possono memorizzare più elementi al loro interno. I vettori seguono alcune regole menzionate di seguito:
- Il vettore può essere importato utilizzando Java.util.Vector.
- Vector viene implementato utilizzando un array dinamico poiché la dimensione del vettore aumenta e diminuisce a seconda degli elementi inseriti in esso.
- Elementi del vettore utilizzando i numeri indice.
- I vettori sono sincronizzati per natura, nel senso che utilizzano un solo thread (viene eseguito un solo processo alla volta).
- Il vettore contiene molti metodi che non fanno parte del framework delle raccolte.
Sintassi:
Vector gfg = new Vector(size, increment);>
126. Come rendere Java ArrayList di sola lettura?
Un ArrayList può essere preparato solo utilizzando il metodo fornito da Collections utilizzando il metodo Collections.unmodifyingList().
Sintassi:
array_readonly = Collections.unmodifiableList(ArrayList);>
Esempio:
Giava // Java program to demonstrate // unmodifiableList() method import java.util.*; public class Main { public static void main(String[] argv) throws Exception { try { // creating object of ArrayList <Character> ArrayList<Character> temp = new ArrayList<Character>(); // populate the list temp.add('X'); temp.add('Y'); temp.add('Z'); // printing the list System.out.println('Initial list: ' + temp); // getting readonly list // using unmodifiableList() method List<Character> new_array = Collections.unmodifiableList(temp); // printing the list System.out.println('ReadOnly ArrayList: ' + new_array); // Adding element to new Collection System.out.println('
If add element in ' + ' the ReadOnly ArrayList'); new_array.add('A'); } catch (UnsupportedOperationException e) { System.out.println('Exception is thrown : ' + e); } } }> Produzione
Initial list: [X, Y, Z] ReadOnly ArrayList: [X, Y, Z] If add element in the ReadOnly ArrayList Exception is thrown : java.lang.UnsupportedOperationException>
127. Cos'è una coda prioritaria in Java?

Una coda con priorità è un tipo di dati astratto simile a una coda normale o a una struttura di dati stack. Gli elementi memorizzati negli elementi dipendono dalla priorità definita da bassa ad alta. PriorityQueue si basa sull'heap delle priorità.
Sintassi:
Giava // Java program to demonstrate the // working of PriorityQueue import java.util.*; class PriorityQueueDemo { // Main Method public static void main(String args[]) { // Creating empty priority queue PriorityQueue<Integer> var1 = new PriorityQueue<Integer>(); // Adding items to the pQueue using add() var1.add(10); var1.add(20); var1.add(15); // Printing the top element of PriorityQueue System.out.println(var1.peek()); } }> Produzione
10>
128. Spiegare la classe LinkedList.
La classe LinkedList è Java che utilizza un elenco doppiamente collegato per memorizzare gli elementi. Eredita la classe AbstractList e implementa le interfacce List e Deque. Le proprietà della classe LinkedList sono menzionate di seguito:
- Le classi LinkedList non sono sincronizzate.
- Mantiene l'ordine di inserimento.
- Può essere utilizzato come elenco, stack o coda.
Sintassi:
LinkedList list_name=new LinkedList();>
129. Cos'è la classe Stack in Java e quali sono i vari metodi da essa forniti?
Una classe Stack in Java è una struttura dati LIFO che implementa la struttura dati Last In First Out. Deriva da una classe Vector ma ha funzioni specifiche per gli stack. La classe Stack in Java fornisce i seguenti metodi:
- sbirciare(): restituisce l'elemento in cima allo stack senza rimuoverlo
- vuoto(): restituisce vero se lo stack è vuoto e falso altrimenti
- spingere(): spinge un oggetto in cima alla pila
- pop(): rimuove e restituisce l'elemento in cima allo stack
- ricerca(): restituisce la posizione in base 1 dell'oggetto dalla cima dello stack. Se l'oggetto non è nello stack, restituisce -1
130. Cosa è impostato nel framework delle raccolte Java ed elenca le sue varie implementazioni?
I set sono raccolte che non memorizzano elementi duplicati. Non mantengono alcun ordine degli elementi. Il framework Java Collections fornisce diverse implementazioni dell'interfaccia Set, tra cui:
- Set di hash: HashSet in Java, memorizza gli elementi in una tabella has che fornisce ricerche più veloci e inserimenti più rapidi. HashSet non è ordinato.
- LinkedHashSet: LinkedHashSet è un'implementazione di HashSet che mantiene l'ordine di inserimento degli elementi.
- Set di alberi: TreeSet memorizza gli elementi in un ordine determinato dall'ordinamento naturale degli elementi o da un comparatore personalizzato fornito al momento della creazione.
131. Cos'è la classe HashSet in Java e come memorizza gli elementi?
La classe HashSet implementa l'interfaccia Set in Java Collections Framework ed è un membro della classe HashSet. A differenza dei valori duplicati, memorizza una raccolta di elementi distinti. In questa implementazione, ogni elemento viene mappato a un indice in un array utilizzando una funzione hash e l'indice viene utilizzato per accedere rapidamente all'elemento. Produce un indice per l'elemento nell'array in cui è archiviato in base all'elemento di input. Supponendo che la funzione hash distribuisca gli elementi tra i bucket in modo appropriato, la classe HashSet fornisce prestazioni costanti per le operazioni di base (aggiunta, rimozione, contenimento e dimensione).
132. Cos'è LinkedHashSet nel Java Collections Framework?
LinkedHashSet è una versione ordinata di Hashset mantenuta da un elenco doppiamente collegato tra tutti gli elementi. È molto utile quando è necessario l'ordine di iterazione. Durante l'iterazione in LinkedHashSet, gli elementi vengono restituiti nello stesso ordine in cui sono inseriti.
Sintassi:
LinkedHashSet hs = new LinkedHashSet();>
Esempio:
Giava // Java Program to implement // LinkedHashSet import java.io.*; import java.util.*; // Driver Class class GFG { // Main Function public static void main(String[] args) { // LinkedHashSet declared LinkedHashSet<Integer> hs = new LinkedHashSet<Integer>(); // Add elements in HashSet hs.add(1); hs.add(2); hs.add(5); hs.add(3); // Print values System.out.println('Values:' + hs); } }> Produzione
Values:[1, 2, 5, 3]>
133. Cos'è un'interfaccia mappa in Java?

L'interfaccia della mappa è presente nella raccolta Java e può essere utilizzata con il pacchetto Java.util. Un'interfaccia di mappa viene utilizzata per mappare i valori sotto forma di formato chiave-valore. La mappa contiene tutte le chiavi univoche. Inoltre, fornisce metodi ad esso associati come contieneKey(), contiene valore (), ecc.
Esistono diversi tipi di mappe nell'interfaccia della mappa, come indicato di seguito:
- Mappa ordinata
- Mappa ad albero
- HashMap
- LinkedHashMap
134. Spiegare Treemap in Java
TreeMap è un tipo di mappa che memorizza i dati sotto forma di coppia chiave-valore. È implementato utilizzando l'albero rosso-nero. Le caratteristiche di TreeMap sono:
- Contiene solo elementi unici.
- Non può avere una chiave NULL
- Può avere più valori NULL.
- Non è sincronizzato.
- Mantiene l'ordine crescente.
135. Cos'è EnumSet?
EnumSet è un'implementazione specializzata dell'interfaccia Set da utilizzare con il tipo di enumerazione. Alcune funzionalità di EnumSet sono:
- Non è sincronizzato.
- Più veloce di HashSet.
- Tutti gli elementi in un EnumSet devono provenire da un singolo tipo di enumerazione.
- Non consente oggetti null e lancia NullPointerException per le eccezioni.
- Utilizza un iteratore fail-safe.
Sintassi:
public abstract class EnumSet>
Parametro: E specifica gli elementi.
136. Cos'è BlockingQueue?

Una coda di blocco è una coda che supporta le operazioni che attendono che la coda diventi non vuota durante il recupero e la rimozione dell'elemento e attendono che lo spazio diventi disponibile nella coda durante l'aggiunta dell'elemento.
Sintassi:
public interface BlockingQueue extends Queue>
parametri: E è il tipo di elementi archiviati nella Collezione
137. Cos'è ConcurrentHashMap in Java e lo implementi?
ConcurrentHashMap è implementato utilizzando Hashtable.
Sintassi:
public class ConcurrentHashMap extends AbstractMap implements ConcurrentMap, Serializable>
Parametri : K è il tipo di oggetto chiave e V è il tipo di oggetto valore
138. Puoi usare qualsiasi classe come chiave della mappa?
Sì, possiamo utilizzare qualsiasi classe come Map Key se segue alcune regole predefinite menzionate di seguito:
- La classe che sovrascrive il metodo equals() deve sovrascrivere anche il metodo hashCode()
- La classe concurrentHashMap è thread-safe.
- Il livello di concorrenza predefinito di ConcurrentHashMap è 16.
- L'inserimento di oggetti nulli in ConcurrentHashMap non è possibile come chiave o come valore.
139. Cos'è un Iteratore?

L'interfaccia Iterator fornisce metodi per eseguire l'iterazione su qualsiasi raccolta in Java. Iterator sostituisce l'enumerazione nel Java Collections Framework. Può ottenere un'istanza dell'iteratore da una raccolta utilizzando il metodo _iterator()_. Consente inoltre al chiamante di rimuovere elementi dalla raccolta sottostante durante l'iterazione.
140. Cos'è un'enumerazione?
L'enumerazione è un tipo di dati definito dall'utente. Viene utilizzato principalmente per assegnare nomi a costanti integrali, i nomi rendono un programma facile da leggere e mantenere. L'obiettivo principale dell'enumerazione è definire tipi di dati definiti dall'utente.
Esempio:
// A simple enum example where enum is declared // outside any class (Note enum keyword instead of // class keyword) enum Color { RED, GREEN, BLUE; }>141. Qual è la differenza tra Collezione e Collezioni?
Collezione | Collezioni |
|---|---|
La Collezione è un'interfaccia. | Le raccolte sono una classe. |
Fornisce la funzionalità standard della struttura dati. | Serve per ordinare e sincronizzare gli elementi della raccolta. |
Fornisce i metodi che possono essere utilizzati per la struttura dei dati. | Fornisce metodi statici che possono essere utilizzati per varie operazioni. |
142. Distinguere tra Array e ArrayList in Java.
Vettore | Lista di array |
|---|---|
Monodimensionale o multidimensionale | Monodimensionale |
Per e per ciascuno utilizzato per l'iterazione | Qui l'iteratore viene utilizzato per attraversare riverArrayList |
la parola chiave length restituisce la dimensione dell'array. | Il metodo size() viene utilizzato per calcolare la dimensione di ArrayList. |
L'array ha dimensioni fisse. | La dimensione dell'ArrayList è dinamica e può essere aumentata o diminuita quando richiesto. |
È più veloce come sopra lo vediamo di dimensioni fisse | È relativamente più lento a causa della sua natura dinamica |
I tipi di dati primitivi possono essere archiviati direttamente in oggetti improbabili. | I tipi di dati primitivi non vengono aggiunti direttamente agli array improbabili, vengono aggiunti indirettamente con l'aiuto di autoboxing e unboxing |
Non possono essere aggiunti qui, quindi il tipo non è sicuro. | Possono essere aggiunti qui rendendo ArrayList sicuro per i tipi. |
L'operatore di assegnazione serve solo allo scopo | Qui viene utilizzato un metodo speciale noto come metodo add() |
143. Qual è la differenza tra Array e Collection in Java?
Vettore | Collezioni |
|---|---|
L'array in Java ha una dimensione fissa. | Le raccolte in Java hanno dimensioni dinamiche. |
In un array, gli elementi vengono archiviati in posizioni di memoria contigue. | Nelle raccolte, gli elementi non vengono necessariamente archiviati in posizioni di memoria contigue. |
Oggetti e tipi di dati primitivi possono essere archiviati in un array. | Possiamo archiviare oggetti solo in raccolte. |
Per ridimensionare l'array è necessaria la manipolazione manuale. | Il ridimensionamento nelle raccolte viene gestito automaticamente. |
L'array dispone di metodi di base per la manipolazione. | Le raccolte dispongono di metodi avanzati per la manipolazione e l'iterazione. |
L'array è disponibile dall'inizio di Java. | Le raccolte sono state introdotte in Java 1.2. |
144. Differenza tra ArrayList e LinkedList.
Lista di array | Lista collegata |
|---|---|
ArrayList è implementato come array espandibile. | LinkedList è implementato come un elenco doppiamente collegato. |
In ArrayList, gli elementi vengono archiviati in posizioni di memoria contigue | Gli elementi LinkedList vengono archiviati in posizioni di memoria non contigue poiché ciascun elemento ha un riferimento agli elementi successivo e precedente. |
Gli ArrayList sono più veloci per l'accesso casuale. | Le LinkedList sono più veloci nelle operazioni di inserimento e cancellazione |
Gli ArrayList sono più efficienti in termini di memoria. | LinkedList è meno efficiente in termini di memoria |
ArrayList Utilizzano più memoria grazie al mantenimento della dimensione dell'array. | LinkedList Utilizza meno memoria poiché ha solo riferimenti a elementi |
L'operazione di ricerca è più veloce in ArrayList. | L'operazione di ricerca è più lenta in LinkedList |
145. Distinguere tra ArrayList e Vector in Java.
Lista di array | Vettore |
|---|---|
Gli ArrayList sono implementati come un array espandibile. | Vector è implementato come array espandibile. |
ArrayList non è sincronizzato. | Il vettore è sincronizzato. |
Gli ArrayList sono più veloci per le operazioni non simultanee. | Il vettore è più lento per le operazioni non simultanee a causa del sovraccarico aggiuntivo della sincronizzazione. |
Gli ArrayList sono stati introdotti in Java 1.2. | Vector è stato introdotto in JDK 1.0. |
Consigliato per l'uso in un ambiente a thread singolo. | I vettori sono consigliati per l'uso in un ambiente multi-thread. |
La capacità iniziale predefinita di ArrayLists è 10. | In Vettori, la capacità iniziale predefinita è 10 ma l'incremento predefinito è il doppio della dimensione. |
Le prestazioni di ArrayList sono elevate. | Le prestazioni del vettore sono basse. |
146. Qual è la differenza tra Iterator e ListIterator?
Iteratore | ListIterator |
|---|---|
Può attraversare gli elementi presenti nella Collezione solo nella direzione in avanti. | Può attraversare gli elementi presenti nella Collezione sia in avanti che all'indietro. |
Utilizzato per attraversare Mappa, Elenco e Set. | Può attraversare solo List e non gli altri due. |
Gli indici non possono essere ottenuti utilizzando Iterator | Dispone di metodi come nextIndex() e previousIndex() per ottenere indici di elementi in qualsiasi momento mentre si attraversa la Lista. |
Non è possibile modificare o sostituire elementi presenti nella Collezione | Può modificare o sostituire elementi con l'aiuto di set(E e) |
Non è possibile aggiungere elementi e lancia anche ConcurrentModificationException. | Puoi aggiungere facilmente elementi a una raccolta in qualsiasi momento. |
Alcuni metodi di Iterator sono next(), delete() e hasNext(). | Alcuni metodi di ListIterator sono next(), previous(), hasNext(), hasPrevious(), add(E e). |
147. Distinguere tra HashMap e HashTable.
HashMap | HashTable |
|---|---|
HashMap non è sincronizzato | HashTable è sincronizzato |
Una chiave può avere un valore NULL | Valori NULL non consentiti |
L'iteratore viene utilizzato per attraversare HashMap. | È possibile utilizzare sia Iterator che Enumertar |
HashMap è più veloce. | HashTable è più lento rispetto a HashMap. |
148. Qual è la differenza tra Iterator ed Enumerazione?
Iteratore | Enumerazione |
|---|---|
L'Iterator può attraversare sia elementi legacy che non legacy. | L'enumerazione può attraversare solo elementi legacy. |
L'Iterator è fail-fast. | L'enumerazione non è fail-fast. |
Gli Iteratori sono più lenti. | L'enumerazione è più veloce. |
L'Iterator può eseguire un'operazione di rimozione mentre attraversa la raccolta. | L'enumerazione può eseguire solo operazioni di attraversamento della raccolta. |
149. Qual è la differenza tra comparabile e comparatore?
Paragonabile | Comparatore |
|---|---|
L'interfaccia è presente nel pacchetto java.lang. | L'interfaccia è presente nel pacchetto java.util. |
Fornisce il metodo compareTo() per ordinare gli elementi. | Fornisce il metodo compare() per ordinare gli elementi. |
Fornisce singole sequenze di ordinamento. | Fornisce più sequenze di ordinamento. |
La logica dell'ordinamento deve trovarsi nella stessa classe di cui si intende ordinare l'oggetto. | La logica dell'ordinamento dovrebbe essere in una classe separata per scrivere ordinamenti diversi in base a diversi attributi degli oggetti. |
Il metodo ordina i dati in base all'ordinamento fisso. | Il metodo ordina i dati in base all'ordinamento personalizzato. |
Colpisce la classe originale. | Non influisce sulla classe originale. |
Implementato frequentemente nell'API da Calendar, classi Wrapper, Date e String. | È implementato per ordinare istanze di classi di terze parti. |
150. Qual è la differenza tra Set e Mappa?
Impostato | Carta geografica |
|---|---|
L'interfaccia Set è implementata utilizzando il pacchetto java.util. | La mappa è implementata utilizzando il pacchetto java.util. |
Può estendere l'interfaccia di raccolta. | Non estende l'interfaccia di raccolta. |
Non consente valori duplicati. | Consente valori duplicati. |
Il set può ordinare solo un valore nullo. | La mappa può ordinare più valori nulli. |
Domande per l'intervista intermedia Java
151. Spiegare l'iteratore FailFast e l'iteratore FailSafe insieme ad esempi per ciascuno.
Un iteratore FailFast è un iteratore che genera un file ConcurrentModificationException se rileva che la raccolta sottostante è stata modificata durante l'utilizzo dell'iteratore. Questo è il comportamento predefinito degli iteratori nel Java Collections Framework. Ad esempio, l'iteratore per una HashMap è FailFast.
Esempio:
Giava // Java Program to demonstrate FailFast iterator import java.io.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; class GFG { public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<>(); map.put(1, 'one'); map.put(2, 'two'); Iterator<Map.Entry<Integer, String> > iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); // this will throw a // ConcurrentModificationException if (entry.getKey() == 1) { map.remove(1); } } } }> Produzione:
Exception in thread 'main' java.util.ConcurrentModificationException>
Un iteratore FailSafe non lancia un file ConcurrentModificationException se la raccolta sottostante viene modificata mentre viene utilizzato l'iteratore. In alternativa, crea uno snapshot della raccolta nel momento in cui viene creato l'iteratore ed esegue l'iterazione sullo snapshot. Ad esempio, l'iteratore per ConcurrentHashMap è FailSafe.
Esempio:
Giava
// Java Program to demonstrate FailSafe import java.io.*; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; class GFG { public static void main(String[] args) { ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>(); map.put(1, 'one'); map.put(2, 'two'); Iterator<Map.Entry<Integer, String> > iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); // this will not throw an exception if (entry.getKey() == 1) { map.remove(1); } } } }> 152. Cos'è la gestione delle eccezioni?
UN Eccezione è un Evento che interrompe il normale flusso del programma e richiede un'elaborazione speciale. Durante l'esecuzione di un programma, gli errori e gli eventi imprevisti possono essere gestiti utilizzando il meccanismo Java Exception Handling. Di seguito sono riportati alcuni motivi per cui si verificano eccezioni in Java:
- Guasto del dispositivo
- Perdita di connessione di rete
- Errori di codice
- Apertura di un file non disponibile
- Immissione utente non valida
- Limitazioni fisiche (memoria del disco esaurita)
153. Quanti tipi di eccezioni possono verificarsi in un programma Java?

In Java esistono generalmente due tipi di eccezioni:
- Eccezioni integrate: Le eccezioni integrate in Java sono fornite dalle librerie Java. Queste eccezioni possono essere ulteriormente suddivise in due sottocategorie, ovvero Eccezioni selezionate e non selezionate. Di seguito sono riportate alcune delle eccezioni integrate in Java:
- ArrayIndexOutOfBoundsExceptions
- ClassNotFoundException
- FileNotFoundException
- IOException
- NullPointerException
- ArithmeticException
- InterruptedException
- RuntimeException
- Eccezioni definite dall'utente: Le eccezioni definite dall'utente sono definite dagli stessi programmatori per gestire alcune situazioni o errori specifici che non sono coperti dalle eccezioni integrate. Per definire le eccezioni definite dall'utente è necessario definire una nuova classe che estende la classe di eccezioni appropriata. Le eccezioni definite dall'utente in Java vengono utilizzate quando le eccezioni integrate sono in Java.
154. Differenza tra Errore ed Eccezione.
Errori | Eccezioni |
|---|---|
Il ripristino dagli errori non è possibile. | Ripristina dalle eccezioni utilizzando un blocco try-catch o restituendo le eccezioni al chiamante. |
Gli errori sono tutti tipi non controllati in Java. | Include sia i tipi controllati che quelli non controllati che si verificano. |
Gli errori sono principalmente causati dall'ambiente in cui viene eseguito il programma. | Il programma è principalmente responsabile di causare eccezioni. |
Gli errori possono verificarsi sia in fase di compilazione che in fase di esecuzione. Tempo di compilazione: errore di sintassi, tempo di esecuzione: errore logico. | Tutte le eccezioni si verificano in fase di esecuzione, ma le eccezioni controllate sono note al compilatore mentre non lo sono. |
Sono definiti nel pacchetto java.lang.Error. | Sono definiti nel pacchetto java.lang.Exception |
Esempi : java.lang.StackOverflowError, java.lang.OutOfMemoryError | Esempi : Eccezioni selezionate: SQLException, IOException Eccezioni non verificate: ArrayIndexOutOfBoundException, NullPointerException, ArithmeticException. |
155. Spiegare la gerarchia delle classi di eccezioni Java.

Tutti i tipi di eccezioni ed errori in Java sono sottoclassi della classe launchable, che è la classe base della gerarchia. Questa classe viene quindi utilizzata per condizioni eccezionali che i programmi utente dovrebbero rilevare. NullPointerException è un esempio di tale eccezione. Un altro ramo, error, viene utilizzato dal sistema runtime Java per indicare errori che hanno a che fare con JRE. StackOverflowError è un esempio di uno di questi errori.
156. Spiegare le eccezioni di runtime.
Le eccezioni di runtime sono eccezioni che si verificano durante l'esecuzione di un codice, al contrario delle eccezioni in fase di compilazione che si verificano durante la compilazione. Le eccezioni di runtime sono eccezioni non controllate, poiché non vengono prese in considerazione dalla JVM.
Esempi di eccezioni di runtime in Java includono:
- NullPointerException: si verifica quando un'applicazione tenta di utilizzare un riferimento a un oggetto nullo.
- ArrayIndexOutOfBoundsException: questo si verifica quando un'applicazione tenta di accedere a un indice di array che è fuori dai limiti.
- ArithmeticException: si verifica quando un'applicazione tenta di dividere per zero.
- IllegalArgumentException: ciò si verifica quando un metodo viene passato su un argomento illegale o inappropriato.
A differenza delle eccezioni controllate, le eccezioni di runtime non richiedono una dichiarazione nella clausola Throws o la cattura in un blocco try-catch. Tuttavia, è consigliabile gestire le eccezioni di runtime per fornire messaggi di errore significativi e prevenire un arresto anomalo del sistema. Poiché le eccezioni di runtime forniscono informazioni più specifiche sul problema rispetto alle eccezioni controllate, consentono agli sviluppatori di rilevare e correggere gli errori di programmazione in modo più semplice e rapido.
157. Cos'è NullPointerException?
È un tipo di eccezione di runtime che viene generata quando il programma tenta di utilizzare un riferimento a un oggetto con valore null. L'uso principale di NullPointerException è indicare che nessun valore è assegnato a una variabile di riferimento, inoltre viene utilizzato per implementare strutture di dati come elenchi collegati e alberi.
158. Quando viene lanciata l'ArrayStoreException?
ArrayStoreException viene generata quando viene effettuato un tentativo di archiviare il tipo di oggetto errato in una matrice di oggetti.
Esempio:
Giava
// Java Program to implement // ArrayStoreException public class GFG { public static void main(String args[]) { // Since Double class extends Number class // only Double type numbers // can be stored in this array Number[] a = new Double[2]; // Trying to store an integer value // in this Double type array a[0] = new Integer(4); } }> Esempio:
Exception in thread 'main' java.lang.ArrayStoreException: java.lang.Integer at GFG.main(GFG.java:6)>
159. Qual è la differenza tra eccezione controllata ed eccezione non controllata?
Eccezione verificata:
Le eccezioni controllate sono le eccezioni che vengono controllate durante la fase di compilazione di un programma. In un programma, se parte del codice all'interno di un metodo lancia un'eccezione controllata, allora il metodo deve gestire l'eccezione o specificare l'eccezione utilizzando la parola chiave Throws.
Le eccezioni controllate sono di due tipi:
- Eccezioni completamente controllate: vengono controllate anche tutte le sue classi figlie, come IOException e InterruptedException.
- Eccezioni parzialmente controllate: alcune delle sue classi figlie non sono controllate, come un'eccezione.
Eccezione non controllata:
Non controllate sono le eccezioni che non vengono controllate in fase di compilazione di un programma. Le eccezioni nelle classi Error e RuntimeException sono eccezioni non controllate, tutto il resto in Throwable viene controllato.
160. Qual è la classe base per Errore ed Eccezione?

L'errore è un'operazione illegale eseguita dall'utente che causa un'anomalia nel programma. Le eccezioni sono eventi o condizioni imprevisti che si verificano durante l'esecuzione del programma, l'eccezione interrompe il normale flusso delle istruzioni del programma.
Sia gli errori che le eccezioni hanno una classe genitore comune che è la classe java.lang.Throwable.
161. È necessario che ogni blocco try sia seguito da un blocco catch?
No, non è necessario utilizzare catch block dopo try block in Java poiché possiamo creare un'altra combinazione con final block. Infine è il blocco che viene eseguito nonostante il fatto che l'eccezione venga lanciata o meno.
162. Cos'è la propagazione delle eccezioni?
La propagazione delle eccezioni è un processo in cui l'eccezione viene eliminata dall'alto verso il basso dello stack. Se non viene rilevata una volta, l'eccezione passa nuovamente al metodo precedente e così via finché non viene rilevata o finché non raggiunge il fondo dello stack di chiamate.
163. Cosa accadrà se inserisci System.exit(0) nel blocco try o catch? Il blocco verrà finalmente eseguito?
System.exit(int) ha la capacità di lanciare SecurityException. Pertanto, se in caso di sicurezza, viene generata l'eccezione, alla fine verrà eseguito il blocco altrimenti JVM verrà chiusa durante la chiamata a System. exit(0) a causa della quale il blocco finale non verrà eseguito.
164. Cosa intendi per clonazione di oggetti e come lo ottieni in Java?
È il processo di creazione di una copia esatta di qualsiasi oggetto. Per supportare ciò, una classe Java deve implementare l'interfaccia Cloneable del pacchetto java.lang e sovrascrivere il metodo clone() fornito dalla classe Object la cui sintassi è:
Oggetto protetto clone() lancia CloneNotSupportedException{ return (Object)super.clone();} Nel caso in cui l'interfaccia Cloneable non sia implementata e venga sovrascritto solo il metodo, il risultato sarà CloneNotSupportedException in Java.
165. In che modo le eccezioni influenzano il programma se non le gestisce?
Le eccezioni sono responsabili dell'interruzione improvvisa dell'esecuzione del programma durante l'esecuzione e il codice scritto dopo che si è verificata l'eccezione non viene eseguito.
166. Qual è l'uso della parola chiave finale?
La parola chiave finale viene utilizzata per rendere le funzioni non virtuali. Per impostazione predefinita, tutte le funzioni sono virtuali, quindi per renderle non virtuali utilizziamo la parola chiave final.
167. Quale scopo soddisfano le parole chiave finale, finalmente e finalizzare?
io). finale:
final è una parola chiave utilizzata con la variabile, il metodo o la classe in modo che non possano essere sovrascritti.
Esempio:
Giava
// Java Program to use final // keyword import java.io.*; // Driver Class class GFG { // Main function public static void main(String[] args) { final int x = 100; x = 50; } }> Produzione:
./GFG.java:6: error: cannot assign a value to final variable x x=50; ^ 1 error>
ii). Finalmente
infine è un blocco di codice utilizzato con try-catch nella gestione delle eccezioni. Il codice scritto nel blocco finale viene eseguito nonostante il fatto che l'eccezione venga generata o meno.
Esempio:
Giava
// Java Program to implement finally import java.io.*; // Driver class class GFG { // Main function public static void main(String[] args) { int x = 10; // try block try { System.out.println('Try block'); } // finally block finally { System.out.println( 'Always runs even without exceptions'); } } }> Produzione
Try block Always runs even without exceptions>
iii). finalizzare
È un metodo che viene chiamato subito prima di eliminare/distruggere gli oggetti idonei per la Garbage Collection per eseguire l'attività di pulizia.
Esempio:
Giava
/*package whatever // do not write package name here */ import java.io.*; class GFG { public static void main(String[] args) { System.out.println('Main function running'); System.gc(); } // Here overriding finalize method public void finalize() { System.out.println('finalize method overridden'); } }> Produzione
Main function running>
168. Qual è la differenza tra this() e super() in Java?
Questo( ) | super( ) |
|---|---|
Rappresenta l'istanza corrente della classe. | Rappresenta l'istanza corrente della classe genitore. |
Chiama il costruttore predefinito della stessa classe. | Chiama il costruttore predefinito della classe base. |
Accedi ai metodi della stessa classe. | Accedi ai metodi della classe genitore. |
Indica l'istanza della classe corrente. | Punta l'istanza della superclasse. |
169. Cos'è il multitasking?
Il multitasking in Java si riferisce alla capacità di un programma di svolgere più attività contemporaneamente. I thread, che sono operazioni rapide contenute in un singolo programma, possono farlo. Eseguire più cose contemporaneamente è noto come multitasking.
Esempio:
Giava
// Java program for multitasking import java.io.*; public class MyThread extends Thread { public void run() { // Code to be executed in this thread for (int i = 0; i < 10; i++) { System.out.println( 'Thread ' + Thread.currentThread().getId() + ': ' + i); } } } public class GFG { public static void main(String[] args) { MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); // Start the threads thread1.start(); thread2.start(); } }> 170. Cosa intendi per programma multithread?
I programmi multithread in Java contengono thread che vengono eseguiti contemporaneamente anziché in sequenza. Un computer può utilizzare le proprie risorse in modo più efficiente combinando più attività contemporaneamente. Qualsiasi programma con multithreading consente a più di un utente di utilizzare contemporaneamente il programma senza eseguire più copie. Un programma multithread è progettato per eseguire più processi contemporaneamente, il che può migliorare le prestazioni di un programma e consentire al programma di utilizzare più processori e migliorare il throughput complessivo.
171. Quali sono i vantaggi del multithreading?
I vantaggi derivanti dall'utilizzo del multithreading sono molteplici e sono i seguenti:
- Reattività: la reattività dell'utente aumenta perché l'applicazione interattiva multithreading consente l'esecuzione del codice anche quando la sezione è bloccata o esegue un processo lungo.
- Condivisione delle risorse: il processo può eseguire lo scambio di messaggi e la memoria condivisa grazie al multithreading.
- Economia: siamo in grado di condividere la memoria per cui i processi sono economici.
- Scalabilità: il multithreading su più macchine CPU aumenta il parallelismo.
- Migliore comunicazione: le funzioni di sincronizzazione dei thread migliorano la comunicazione tra processi.
- Utilizzo dell'architettura multiprocessore
- Utilizzo delle risorse di sistema ridotto al minimo
172. Quali sono i due modi in cui è possibile creare Thread?
Il multithreading è una funzionalità Java che consente l'esecuzione simultanea di due o più parti di un programma per il massimo utilizzo della CPU. In generale, i thread sono processi piccoli e leggeri con percorsi di esecuzione separati. Questi thread utilizzano la memoria condivisa, ma agiscono in modo indipendente, quindi se un thread fallisce, ciò non influisce sugli altri thread. Esistono due modi per creare un thread:
- Estendendo la classe Thread
- Implementando un'interfaccia eseguibile.
Estendendo la classe Thread
Creiamo una classe che estende il classe java.lang.Thread . Questa classe sovrascrive il metodo run() disponibile nella classe Thread. Un thread inizia la sua vita all'interno del metodo run().
Sintassi:
public class MyThread extends Thread { public void run() { // thread code goes here } }>Implementando l'interfaccia Runnable
Creiamo una nuova classe che implementa java.lang.Runnable interfaccia e sovrascrivere il metodo run(). Quindi istanziamo un oggetto Thread e chiamiamo il metodo start() su questo oggetto.
Sintassi:
public class MyRunnable implements Runnable { public void run() { // thread code goes here } }>173. Cos'è un filo?
I thread in Java sono sottoprocessi leggeri con la più piccola unità di processi e hanno anche percorsi di esecuzione separati. Questi thread utilizzano la memoria condivisa ma agiscono in modo indipendente, quindi se esiste un'eccezione nei thread che non influisce sul funzionamento di altri thread nonostante condividano la stessa memoria. Un thread ha il proprio contatore di programma, stack di esecuzione e variabili locali, ma condivide lo stesso spazio di memoria con altri thread nello stesso processo. Java fornisce il supporto integrato per il multithreading tramite Interfaccia eseguibile e il Classe del thread .
174. Distinguere tra processo e thread?
Un processo e un thread sono entrambi unità di esecuzione in un sistema informatico, ma sono diversi in diversi modi:
Processi | Filo |
|---|---|
Un processo è un programma in esecuzione. | Un thread è una singola sequenza di istruzioni all'interno di un processo. |
Il processo richiede più tempo per terminare. | Il thread impiega meno tempo per terminare. |
Il processo richiede più tempo per il cambio di contesto. | Il thread impiega meno tempo per il cambio di contesto. |
Il processo è meno efficiente in termini di comunicazione. | Il thread è più efficiente in termini di comunicazione. |
Il processo è isolato. | I thread condividono la memoria. |
Il processo ha il proprio blocco di controllo del processo, stack e spazio di indirizzi. | Il thread ha il PCB dei genitori, il proprio blocco di controllo del thread, lo stack e lo spazio degli indirizzi comune. |
Il processo non condivide i dati tra loro. | I thread condividono i dati tra loro. |
175. Descrivere il ciclo di vita del filo?

UN filo in Java in qualsiasi momento esiste in uno qualsiasi dei seguenti stati. Un thread si trova in ogni istante solo in uno degli stati mostrati:
- Nuovo: Il thread è stato creato ma non è ancora iniziato.
- Eseguibile: Il thread è in esecuzione, sta eseguendo la sua attività oppure è pronto per l'esecuzione se non sono presenti altri thread con priorità più elevata.
- Bloccato: Il thread è temporaneamente sospeso, in attesa di una risorsa o di un evento.
- In attesa: Il thread è in attesa che un altro thread esegua un'attività o che trascorra un periodo di tempo specificato.
- Terminato: Il thread ha completato la sua attività o è stato terminato da un altro thread.
176. Spiegare il metodo suspend() nella classe Thread.
Il metodo suspend() della classe Thread in Java sospende temporaneamente l'esecuzione di un thread. Quando un thread viene sospeso, entra in uno stato bloccato e non verrà pianificato dal sistema operativo, il che significa che non sarà in grado di eseguire la sua attività finché non verrà ripreso. Esistono alternative più sicure e flessibili ai metodi suspend() nel moderno linguaggio di programmazione Java. Questo metodo non restituisce alcun valore.
Sintassi:
public final void suspend();>
Esempio:
Giava
// Java program to show thread suspend() method import java.io.*; class MyThread extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println(' Running thread : ' + i); try { Thread.sleep(1000); } catch (Interrupted_Exception e) { e.printStackTrace(); } } } } class GFG { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // suspend the execution of the thread t1.suspend(); System.out.println('Suspended thread '); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // resume the execution of the thread t1.resume(); System.out.println('Resumed thread'); } }> Produzione:
Thread running: 0 Thread running: 1 Thread running: 2 Suspended thread Resumed thread Thread running: 3 Thread running: 4 Thread running: 5 Thread running: 6 Thread running: 7 Thread running: 8 Thread running: 9>
177. Spiegare il thread principale in Esecuzione della classe Thread.
Java fornisce il supporto integrato per la programmazione multithread. Il thread principale è considerato il thread padre di tutti gli altri thread creati durante l'esecuzione del programma. Il thread principale viene creato automaticamente all'avvio del programma. Questo thread esegue il metodo principale del programma. È responsabile dell'esecuzione della logica principale del programma Java e della gestione delle operazioni di input dell'utente. Il thread principale funge da thread di base da cui vengono generati tutti gli altri thread figlio.

178. Cos'è un thread daemon?
Un thread daemon in Java è un thread a bassa priorità utilizzato per eseguire operazioni o attività in background utilizzate per l'esecuzione continua. come Garbage collection, invii di segnali, ascoltatori di azioni, ecc. I thread daemon in Java hanno una priorità inferiore rispetto ai thread utente, il che significa che possono essere eseguiti solo quando nessun thread utente è in esecuzione. I thread daemon in Java sono funzionalità utili richieste per le attività in background che non richiedono l'arresto o la finalizzazione esplicita. Consente un utilizzo più efficiente delle risorse di sistema e viene utilizzato per semplificare le risorse e può semplificare le attività a lunga esecuzione.
179. Quali sono i modi in cui un thread può entrare nello stato di attesa?
Il thread è un processo leggero che viene eseguito contemporaneamente all'altro thread all'interno di un singolo processo. Ogni thread può eseguire un'attività diversa e condividere le risorse all'interno di un singolo processo. Il thread in Java può entrare nello stato di attesa in molti modi diversi:
- Metodo Sleep() Chiamata: Il sonno () viene utilizzato per mettere in pausa l'esecuzione del thread per un periodo di tempo specifico. Mentre il thread è in pausa entra nello stato di attesa.
- Metodo Wait(): Questo metodo viene utilizzato per attendere un thread finché l'altro thread non gli segnala di riattivarsi. Il thread entra nello stato di attesa finché non riceve una notifica da un altro thread.
- Metodo Join(): Il metodo Join() può essere utilizzato per attendere che il thread termini l'esecuzione. Il thread chiamante entra nello stato di attesa finché il thread di destinazione non viene completato.
- In attesa delle operazioni di I/O: Se il thread è in attesa del completamento dell'operazione di input/output, entra nello stato di attesa fino al termine dell'operazione.
- Problemi di sincronizzazione: Se sono presenti problemi di sincronizzazione in un'applicazione multi-thread, i thread potrebbero entrare nello stato di attesa finché i problemi di sincronizzazione non verranno risolti.
180. Come avviene il multi-threading su un computer con una singola CPU?
Java utilizza una tecnica chiamata time-sharing, comunemente denominata time-slicing, per implementare il multi-threading su computer con una singola CPU. L'aspetto dell'esecuzione parallela viene creato dalla CPU che passa tra thread attivi. Il sistema operativo è responsabile dell'allocazione del tempo della CPU a ciascun thread in sequenza e della pianificazione dei thread.
Per impedire ai thread di interagire tra loro e creare situazioni di competizione o altri problemi, Java dispone di diversi modi per governare il comportamento dei thread, inclusa la sincronizzazione e il blocco. È possibile creare programmatori multi-thread che funzionino correttamente ed efficacemente su una macchina con una singola CPU regolando l'interazione tra i thread e assicurandosi che le parti cruciali del codice siano sincronizzate. A differenza dell'esecuzione dello stesso programma su un computer con più CPU o core, il multi-threading su una singola CPU può dare solo l'apparenza di parallelismo e gli effettivi miglioramenti delle prestazioni possono essere modesti. Il sistema operativo divide il tempo della CPU disponibile quando numerosi thread sono in esecuzione su una singola CPU in piccoli intervalli di tempo e assegna a ciascun thread un intervallo di tempo da eseguire. Il rapido passaggio tra i thread da parte del sistema operativo crea l'apparenza di un'esecuzione parallela. Il passaggio da un thread all'altro sembra essere immediato perché gli intervalli di tempo sono spesso molto piccoli, dell'ordine di millisecondi o microsecondi.
Domande di intervista Java per esperti
181. Quali sono i diversi tipi di priorità dei thread in Java? E qual è la priorità predefinita di un thread assegnato da JVM?
Le priorità nei thread sono un concetto in cui ogni thread ha una priorità che in parole povere si può dire che ogni oggetto ha priorità qui che è rappresentata da numeri che vanno da 1 a 10. Esistono diversi tipi di proprietà del thread in Java menzionati di seguito:
- MIN_PRIORITY
- MAX_PRIORITÀ
- NORM_PRIORITÀ
Per impostazione predefinita, al thread viene assegnata NORM_PRIORITY.
182. Perché è necessaria la Garbage Collection in Java?
Per Java, la Garbage Collection è necessaria per evitare perdite di memoria che possono causare l'arresto anomalo del programma e renderlo instabile. Non c'è modo di evitare la raccolta dei rifiuti in Java. A differenza di C++, la Garbage Collection in Java aiuta i programmatori a concentrarsi sullo sviluppo dell'applicazione invece di gestire le risorse di memoria e preoccuparsi della perdita di memoria. Java Virtual Machine (JVM) gestisce automaticamente periodicamente la memoria eseguendo un garbage collector che libera la memoria inutilizzata nell'applicazione. La Garbage Collection rende efficiente la memoria Java perché rimuove gli oggetti senza riferimenti dalla memoria heap.
183. Qual è lo svantaggio della Garbage Collection?
Oltre a molti vantaggi, Garbage Collector presenta alcuni inconvenienti menzionati di seguito:
- Lo svantaggio principale della Garbage Collection è che può causare pause nell'esecuzione di un'applicazione poiché lavora per liberare la memoria, rallentando le prestazioni dell'applicazione.
- Il processo di Garbage Collection non è deterministico, il che rende difficile prevedere quando si verifica la Garbage Collection, causando comportamenti imprevedibili nelle applicazioni. Ad esempio, se scriviamo un programma, sarà difficile per i programmatori decidere se il problema è causato dalla garbage collection o da qualsiasi altro fattore nel programma.
- La Garbage Collection può anche aumentare l'utilizzo della memoria se il programma crea ed elimina molti oggetti di breve durata.
184. Spiegare la differenza tra garbage collection minore, maggiore e completa.
La Java Virtual Machine (JVM) rimuove gli oggetti che non sono più in uso utilizzando un garbage collector che controlla e rimuove periodicamente questi oggetti. Esistono diversi tipi di Garbage Collection nella JVM, ciascuno con caratteristiche e implicazioni sulle prestazioni diverse. Le principali tipologie di garbage collection sono:
- Raccolta rifiuti minori: Conosciuto anche come Garbage Collection di nuova generazione, questo tipo di Garbage Collection viene utilizzato per raccogliere e recuperare la memoria utilizzata da oggetti di breve durata (oggetti che vengono creati e scartati rapidamente).
- Raccolta principale dei rifiuti: Conosciuto anche come Garbage Collection di vecchia generazione, questo tipo di Garbage Collection viene utilizzato per raccogliere e recuperare la memoria utilizzata da oggetti di lunga durata (oggetti che sopravvivono a più Garbage Collection minori e vengono promossi alla vecchia generazione).
- Raccolta rifiuti completa: Durante la raccolta completa dei rifiuti, vengono raccolti e recuperati i ricordi di tutte le generazioni, compresi i ricordi di giovani e anziani. Una Garbage Collection completa normalmente richiede più tempo per essere completata rispetto a una Garbage Collection minore o maggiore che causa la sospensione temporanea dell'app.
185. Come identificherai le raccolte di rifiuti maggiori e minori in Java?
La raccolta dei rifiuti principale funziona nello spazio dei sopravvissuti e la raccolta dei rifiuti minori funziona nello spazio dell'Eden per eseguire una routine di marcatura e spazzamento. E possiamo identificarli entrambi in base all'output in cui la raccolta minore stampa GC, mentre la raccolta principale stampa GC completo nel caso in cui la registrazione della garbage collection sia abilitata con -XX:PrintGCDetails o verbose:gc.
186. Che cos'è una perdita di memoria e in che modo influisce sulla garbage collection?
In Java le perdite di memoria possono essere causate da una varietà di fattori, come la mancata chiusura delle risorse in modo corretto, il mantenimento dei riferimenti agli oggetti più a lungo del necessario o la creazione di troppi oggetti inutilmente. Esistono situazioni in cui il Garbage Collector non raccoglie oggetti perché è presente un riferimento a tali oggetti. In queste situazioni in cui l'applicazione crea molti oggetti e non li utilizza e ogni oggetto ha dei riferimenti validi, un Garbage Collector in Java non può distruggere gli oggetti. Questi oggetti inutili che non forniscono alcun valore al programma sono noti come perdite di memoria. Le perdite di memoria possono avere un impatto negativo sulla Garbage Collection impedendo al Garbage Collector di recuperare la memoria inutilizzata. Questo comportamento porterà a un rallentamento delle prestazioni o talvolta a un errore del sistema. In un programma è importante evitare perdite di memoria gestendo correttamente le risorse e i riferimenti agli oggetti.
Esempio:
Giava
// Java Program to demonstrate memory leaks import java.io.*; import java.util.Vector; class GFG { public static void main(String[] args) { Vector a = new Vector(21312312); Vector b = new Vector(2147412344); Vector c = new Vector(219944); System.out.println('Memory Leak in Java'); } }> Produzione:
Exception in thread 'main' java.lang.OutOfMemoryError: Java heap space at java.base/java.util.Vector.(Vector.java:142) at java.base/java.util.Vector.(Vector.java:155) at GFG.main(GFG.java:9)>
187. Nomina alcune classi presenti nel pacchetto java.util.regex.
Le espressioni regolari o Regex in Java sono un'API utilizzata per la ricerca e la manipolazione di stringhe in Java. Crea modelli di stringhe in grado di estrarre i dati necessari dalle stringhe o di generalizzare un modello.
Ci sono 3 classi presenti in java.util.regex menzionate di seguito:
- Classe Pattern: può definire pattern
- Classe Matcher: può eseguire operazioni di corrispondenza sul testo utilizzando modelli
- Classe PatternSyntaxException: può indicare un errore di sintassi in un modello di espressione regolare.
Inoltre, oltre alle 3 classi, il pacchetto è costituito da un'unica interfaccia MatchResult Interface che può essere utilizzata per rappresentare il risultato di un'operazione di corrispondenza.
188. Scrivi un'espressione regolare per convalidare una password. Una password deve iniziare con un alfabeto e seguita da caratteri alfanumerici; La sua lunghezza deve essere compresa tra 8 e 20.
regex = ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&-+=()])(?=S+$).{8, 20}$>Spiegazione:
- ^ utilizzato per il carattere iniziale della stringa.
- (?=.*[0-9]) utilizzato per una cifra deve verificarsi almeno una volta.
- (?=.*[a-z]) utilizzato per un alfabeto minuscolo deve verificarsi almeno una volta.
- (?=.*[A-Z]) utilizzato per un alfabeto maiuscolo che deve essere presente almeno una volta nella sottostringa.
- (?=.*[@#$%^&-+=()] utilizzato per un carattere speciale che deve verificarsi almeno una volta.
- (?=S+$) gli spazi bianchi non sono ammessi nell'intera stringa.
- .{8, 20} utilizzato per almeno 8 caratteri e al massimo 20 caratteri.
- $ utilizzato per la fine della stringa.
189. Cos'è JDBC?
JDBC L'API standard viene utilizzata per collegare applicazioni Java e database relazionali. Fornisce una raccolta di classi e interfacce che consentono ai programmatori di utilizzare il linguaggio di programmazione Java per comunicare con il database. Le classi e l'interfaccia di JDBC consentono all'applicazione di inviare richieste effettuate dagli utenti al database specificato. Esistono generalmente quattro componenti di JDBC mediante i quali interagisce con il database:
- API JDBC
- Gestore driver JDBC
- Suite di test JDBC
- Driver bridge JDBC-ODBC

190. Cos'è il driver JDBC?
Driver JDBC è un componente software utilizzato per consentire a un'applicazione Java di interagire con il database. JDBC fornisce l'implementazione dell'API JDBC per uno specifico sistema di gestione del database, che gli consente di connettere il database, eseguire istruzioni SQL e recuperare dati. Esistono quattro tipi di driver JDBC:
- Driver ponte JDBC-ODBC
- Driver API nativo
- Driver del protocollo di rete
- Driver sottile

191. Quali sono i passaggi per connettersi al database in Java?
Esistono alcuni passaggi per connettere il database e il programma Java come indicato di seguito:
- Importa i pacchetti
- Caricare i driver utilizzando il metodo forName()
- Registra i driver utilizzando DriverManager
- Stabilire una connessione utilizzando l'oggetto della classe Connection
- Crea una dichiarazione
- Esegui la query
- Chiudere le connessioni
192. Quali sono i componenti API JDBC?
I componenti API JDBC forniscono vari metodi e interfacce per una facile comunicazione con i database, inoltre forniscono pacchetti come Java Se e Java EE che forniscono la funzionalità di scrittura una volta eseguita ovunque (WORA).
Sintassi:
java.sql.*;>
193. Cos'è l'interfaccia di connessione JDBC?
L'interfaccia di connettività del database Java (JDBC) è un componente software che consente alle applicazioni Java di interagire con i database. Per migliorare la connessione, JDBC richiede driver per ciascun database.
194. Cosa interfaccia JDBC ResultSet?
L'interfaccia JDBC ResultSet viene utilizzata per memorizzare i dati dal database e utilizzarli nel nostro programma Java. Possiamo anche utilizzare ResultSet per aggiornare i dati utilizzando i metodi updateXXX(). L'oggetto ResultSet punta il cursore prima della prima riga dei dati del risultato. Utilizzando il metodo next(), possiamo scorrere il ResultSet.
195. Cos'è il set di righe JDBC?
Un RowSet JDBC fornisce un modo per archiviare i dati in formato tabellare. RowSet è un'interfaccia in Java che può essere utilizzata all'interno del pacchetto java.sql. La connessione tra l'oggetto RowSet e l'origine dati viene mantenuta per tutto il suo ciclo di vita. I RowSet sono classificati in cinque categorie in base all'implementazione menzionata di seguito:
- JdbcRowSet
- Set di righe memorizzate nella cache
- WebRowSet
- Set di righe filtrato
- Partecipa a RowSet
196. Qual è il ruolo della classe JDBC DriverManager?
La classe JDBC DriverManager funge da interfaccia per utenti e driver. Viene utilizzato in molti modi come indicato di seguito:
- Viene utilizzato per creare una connessione tra un'applicazione Java e il database.
- Aiuta a tenere traccia dei driver disponibili.
- Può aiutare a stabilire una connessione tra un database e i driver appropriati.
- Contiene tutti i metodi che possono registrare e annullare la registrazione delle classi del driver del database.
- Il metodo DriverManager.registerDriver() può mantenere l'elenco delle classi Driver che si sono registrate.
Domande per l'intervista sulla differenza Java
197. Distinguere tra Iterable e Iterator.
Iterabile | Iteratore |
|---|---|
Iterable fornisce un modo per scorrere una sequenza di elementi. | Iterator aiuta a scorrere una raccolta di elementi in sequenza. |
| iteratore() Il metodo restituisce un Iterator. | haNext() E Prossimo() sono necessari metodi. |
| rimuovere() il metodo è facoltativo. | rimuovere() il metodo è richiesto nell'iteratore. |
Gli esempi sono Elenco, Coda e Imposta. | Gli esempi sono ListIterator, Enumerazione e ArrayIterator. |
198. Distinguere tra Lista e Insieme.
Elenco | Impostato |
|---|---|
Ordinato | Non ordinato |
L'elenco consente duplicati. | Il set non consente valori duplicati. |
L'accesso all'elenco avviene tramite indice. | L'accesso al set avviene tramite hashcode. |
È possibile memorizzare più elementi nulli. | L'elemento nullo può essere memorizzato solo una volta. |
Esempi sono ArrayList, LinkedList, ecc. | Esempi sono HashSet e TreeSet. LinkedHashSet ecc. |
199. Distinguere tra Lista e Mappa.
Elenco | Carta geografica |
|---|---|
L'interfaccia dell'elenco consente elementi duplicati. | La mappa non consente elementi duplicati. |
L'elenco mantiene l'ordine di inserimento. | La mappa non mantiene l'ordine di inserimento. |
È possibile memorizzare più elementi nulli. | La mappa consente al massimo una singola chiave nulla e un numero qualsiasi di valori nulli. |
L'elenco fornisce il metodo get() per ottenere l'elemento in un indice specificato. | La mappa non fornisce un metodo get per ottenere gli elementi in un indice specificato. |
L'elenco è implementato da ArrayList, ecc. | La mappa è implementata da HashMap, TreeMap, LinkedHashMap |
200. Distinguere tra coda e pila.
Coda | Pila |
|---|---|
La struttura dei dati della coda viene utilizzata per memorizzare elementi e viene utilizzata per eseguire operazioni come accodamento, rimozione dalla coda o dalla fine della coda. | La struttura dei dati dello stack viene utilizzata per memorizzare elementi e viene utilizzata per eseguire operazioni come push, pop dalla cima dello stack. |
Struttura dei dati della coda Implementa l'ordine FIFO. | Struttura dei dati dello stack Implementa l'ordine LIFO. |
L'inserimento e la cancellazione nelle code avviene dalle estremità opposte della lista. La cancellazione avviene dalla parte anteriore dell'elenco e l'inserimento avviene nella parte posteriore dell'elenco. | L'inserimento e la cancellazione negli stack avviene solo da un'estremità della lista detta top. |
L'operazione di inserimento è chiamata operazione di accodamento. | L'operazione di inserimento è chiamata operazione Push. |
La coda viene generalmente utilizzata per risolvere problemi relativi all'elaborazione sequenziale. | Lo stack viene generalmente utilizzato per risolvere problemi legati alla ricorsione. |
201. Distinguere tra PriorityQueue e TreeSet.
Coda prioritaria | Set di alberi |
|---|---|
Utilizza Queue come struttura dati sottostante. | Utilizza un Set come struttura dati sottostante. |
Questa struttura dati consente elementi duplicati | Questa struttura dati non consente elementi duplicati |
La coda prioritaria è implementata dalla classe PriorityQueue. | TreeSet è implementato dalla classe TreeSet. |
PriorityQueue è disponibile in JDK 1.5. | TreeSet è disponibile in JDK 1.4. |
PriorityQueue pq = new PriorityQueue(); | reeSet ts = nuovo TreeSet(); |
202. Distinguere tra Lista concatenata singola e Lista concatenata doppiamente.
Elenco collegato singolarmente | Elenco doppiamente collegato |
|---|---|
L'elenco collegato singolarmente contiene solo due segmenti, ovvero Dati e Collegamento. | L'elenco doppiamente collegato contiene tre segmenti, ovvero Dati e due puntatori. |
L'attraversamento di una lista concatenata singolarmente è possibile solo in avanti. | L'attraversamento di una lista doppiamente concatenata è possibile solo in entrambe le direzioni, sia in avanti che all'indietro. |
Utilizza meno memoria poiché ogni singolo nodo ha un solo puntatore. | Richiede più memoria di un elenco collegato singolarmente poiché ciascun nodo ha due puntatori. |
Facile da usare e inserire i nodi all'inizio dell'elenco. | Leggermente più complesso da usare e facile da inserire alla fine della lista. |
La complessità temporale dell'inserimento e della cancellazione è O(n). | La complessità temporale dell'inserimento e della cancellazione è O(1). |
| | |
203. Distinguere tra Failfast e Failsafe.
FailFast | FailSafe |
|---|---|
Failsfast fallisce immediatamente quando rileva modifiche simultanee durante il periodo di iterazione. | Failsafe continua a ripetere la raccolta originale e crea anche una copia da modificare. |
Failfast viene generalmente utilizzato in ambienti a thread singolo. | Failsafe viene utilizzato in ambienti multithread. |
Failfast non consente alcuna modifica durante l'iterazione. | Failsafe consente la modifica durante il tempo di iterazione. |
Failfast è veloce rispetto a failsafe poiché non comporta la copia della raccolta. | Il failsafe è generalmente lento rispetto al failfast. |
Lanci FailFast ConcurrentModificationException se la raccolta viene modificata durante l'iterazione. | FailSafe non genera alcuna eccezione ma crea invece una copia della raccolta da iterare. |
204. Distinguere tra HashMap e TreeMap.
HashMap | Mappa ad albero |
|---|---|
Hasmap utilizza una tabella hash per memorizzare coppie chiave-valore. | Treemap utilizza alberi rosso-neri per archiviare la coppia chiave-valore. |
Hashmap non mantiene alcun ordine specifico per le coppie chiave-valore. | Treemap mantiene un ordinamento naturale basato sulle chiavi. |
L'ordine di iterazione non è garantito nell'hashmap. | L'iterazione è ordinata in base alle chiavi. |
Le hashmap sono più veloci per il recupero rispetto a Treemap. | Il recupero in Treemap è più lento poiché utilizza l'attraversamento dell'albero per trovare le chiavi. |
Hashmap viene implementato utilizzando un array di elenchi collegati. | TreeMap è implementato utilizzando un albero rosso-nero. |
Hashmap utilizza il metodo equals() della classe Object per confrontare le chiavi. | TreeMap utilizza il metodo compareTo() per confrontare le chiavi. |
205. Distinguere tra coda e deque.
Coda | Riguardo a cosa |
|---|---|
La coda è una struttura di dati lineare utilizzata per archiviare una raccolta di elementi. | La deque nota anche come coda a doppia estremità è anche una struttura di dati lineare che memorizza una raccolta di elementi con operazioni da rimuovere e aggiungere da entrambe le estremità. |
Gli elementi in coda possono essere inseriti solo alla fine della struttura dati. | Gli elementi possono essere inseriti da entrambe le estremità della struttura dati. |
La coda può essere implementata utilizzando Array o Elenco collegato. | La rimozione della coda può essere implementata utilizzando l'array circolare o l'elenco doppiamente collegato. |
Le code vengono generalmente utilizzate per implementare una lista di attesa o una coda di attività. | Deque viene utilizzato per implementare uno stack o rimuovere dalla coda elementi da entrambe le estremità. |
| | |
206. Distinguere tra HashSet e TreeSet.
HashSet | Set di alberi |
|---|---|
HashSet non è ordinato. | TreeSet si basa sull'ordinamento naturale. |
HashSet consente elementi null. | TreeSet non consente elementi null. |
HashSet è implementato dalla classe HashSet. | TreeSet è implementato dalla classe TreeSet. |
HashSet hs = nuovo HashSet(); | TreeSet ts = nuovo TreeSet(); |
Domande per l'intervista su Java - Domande frequenti
Q1. Qual è lo stipendio di uno sviluppatore Java in India?
Secondo varie risorse, lo stipendio medio di uno sviluppatore backend Java è superiore a 14 lakh all'anno, ovvero il 30% in più rispetto a qualsiasi altro ruolo di sviluppatore . Qui puoi anche controllare il nostro ultimo corso su Portale pratico GeekforGeeks può anche essere utile.
Q5. Come posso distinguermi in un'intervista Java?
Per distinguerti in un'intervista Java, dimostra una profonda comprensione dei concetti Java e delle applicazioni pratiche. Mostra le tue capacità di problem solving spiegando il tuo approccio a scenari complessi e fornendo soluzioni efficienti. Inoltre, evidenzia eventuali progetti o contributi rilevanti che hai apportato alla comunità Java. Anche mostrare entusiasmo, buona comunicazione e volontà di apprendere può lasciare un’impressione positiva.



