- Tralascerò le domande che si intersecano con questa serie di articoli per non duplicare ancora una volta le informazioni. Consiglio di leggere questi materiali poiché contengono le domande più comuni (popolari) dell'intervista Java Core.
- Le domande sulla DOU sono presentate in ucraino, ma qui avrò tutto in russo.
- Le risposte potrebbero essere descritte in modo più dettagliato, ma non lo farò, dato che la risposta ad ogni domanda potrebbe richiedere un intero articolo. E non ti chiederanno dettagli così dettagliati in nessun colloquio.
11. Assegna un nome a tutti i metodi della classe Object
La classe Object ha 11 metodi:- Class<?> getClass() — ottiene la classe dell'oggetto corrente;
- int hashCode() : ottiene il codice hash dell'oggetto corrente;
- booleano uguale(Oggetto obj) - confronto dell'oggetto corrente con un altro;
- Object clone() - crea e restituisce una copia dell'oggetto corrente;
- String toString() — ottenere una rappresentazione di stringa di un oggetto;
- void notify() - risveglia un thread in attesa sul monitor di questo oggetto (la selezione del thread è casuale);
- void notifyAll() - risveglia tutti i thread in attesa sul monitor di questo oggetto;
- void wait() - mette il thread corrente in modalità standby (lo blocca) sul monitor corrente, funziona solo in un blocco sincronizzato finché qualche notifica o notifyAll non riattiva il thread;
- void wait(long timeout) - congela anche il thread corrente sul monitor corrente (su quello attualmente sincronizzato), ma con un timer per uscire da questo stato (o ancora: finché notify o notifyAll non si sveglia);
- void wait(long timeout, int nanos) - un metodo simile a quello sopra descritto, ma con timer più precisi per uscire dal congelamento;
- void finalize() - prima di eliminare questo oggetto, il garbage collector chiama questo metodo (finalmente). Viene utilizzato per ripulire le risorse occupate.
12. Qual è la differenza tra try-with-resources e try-catch-finally quando si ha a che fare con le risorse?
In genere, quando si utilizza try-catch-finally, il blocco finale veniva utilizzato per chiudere le risorse. Java 7 ha introdotto un nuovo tipo di operatore try-with-resources , un analogo di try-catch-finalmente per liberare risorse, ma più compatto e leggibile. Ricordiamo come appare try-catch-finally :String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Ora riscriviamo questo codice, ma utilizzando try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
In qualche modo è diventato più facile, non credi? Oltre alla semplificazione, ci sono un paio di punti:
-
In try-with-resources , le risorse dichiarate tra parentesi (che verranno chiuse) devono implementare l'interfaccia AutoCloseable e il suo unico metodo, close() .
Il metodo close viene eseguito in un implicito last block , altrimenti come farà il programma a capire esattamente come chiudere una determinata risorsa?
Ma, molto probabilmente, raramente scriverai le tue implementazioni delle risorse e il loro metodo di chiusura.
-
Sequenza di esecuzione del blocco:
- prova a bloccare .
- Implicito, infine .
- Un blocco catch che rileva le eccezioni nei passaggi precedenti.
- Finalmente esplicito .
Di norma, le eccezioni che appaiono più in basso nell'elenco interrompono quelle che appaiono più in alto.
13. Cosa sono le operazioni bit a bit?
Le operazioni bit a bit sono operazioni su stringhe di bit che includono operazioni logiche e spostamenti bit a bit. Operazioni logiche:-
AND bit a bit : confronta i valori dei bit e, nel processo, qualsiasi bit impostato su 0 (falso) imposta il bit corrispondente nel risultato come 0. Cioè, se in entrambi i valori confrontati il bit era 1 (vero), il anche il risultato sarà 1.
Indicato come - AND , &
Esempio: 10111101 e 01100111 = 00100101
-
L'OR bit a bit è l'operazione inversa della precedente. Qualsiasi bit impostato su 1 imposta un bit simile nel risultato come 1. Di conseguenza, se il bit era 0 in entrambi i valori confrontati, anche il bit risultante sarà 0.
Indicato come -OR , |
Esempio: 10100101 | 01100011 = 11100111
-
NOT bit a bit : applicato a un valore, capovolge (inverte) i bit. Cioè, quei bit che erano 1 diventeranno 0; e quelli che erano 0 diventeranno 1.
Indicato come - NOT , ~
Esempio: ~10100101 = 01011010
OR esclusivo bit per bit : confronta i valori dei bit e se in entrambi i valori il bit è uguale a 1, il risultato sarà 0 e se in entrambi i valori il bit è 0, il risultato sarà 0. Cioè, affinché il risultato sia uguale a 1, solo uno dei bit deve essere uguale a 1 e il secondo è uguale a 0. Indicato come -XOR , ^
Esempio: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Quali classi immutabili standard sono oggetti in Java?
Immutabile è un oggetto che non consente la modifica dei suoi parametri originali. Potrebbe avere metodi che restituiscono nuovi oggetti di un determinato tipo, con parametri che desideri modificare. Alcuni oggetti immutabili standard:- L'oggetto immutabile di gran lunga più famoso in Java è String;
- istanze di classi wrapper che racchiudono tipi standard: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
- oggetti che vengono solitamente utilizzati per numeri particolarmente GRANDI: BigInteger e BigDecimal;
- un oggetto che è un'unità in stacktrace (ad esempio, in un'eccezione stacktrace) StackTraceElement;
- un oggetto della classe File: può modificare i file, ma allo stesso tempo è immutabile;
- UUID - che viene spesso utilizzato come ID univoco per gli elementi;
- tutti gli oggetti classe del pacchetto java.time;
- Locale: utilizzato per definire una regione geografica, politica o culturale.
15. Quali sono i vantaggi di un oggetto immutabile rispetto agli oggetti normali?
- Tali oggetti sono sicuri se utilizzati in un ambiente multi-thread . Utilizzandoli, non devi preoccuparti di perdere dati a causa delle condizioni di thread race. A differenza del lavoro con oggetti ordinari: in questo caso dovrai pensare con molta attenzione ed elaborare i meccanismi per utilizzare l'oggetto in un ambiente parallelo.
- Gli oggetti immutabili sono buone chiavi in una mappa, perché se usi un oggetto mutabile e poi l'oggetto cambia il suo stato, può creare confusione quando usi una HashMap: l'oggetto sarà ancora presente e se usi contieneKey() potrebbe non farlo Essere trovato.
- Gli oggetti immutabili sono ottimi per archiviare dati immutabili (costanti) che non dovrebbero mai essere modificati mentre il programma è in esecuzione.
- "Atomicità al fallimento": se un oggetto immutabile genera un'eccezione, non rimarrà comunque in uno stato indesiderato (rotto).
- Queste classi sono facili da testare.
- Non sono necessari meccanismi aggiuntivi come un costruttore di copie e un'implementazione di clonazione.
Domande sull'OOP
16. Quali sono i vantaggi dell'OOP in generale e rispetto alla programmazione procedurale?
Quindi, i vantaggi dell'OOP:- Le applicazioni complesse sono più facili da scrivere rispetto alla programmazione procedurale, poiché tutto è suddiviso in piccoli moduli - oggetti che interagiscono tra loro - e di conseguenza la programmazione si riduce alle relazioni tra gli oggetti.
- Le applicazioni scritte utilizzando la programmazione orientata agli oggetti sono molto più facili da modificare (a condizione che vengano seguiti i concetti di progettazione).
- Poiché i dati e le operazioni su di esso formano un'unica entità, non vengono sparsi in tutta l'applicazione (cosa che spesso accade con la programmazione procedurale).
- L'incapsulamento delle informazioni protegge i dati più critici dall'utente.
- È possibile riutilizzare lo stesso codice con dati diversi, perché le classi consentono di creare molti oggetti, ognuno dei quali ha i propri valori di attributo.
- L'ereditarietà e il polimorfismo consentono inoltre di riutilizzare ed estendere il codice esistente (invece di duplicare funzionalità simili).
- Estendibilità dell'applicazione più semplice rispetto a un approccio procedurale.
- L'approccio OOP consente di astrarre dai dettagli di implementazione.
17. Raccontaci quali carenze ci sono nell'OOP
Purtroppo sono presenti anche:- L'OOP richiede molte conoscenze teoriche che devono essere padroneggiate prima di poter scrivere qualsiasi cosa.
- Le idee dell’OOP non sono così facili da comprendere e applicare nella pratica (bisogna essere un po’ filosofi in fondo).
- Quando si utilizza OOP, le prestazioni del software sono leggermente ridotte a causa dell'organizzazione più complessa del sistema.
- L'approccio OOP richiede più memoria, poiché tutto è costituito da classi, interfacce, metodi, che occupano molta più memoria rispetto alle normali variabili.
- Il tempo necessario per l’analisi iniziale è maggiore rispetto a quello procedurale.
18. Cos'è il polimorfismo statico e dinamico
Il polimorfismo consente agli oggetti di comportarsi in modo diverso per la stessa classe o interfaccia. Esistono due tipi di polimorfismo, noti anche come legame precoce e tardivo . Polimorfismo statico o legame precedente:- si verifica in fase di compilazione (all'inizio del ciclo di vita del programma);
- decide quale metodo eseguire in fase di compilazione;
- Il sovraccarico del metodo è un esempio di polimorfismo statico;
- l'associazione anticipata include metodi privati, statici e terminali;
- l'ereditarietà non è coinvolta nell'associazione anticipata;
- Il polimorfismo statico non coinvolge oggetti specifici, ma informazioni sulla classe, il cui tipo è rappresentato a sinistra del nome della variabile.
- si verifica in fase di esecuzione (mentre il programma è in esecuzione);
- il polimorfismo dinamico decide quale implementazione specifica avrà un metodo in fase di esecuzione;
- l'override del metodo è un esempio di polimorfismo dinamico;
- l'associazione tardiva è l'assegnazione di un oggetto specifico, un riferimento al suo tipo o alla sua superclasse;
- l'ereditarietà è associata al polimorfismo dinamico.
GO TO FULL VERSION