Una guida per il futuro sviluppatore Java. Intervista e carriera. Interviste agli sviluppatori Middle Java Intervista Java Domande frequenti

Mi sono trasferito in un'altra città, trovo lavoro, vado a colloqui. Mi è sembrato che le domande che ci vengono poste, sebbene conosciute, tuttavia raccolte insieme, possano aiutare a prepararsi e sentirsi più sicuri.

Domande per comprendere i principi di costruzione di un DBMS.
1. Qual è la prima forma normale e il processo di normalizzazione? Quali sono le forme normali?
2. Qual è il significato dell'indice DBMS, come sono disposti, come vengono archiviati? Come implementeresti la stessa funzionalità? L'ultima domanda viene posta se non c'è una chiara comprensione degli indici.
3. Disegna una relazione Molti-a-Molti. Ad esempio: tabelle Autori e Libri. Un autore può avere più libri e un libro può essere scritto da più autori. Componi una query SQL per selezionare i libri di un autore specifico.

Domande di base su Java.
4. La classe base in Java è nota per essere Object. Quali metodi puoi nominare?
5. Dicci cosa sono uguali e hashCode? Quali regole e convenzioni esistono per l'implementazione di questi metodi? Quando si applicano?
6. Parlaci dei metodi di attesa, notifica, notifica Tutti. Come si usano, quando, perché servono? Cosa è sincronizzato?
7. Che cos'è finalizzare? Perché è necessario? Cosa puoi dire del Garbage Collector e dei suoi algoritmi.
8. Perché il metodo clone è dichiarato protetto? Cosa è necessario per implementare la clonazione?
9. Quali sono i modificatori (accesso e altri)? Cos'è volatile e transitorio? Per cosa e in quali casi sarebbe possibile utilizzare default?

Framework di raccolta Java
10. Quali sono le interfacce di raccolta in Java? Spiega come differiscono.
11. Quali implementazioni conosci di queste interfacce?
12. Qual è la differenza tra ArrayList e LinkedList. Come sono disposti? Quando dovrebbero essere usati.
13. Qual è la differenza tra HashMap e TreeMap? Come sono impostati e come funzionano? E con il tempo di accesso agli oggetti, quali dipendenze?
14. Che cos'è Hashtable, in che cosa differisce da HashMap? Ad oggi è stato deprecato, come si utilizza ancora la funzionalità desiderata?

Eccezioni
15. Che cos'è un'eccezione? Quali tipi di eccezioni conosci, in che cosa differiscono?
16. È possibile proporre un puzzle con blocchi try-catch-finally e la domanda su cosa verrà restituito o quale eccezione verrà eventualmente superata?

Algoritmi
17. Quali algoritmi di ordinamento conosci? Che tipo di algoritmi conosci?
Inoltre, qui sono possibili varie domande aggiuntive sulla stima della complessità degli algoritmi, sul loro confronto tra loro.

Modelli di progettazione.
18. Conosce qualche modello di progettazione?
19. Scrivi un Singleton... E con il caricamento lento. E se avesse bisogno di essere thread-safe? Quando è peggio il caricamento lento?
20. Cosa puoi dire di MVC? Disegna un diagramma e spiega come funziona MVC.

Una serie di domande per comprendere la suite tecnologica J2EE.
21. Cos'è un servlet, jsp, la loro differenza?
22. Cos'è l'Ajax? Come è fondamentalmente organizzata questa tecnologia?
23. Che cos'è un ORM, come può essere tradotto e come dovrebbe funzionare?

Semplici compiti per la scrittura di algoritmi.
24. Scrivete una funzione per calcolare il fattoriale.
25. Data una funzione per calcolare i numeri di Fibonacci, è noto che funziona. Trova l'errore logico. Stimare la complessità dell'algoritmo risultante.
26. Invertire la stringa.
27. Calcolare la media dell'array.

È utile ricordare che quando non ti senti molto sicuro, non hai bisogno di dire parole in più. Dici una parola in più e loro si aggrappano ad essa, srotolano la catena. Esaltano cose di cui non sono molto sicuri. Questa capacità delle persone - di aggrapparsi - va usata, ma a tuo vantaggio ;-)

Conoscenza e comprensione... le cose sono abbastanza diverse, quindi
- algoritmi diversi, come l'ordinamento, dovrebbero essere scritti da te, anche da un libro di testo. Guarda come differiscono l'uno dall'altro, confronta la loro complessità.
- è utile esaminare diverse utilità e librerie, i principi del raggruppamento delle classi in pacchetti e lo stile di scrittura del codice, commenti. Può aiutare molto nella comprensione dei modificatori di accesso e dell'organizzazione del progetto.
- comprendendo qualcosa di specifico, puoi aiutare chi ne sa meno. Vai a qualsiasi forum e prova a rispondere alle domande di interesse per l'argomento. Nella discussione, puoi prendere qualcosa per te. Puoi scrivere un breve articolo. Ovviamente è necessario comprendere bene l'argomento.
Qualsiasi lavoro finalizzato al miglioramento delle proprie qualifiche sarà visibile ad un intervistatore competente e non sarà lasciato senza attenzione. L'unica cosa di cui hai bisogno per parlarne onestamente, non sottovalutare le tue capacità e capacità.
Per avere una sorta di punto di riferimento per la formazione o lo sviluppo di te stesso come specialista, puoi guardare qualcosa di simile a questo.

In realtà, le domande sopra elencate riguardano il livello Junior Developer, come lo immagino. Da qualche parte, forse più profondamente, da qualche parte meno, ma in realtà - Junior.

Ogni soluzione crea nuovi problemi.

Questa sezione è dedicata alle domande che possono essere poste quando si supera un colloquio per una posizione di programmatore Java.

L'obiettivo è raccogliere non solo le domande (ce ne sono molte su Internet), ma anche le risposte in un unico posto.

Per l'attribuzione, leggere nella pagina principale della sezione Intervista

  1. Quante parole chiave sono riservate dalla lingua, quali sono queste parole, quali non vengono utilizzate?
  2. In quali caratteri può essere costituito un nome di variabile (identificatore corretto)?
  3. Cosa significa la parola "inizializzazione"?
  4. Quali sono i principali gruppi di tipi di dati?
  5. Quali tipi primitivi conosci?
  6. Cosa sai sulla conversione di tipi di dati primitivi, c'è qualche perdita di dati, è possibile convertire il tipo booleano?
  7. Quali valori sono le variabili inizializzate di default?
  8. Come viene passato il valore di una variabile (per riferimento/valore)?
  9. Cosa sai della funzione principale, quali sono i prerequisiti per la sua definizione?
  10. Quali operazioni logiche e operatori conosci?
  11. Qual è la differenza tra la notazione degli operatori logici short e long?
  12. Che cos'è una tavola di verità?
  13. Che cos'è un operatore di selezione ternario?
  14. Quali operazioni aritmetiche unarie e binarie conosci?
  15. Quali operazioni bit a bit conosci?
  16. Qual è il ruolo e le regole per scrivere un'istruzione select (switch)?
  17. Quali cicli conosci, quali sono le loro differenze?
  18. Che cos'è una "iterazione di un ciclo"?
  19. Quali parametri ha il ciclo for, possono essere omessi?
  20. Quale istruzione viene utilizzata per interrompere immediatamente il ciclo?
  21. Quale istruzione viene utilizzata per passare all'iterazione successiva del ciclo?
  22. Che cos'è un array?
  23. Quali tipi di array conosci?
  24. Cosa sai delle classi wrapper?
  25. Che cos'è l'autopacking (boxing/unboxing)?

  1. Assegna un nome ai principi dell'OOP e descrivi ciascuno di essi.
  2. Definisci il termine "classe".
  3. Che cos'è un campo/attributo di classe?
  4. Come organizzare correttamente l'accesso ai campi della classe?
  5. Definire il termine "costruttore".
  6. Qual è la differenza tra costruttori predefiniti, costruttori di copia e un costruttore con parametri?
  7. Quali modifiche del livello di accesso conosci, parlaci di ciascuna di esse.
  8. Parlaci delle caratteristiche di una classe con un unico costruttore privato.
  9. Cosa dicono le parole chiave “questo”, “super”, dove e come possono essere utilizzate?
  10. Definire il termine "metodo".
  11. Che cos'è una firma del metodo?
  12. Quali metodi sono chiamati overload?
  13. I metodi non statici possono sovraccaricare quelli statici?
  14. Parlaci dei metodi di override.
  15. Un metodo può accettare un numero diverso di parametri (argomenti di lunghezza variabile)?
  16. È possibile restringere il livello di accesso/il tipo di restituzione durante l'override di un metodo?
  17. Come accedere ai metodi sovrascritti della classe genitore?
  18. Quali sono le trasformazioni top-down e bottom-up?
  19. Qual è la differenza tra override e sovraccarico?
  20. Dove possono essere inizializzati i campi statici/non statici?
  21. Perché è necessario l'operatore instanceof?
  22. Perché sono necessari e cosa sono i blocchi di inizializzazione?
  23. Qual è l'ordine di chiamata dei costruttori e dei blocchi di inizializzazione di due classi: un figlio e il suo predecessore?
  24. Dove e a cosa serve il modificatore astratto?
  25. È possibile dichiarare un metodo astratto e statico allo stesso tempo?
  26. Cosa significa la parola chiave statica?
  27. A quali costrutti Java si applica il modificatore statico?
  28. Cosa succede se si verifica un'eccezione in un blocco di codice statico?
  29. È possibile sovraccaricare un metodo statico?
  30. Che cos'è una classe statica, quali sono le caratteristiche del suo utilizzo?
  31. Quali sono le caratteristiche dell'inizializzazione delle variabili statiche finali?
  32. In che modo il modificatore static influisce su una classe/metodo/campo?
  33. Cosa significa la parola chiave finale?
  34. Definire il termine "interfaccia".
  35. Quali sono i modificatori predefiniti per i campi e i metodi dell'interfaccia?
  36. Perché un metodo di interfaccia non può essere dichiarato finale o statico?
  37. Quali tipi di classi ci sono in Java (nidificate... ecc.)
  38. Quali sono le caratteristiche della creazione di classi nidificate: semplici e statiche.
  39. Cosa sai delle classi nidificate, perché vengono utilizzate? Classificazione, casi d'uso, violazione dell'incapsulamento.
  40. Qual è la differenza tra classi nidificate e classi interne?
  41. Quali classi si chiamano anonime?
  42. Come accedere a un campo di una classe esterna da una classe nidificata?
  43. Come puoi accedere alla variabile locale di un metodo da una classe anonima dichiarata nel corpo di questo metodo? Ci sono restrizioni su una tale variabile?
  44. In che modo una classe personalizzata è correlata alla classe Object?
  45. Parlaci di ciascuno dei metodi della classe Object.
  46. Cos'è il metodo equals(). In che cosa differisce dall'operazione ==.
  47. Se vuoi sovrascrivere equals(), quali condizioni devono essere soddisfatte per il metodo sovrascritto?
  48. Se equals() viene sovrascritto, ci sono altri metodi che dovrebbero essere sovrascritti?
  49. Qual è la particolarità dei metodi hashCode e equals? Come vengono implementati i metodi hashCode e equals nella classe Object? Quali regole e convenzioni esistono per l'implementazione di questi metodi? Quando si applicano?
  50. Quale metodo restituisce una rappresentazione in stringa di un oggetto?
  51. Cosa succede se sovrascrivi equals senza sovrascrivere hashCode? Quali problemi potrebbero sorgere?
  52. C'è qualche guida su quali campi dovrebbero essere utilizzati durante il calcolo dell'hashCode?
  53. Pensi che ci saranno problemi se l'oggetto utilizzato come chiave nella hashMap cambia il campo che partecipa alla definizione di hashCode?
  54. Qual è la differenza tra una classe astratta e un'interfaccia, in quali casi la utilizzerai?
  55. È possibile accedere a variabili di classe private e, in caso affermativo, come?
  56. Cos'è volatile e transitorio? Per cosa e in quali casi sarebbe possibile utilizzare default?
  57. Espansione dei modificatori durante l'ereditarietà, l'override e l'occultamento dei metodi. Se una classe genitore ha un metodo privato, il figlio può estendere la sua visibilità? E se protetto? E per ridurre la visibilità?
  58. Ha senso dichiarare un metodo privato finale?
  59. Quali sono le caratteristiche dell'inizializzazione della variabile finale?
  60. Cosa succede se l'unico costruttore di classe viene dichiarato final?
  61. Cos'è la finalizzazione? Perché è necessario? Cosa puoi dire del Garbage Collector e dei suoi algoritmi.
  62. Perché il metodo clone è dichiarato protetto? Cosa è necessario per implementare la clonazione?
  63. Conoscete qualche modello di design?
  64. Scrivi un Singleton... Ma con caricamento lento. E se avesse bisogno di essere thread-safe? Quando è peggio il caricamento lento?
  65. Cosa puoi dire di MVC? Disegna un diagramma e spiega come funziona MVC.
  66. Scrivi una funzione per calcolare il fattoriale.
  67. Data una funzione per calcolare i numeri di Fibonacci, è noto che funziona. Trova l'errore logico. Stimare la complessità dell'algoritmo risultante.

  1. Definisci "esclusione"
  2. Qual è la gerarchia delle eccezioni.
  3. Posso/dovrei gestire gli errori di jvm?
  4. Quali sono i modi per gestire le eccezioni?
  5. Cosa significa la parola chiave throws?
  6. Cosa c'è di speciale nel blocco definitivo? È sempre soddisfatto?
  7. Non può esserci alcun blocco di cattura durante la cattura delle eccezioni?
  8. Riusciresti a pensare a una situazione in cui il blocco definitivo non sarebbe stato eseguito?
  9. Un singolo blocco catch può rilevare più eccezioni (dagli stessi rami di ereditarietà e da diversi)?
  10. Cosa sai delle eccezioni gestite e non gestite (selezionate/non controllate)?
  11. Cosa rende speciale RuntimeException?
  12. Come scrivere la tua eccezione ("personalizzata")? Da quali motivazioni sarai guidato nella scelta del tipo di eccezione: selezionata/non selezionata?
  13. Quale operatore ti consente di forzare la generazione di un'eccezione?
  14. Esistono condizioni aggiuntive per un metodo che potrebbe potenzialmente generare un'eccezione?
  15. Il metodo principale può generare un'eccezione all'esterno e, in tal caso, dove verrà gestita questa eccezione?
  16. Se un'istruzione return è contenuta sia in un blocco catch che in un blocco finally, quale è "più importante"?
  17. Cosa sai di OutOfMemoryError?
  18. Cosa sai di SQLException? Che tipo di spuntato o deselezionato è, perché?
  19. Che cos'è l'errore? In tal caso viene utilizzato Error. Fai un esempio di errore.
  20. Quale costrutto viene utilizzato in Java per la gestione delle eccezioni?
  21. Supponiamo che ci sia un blocco try-finally. È stata generata un'eccezione nel blocco try e l'esecuzione è stata spostata nel blocco finally. Anche il blocco finally ha generato un'eccezione. Quale delle due eccezioni "eliminerà" dal blocco try-finally? Cosa succede alla seconda eccezione?
  22. Supponiamo che esista un metodo in grado di generare IOException e FileNotFoundException in quale ordine dovrebbero andare i blocchi catch? Quanti blocchi catch verranno eseguiti?

  1. Definire il termine "raccolta".
  2. Elenca i vantaggi dell'utilizzo delle raccolte.
  3. Che tipo di dati possono memorizzare le raccolte?
  4. Qual è la gerarchia della raccolta?
  5. Cosa sai delle raccolte List?
  6. Cosa sai delle collezioni Set?
  7. Cosa sai delle raccolte di code?
  8. Cosa sai delle raccolte di mappe, qual è la loro differenza fondamentale?
  9. Assegna un nome alle principali implementazioni di List, Set, Map.
  10. Quali implementazioni di SortedSet conosci e quali sono le loro caratteristiche?
  11. Quali sono le differenze/somiglianze tra List e Set?
  12. Qual è la differenza/comune tra le classi ArrayList e LinkedList, quando è meglio usare ArrayList e quando è meglio usare LinkedList?
  13. Quando è ragionevole utilizzare un array anziché un ArrayList?
  14. In che modo ArrayList è diverso da Vector?
  15. Cosa sai dell'implementazione delle classi HashSet e TreeSet?
  16. Qual è la differenza tra HashMap e TreeMap? Come sono impostati e come funzionano? E con il tempo di accesso agli oggetti, quali dipendenze?
  17. Che cos'è Hashtable, in che cosa differisce da HashMap? Ad oggi è stato deprecato, come si utilizza ancora la funzionalità desiderata?
  18. Cosa succede se mettiamo due valori in una mappa con la stessa chiave?
  19. Com'è impostato l'ordine degli oggetti nella raccolta, come ordinare la raccolta?
  20. Definire il termine "iteratore".
  21. Quali funzionalità fornisce la classe Raccolte?
  22. Come ottenere una collezione non modificabile?
  23. Quali raccolte sono sincronizzate?
  24. Come ottenere una raccolta sincronizzata da una non sincronizzata?
  25. Come ottenere una raccolta di sola lettura?
  26. Perché la mappa non eredita dalla collezione?
  27. Qual è la differenza tra Iteratore ed Enumerazione?
  28. Come viene implementato il ciclo foreach?
  29. Perché non esiste un metodo iterator.add() per aggiungere elementi a una raccolta?
  30. Perché la classe iterator non ha un metodo per ottenere l'elemento successivo senza spostare il cursore?
  31. Qual è la differenza tra Iterator e ListIterator?
  32. Quali sono i modi per scorrere tutti gli elementi di un elenco?
  33. Qual è la differenza tra proprietà fail-safe e fail-fast?
  34. Cosa devo fare per evitare di lanciare un'eccezione ConcurrentModificationException?
  35. Che cos'è una pila e una coda, dicci quali sono le loro differenze?
  36. Qual è la differenza tra le interfacce Comparable e Comparator?
  37. Perché le raccolte non ereditano le interfacce clonabili e serializzabili?

  1. Quali classi di "stringhe" conosci?
  2. Quali sono le proprietà principali delle classi “string” (le loro caratteristiche)?
  3. È possibile ereditare il tipo di stringa, perché?
  4. Definire il termine concatenazione di stringhe.
  5. Come convertire una stringa in un numero?
  6. Come confrontare il valore di due stringhe?
  7. Come invertire una stringa?
  8. Come funziona il confronto di due stringhe?
  9. Come tagliare gli spazi alla fine di una stringa?
  10. Come sostituire un carattere in una stringa?
  11. Come ottenere parte di una stringa?
  12. Definire il termine "pool di stringhe".
  13. Quale metodo consente di selezionare una sottostringa in una stringa?
  14. Come dividere una stringa in sottostringhe da un determinato delimitatore?
  15. Quale metodo viene chiamato per convertire una variabile in una stringa?
  16. Come scoprire il valore di un particolare carattere di una stringa, conoscendo il suo numero ordinale nella stringa?
  17. Come trovare il carattere richiesto in una stringa?
  18. È possibile sincronizzare l'accesso alla riga?
  19. Cosa fa il metodo intern()?
  20. In che cosa differiscono le classi String, StringBuffer e StringBuilder e cosa hanno in comune?
  21. Qual è il modo corretto per confrontare i valori di stringa di due diversi oggetti di tipo String e StringBuffer?
  22. Perché la stringa è immutabile e finalizzata in Java?
  23. Perché un array di caratteri è preferibile a una stringa per l'archiviazione delle password?
  24. Perché una stringa è una chiave popolare in una HashMap in Java?
  25. Scrivete un metodo per rimuovere un dato carattere da una stringa.

  1. Quali sono i tipi di flussi di I/O?
  2. Denominare i principali antenati dei flussi di I/O.
  3. Quali sono le somiglianze e le differenze tra i seguenti flussi: InputStream, OutputStream, Reader, Writer?
  4. Cosa sai di RandomAccessFile?
  5. Quali sono le modalità di accesso ai file?
  6. In quali pacchetti si trovano le classi di flusso?
  7. Cosa sai delle classi di sovrastruttura?
  8. Quale classe aggiuntiva ti consente di leggere i dati dal flusso di byte di input nel formato di tipi di dati primitivi?
  9. Quale classe aggiuntiva ti permette di velocizzare la lettura/scrittura tramite l'uso di un buffer?
  10. Quali classi ti consentono di convertire i flussi di byte in flussi di caratteri e viceversa?
  11. Quale classe è progettata per funzionare con elementi del file system (EFS)?
  12. Quale carattere è il separatore quando si specifica il percorso dell'EFS?
  13. Come selezionare tutti gli EFS di una determinata directory in base a un criterio (ad esempio, con una determinata estensione)?
  14. Cosa sai dell'interfaccia FilenameFilter?
  15. Cos'è la serializzazione?
  16. Quali sono le condizioni per una serializzazione "sicura" di un oggetto?
  17. Quali classi ti consentono di archiviare oggetti?

  1. Definire il termine "processo".
  2. Definisci il termine "flusso".
  3. Definire il termine "sincronizzazione dei thread".
  4. Come interagiscono programmi, processi e thread?
  5. Quando è consigliabile creare più thread?
  6. Cosa può succedere se due thread eseguono lo stesso codice in un programma?
  7. Cosa sai del thread principale del programma?
  8. Quali sono i modi per creare ed eseguire thread?
  9. Quale metodo avvia un thread per l'esecuzione?
  10. Quale metodo descrive l'azione di un thread durante l'esecuzione?
  11. Quando un thread completa la sua esecuzione?
  12. Come sincronizzare il metodo?
  13. Come forzare l'arresto di un thread?
  14. Definisci il termine "thread demone".
  15. Come creare un thread daemon?
  16. Come ottenere il thread corrente?
  17. Definire il termine "monitor".
  18. Come sospendere l'esecuzione di un thread?
  19. In quali stati può trovarsi un flusso?
  20. Che cos'è monitor quando si chiama il metodo non statico e statico?
  21. Qual è il monitor durante l'esecuzione di una sezione del codice del metodo?
  22. Quali metodi consentono di sincronizzare l'esecuzione dei thread?
  23. Quale metodo mette un thread in modalità inattiva?
  24. Qual è la funzionalità dei metodi notifica e notifica tutto?
  25. A cosa serve il metodo di unione?
  26. Quali sono le condizioni per chiamare il metodo wait/notify?
  27. Definire il termine "blocco reciproco".
  28. Qual è la differenza tra i metodi interrupt, interrupted e isInterrupted?
  29. In tal caso verrà generata un'InterruptedException, quali metodi possono lanciarla?
  30. modificatori volatili e il metodo yield().
  31. Pacchetto java.util.concurrent
  32. Esiste un metodo che esegue l'operazione i++. Variabile i di tipo int. Si presume che il codice verrà eseguito in un ambiente multi-thread. Il blocco deve essere sincronizzato?
  33. Cosa viene utilizzato come mutex se il metodo è dichiarato sincronizzato statico? È possibile creare nuove istanze di una classe mentre è in esecuzione un metodo sincronizzato statico?
  34. Si supponga che si sia verificata un'eccezione RuntimeException nel metodo run che non è stata rilevata. Cosa accadrà al flusso? C'è un modo per sapere che si è verificata un'eccezione (senza avvolgere l'intero corpo della corsa in un blocco try-catch)? C'è un modo per ripristinare il thread dopo che è successo?
  35. Quali strumenti Java standard useresti per implementare un pool di thread?
  36. Che cos'è un ThreadGroup e perché è necessario?
  37. Che cos'è un ThreadPool e perché è necessario?
  38. Che cos'è un ThreadPoolExecutor e perché è necessario?
  39. Cosa sono i "tipi atomici" in Java?
  40. Perché è necessaria la classe ThreadLocal?
  41. Che cos'è un esecutore?
  42. Cos'è ExecutorService?
  43. Perché è necessario il ScheduledExecutorService?
Questo elenco di oltre 300 domande (senza risposte) è stato trovato su http://becomejavasenior.com/ . Altri autori sono elencati lì.

58489 visualizzazioni totali 15 visualizzazioni oggi

Visualizzazioni: 38 283

  • Che cos'è OOP?
  • Cos'è un oggetto?
  • Assegna un nome ai principi di base dell'OOP.
  • Che cos'è l'eredità?
  • Cos'è il polimorfismo? Quali manifestazioni di polimorfismo in Java conosci?
  • Cos'è l'incapsulamento?
  • Cos'è l'astrazione?
  • Quali sono i vantaggi dei linguaggi di programmazione orientati agli oggetti?
  • In che modo l'utilizzo di un approccio orientato agli oggetti migliora lo sviluppo del software?
  • C'è un'espressione "è" e "ha". Cosa significano in termini di principi OOP? Qual è la differenza tra composizione e aggregazione?
  • Cosa intendi per polimorfismo, incapsulamento e collegamento dinamico?

nucleo java.

  • Qual è la differenza tra JRE, JVM e JDK?
  • Descrivi i modificatori di accesso in Java.
  • Che cos'è l'accesso a livello di pacchetto.
  • In che modo una classe astratta è diversa da un'interfaccia? Quando useresti una classe astratta e quando useresti un'interfaccia?
  • Un oggetto può accedere a una variabile di classe privata? Se é cosi, come?
  • A cosa servono i blocchi statici in Java?
  • È possibile sovraccaricare un metodo statico?
  • Raccontaci delle classi interiori. Quando li userai?
  • Qual è la differenza tra variabile di istanza e variabile statica? Dare un esempio.
  • Fai un esempio quando puoi usare un metodo statico?
  • Parlaci delle classi del caricatore e del caricamento dinamico delle classi.
  • Qual è lo scopo dell'operatore "assert" in Java?
  • Perché alcune interfacce non definiscono affatto i metodi?
  • Qual è la differenza principale tra String, StringBuffer, StringBuilder?
  • Parlami dei flussi di I/O Java.
  • Che cos'è la memoria Heap e Stack in Java?
  • Qual è la differenza tra la memoria Stack e Heap in Java?
  • Ci parli del modello di memoria in Java?
  • Come funziona il netturbino?
  • Parlaci del casting di tipo. Che cos'è la retrocessione e la promozione? Quando ricevi una ClassCastException?
  • Che cos'è una classe statica, quali sono le caratteristiche del suo utilizzo?
  • Come accedere a un campo della classe esterna da una classe nidificata.
  • Quali tipi di classi nidificate esistono? A cosa servono?
  • È possibile modificare durante l'override di un metodo:
  • Modificatore di accesso
  • tipo di ritorno
  • Tipo o numero di argomento
  • Nome argomento
  • Modificare l'ordine, la quantità o rimuovere del tutto la sezione dei lanci?
  • Cos'è l'autobox?
  • Cosa sono i generici?
  • Qual è il vero scopo dell'utilizzo di tipi generici in Java?
  • Come vengono passate le variabili ai metodi, per valore o per riferimento?
  • Quali metodi ha la classe Object?
  • Regole per l'override del metodo Object.equals().
  • Se vuoi sovrascrivere equals(), quali condizioni devono essere soddisfatte per il metodo sovrascritto?
  • Qual è la relazione tra hashCode e equals?
  • Come vengono implementati i metodi hashCode e equals nella classe Object?
  • Cosa succede se sovrascrivi equals senza sovrascrivere hashCode? Quali problemi potrebbero sorgere?
  • C'è qualche guida su quali campi dovrebbero essere utilizzati durante il calcolo dell'hashCode?
  • A cosa serve il metodo hashCode()?
  • Regole per l'override del metodo Object.hashCode().
  • Parlaci della clonazione degli oggetti. Qual è la differenza tra clonazione superficiale e profonda?
  • Regole per l'override del metodo Object.clone().
  • Dove e come puoi utilizzare un costruttore privato?
  • Che cos'è un costruttore predefinito?
  • Descrivi il metodo Object.finalize().
  • Qual è la differenza tra le parole final, final e finalize?
  • Descrivi la gerarchia delle eccezioni.
  • Quali tipi di eccezioni in Java conosci, in che cosa differiscono?
  • Cos'è l'eccezione selezionata e deselezionata?
  • Come creare la tua eccezione deselezionata?
  • Cosa sono le eccezioni Unchecke?
  • Che cos'è l'errore?
  • Descrivi come funziona il blocco try-catch-finally.
  • È possibile utilizzare un blocco try-finally (senza catch)?
  • Il blocco finally viene sempre eseguito?
  • Quali sono le caratteristiche della classe String? cosa fa il metodo intern().
  • È possibile ereditare il tipo di stringa, perché?
  • Perché una stringa è una chiave popolare in una HashMap in Java?
  • Definire il termine concatenazione di stringhe.
  • Come invertire una stringa?
  • Come confrontare il valore di due stringhe?
  • Come tagliare gli spazi all'inizio e alla fine di una stringa?
  • Definire il termine "pool di stringhe".
  • È possibile sincronizzare l'accesso alla riga?
  • Qual è il modo corretto per confrontare i valori di stringa di due diversi oggetti di tipo String e StringBuffer?
  • Perché la stringa è immutabile e finalizzata in Java?
  • Scrivete un metodo per rimuovere un dato carattere da una stringa.
  • Cos'è la riflessione?
  • Cosa succede al Garbage Collector (GC) se si verifica un'eccezione durante l'esecuzione del metodo finalize() di un oggetto?
  • Che cos'è l'internazionalizzazione, la localizzazione?
  • Cosa sono le annotazioni in Java?
  • Quali funzioni svolge l'annotazione?
  • Quali annotazioni integrate in Java conosci?
  • A cosa servono le annotazioni @Retention, @Documented, @Target e @Inherited?
  • Che cosa fanno le annotazioni @Override, @Deprecated, @SafeVarargs e @SuppressWarnings?
  • Quale ciclo di vita dell'annotazione può essere specificato con @Retention?
  • Quali elementi possono essere annotati, come specificarlo?
  • Come creare la tua annotazione?
  • Quali tipi di attributi sono consentiti nelle annotazioni?
  • Cos'è JMX?
  • Quali vantaggi offre JMX?
  • Cos'altro può fare JMX oltre al controllo remoto?
  • Cos'è MBean?
  • Quali tipi di MBean esistono?
  • Che cos'è MBean Server?
  • Quali meccanismi forniscono sicurezza nella tecnologia Java?
  • Quali sono alcuni dei controlli eseguiti dal verificatore di bytecode Java?
  • Cosa sai del "gestore della protezione" in Java?
  • Cos'è JAS?
  • Che cos'è il refactoring?

Framework delle raccolte Java.

  • Che cos'è una raccolta?
  • Denominare le principali interfacce delle raccolte e la loro implementazione.
  • In che modo ArrayList è diverso da LinkedList? In quali casi è meglio utilizzare il primo e in quali il secondo?
  • Qual è la differenza tra HashMap e Hashtable?
  • In che modo ArrayList è diverso da Vector?
  • Come vengono confrontati gli elementi della raccolta?
  • Disporre le seguenti interfacce in una gerarchia: List, Set, Map, SortedSet, SortedMap, Collection, Iterable, Iterator, NavigableSet, NavigableMap.
  • Perché la mappa non è raccolta mentre l'elenco e il set sono raccolta?
  • Definire il termine "iteratore".
  • Cosa sai dell'interfaccia Iterable?
  • Come convertire HashSet in ArrayList in una riga?
  • Come convertire ArrayList in HashSet in una riga?
  • Come eseguire l'iterazione su tutte le chiavi di Map dato che Map non è iterabile?
  • Come eseguire l'iterazione su tutti i valori di Map dato che Map non è Iterabile?
  • Come eseguire l'iterazione su tutte le coppie chiave-valore in Map dato che Map non è iterabile?
  • Qual è l'"ordinamento" di SortedMap, oltre al fatto che toString() stampa tutto in ordine?
  • Come copiare elementi da qualsiasi raccolta in un array in una chiamata?
  • Implementare una differenza simmetrica di due raccolte utilizzando i metodi Collection (addAll(), removeAll(), retainAll()).
  • Confronta enumerazione e iteratore.
  • Come sono correlati Iterable e Iterator?
  • Qual è la relazione tra Iterable, Iterator e "for-each" introdotta in Java 5?
  • Confronta Iterator e ListIterator.
  • Cosa succede se chiamo Iterator.next() senza "chiedere" Iterator.hasNext()?
  • Cosa succede se chiamo Iterator.next() prima di chiamare Iterator.hasNext() 10 volte? Mi mancano 9 articoli?
  • Se ho una raccolta e un iteratore figlio, la raccolta cambierà se chiamo iterator.remove()?
  • Se ho una raccolta e un iteratore figlio, l'iteratore cambierà se chiamo collection.remove(..)?
  • Perché hanno aggiunto ArrayList se esisteva già un vettore?
  • L'implementazione della classe ArrayList ha i seguenti campi: Object elementData, int size. Spiega perché devi memorizzare le dimensioni separatamente quando puoi sempre prendere elementData.length?
  • LinkedList è un elenco con collegamento singolo, doppio collegamento o quattro collegamenti?
  • Qual è il momento peggiore per il metodo container() per un elemento che si trova in una LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O( N*N) )?
  • Qual è il momento peggiore per il metodo container() per un elemento che si trova in un ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O( N*N) )?
  • Qual è il momento peggiore per il metodo LinkedList add() (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Qual è il momento peggiore per un metodo ArrayList add() (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Quanti elementi sono allocati in memoria quando viene chiamato ArrayList.add()?
  • Quanti elementi sono allocati in memoria quando viene chiamato LinkedList.add()?
  • Stimare la quantità di memoria per archiviare una primitiva di tipo byte in LinkedList?
  • Stimare la quantità di memoria per archiviare una primitiva di tipo byte in ArrayList?
  • Aggiungo un elemento al centro dell'elenco: list.add(list.size()/2, newElem). Per chi è questa operazione più lenta - per ArrayList o per LinkedList?
  • Come eseguire l'iterazione degli elementi di LinkedList in ordine inverso senza utilizzare get(index) lento?
  • Come ottenere un elenco con tutti gli elementi tranne il primo e l'ultimo 3 con una chiamata da List?
  • Diversi oggetti in memoria (ref0 != ref1) possono avere ref0.hashCode() == ref1.hashCode()?
  • Diversi oggetti in memoria (ref0 != ref1) possono avere ref0.equals(ref1) == true?
  • Diversi riferimenti allo stesso oggetto in memoria (ref0 == ref1) possono avere ref0.equals(ref1) == false?
  • Esiste una classe Point(int x, y;). Perché un codice hash della forma 31 * x + y è preferibile a x + y?
  • Se la classe Point(int x, y;) è "corretta" per implementare il metodo equals (restituisce ref0.x == ref1.x && ref0.y == ref1.y), ma imposta il codice hash come int hashCode( ) (return x;), tali punti verranno posizionati correttamente e recuperati dall'HashSet?
  • equals() genera una relazione di equivalenza. Quale delle proprietà ha tale relazione: commutatività, simmetria, riflessività, distributività, associatività, transitività?
  • È possibile implementare equals(Object that) (return this.hashCode() == that.hashCode()) in questo modo?
  • equals richiede la verifica che l'argomento (equals(Object that)) sia dello stesso tipo dell'oggetto stesso. Qual è la differenza tra this.getClass() == that.getClass() e quell'istanza di MyClass?
  • È possibile implementare il metodo equals della classe MyClass in questo modo: class MyClass (public boolean equals(MyClass that) (return this == that;))?
  • HashMap funzionerà se tutte le chiavi restituiscono int hashCode() (restituiscono 42;)?
  • Perché hanno aggiunto HashMap se esisteva già un Hashtable?
  • Secondo Knuth e Kormen, ci sono due implementazioni principali della tabella hash: basata sull'indirizzamento aperto e basata sul metodo di concatenamento. Come viene implementata HashMap? Perché l'hanno fatto (secondo te)? Quali sono i pro e i contro di ogni approccio?
  • Quanti clic sui link si verificano quando esegui HashMap.get(key) su una chiave che si trova nella tabella?
  • Quanti nuovi oggetti vengono creati quando aggiungi un nuovo elemento a una HashMap?
  • Come funziona un HashMap quando si tenta di memorizzare due elementi al suo interno tramite chiavi con lo stesso hashCode, ma per il quale è uguale a == false?
  • HashMap può degenerare in un elenco anche per chiavi con hashCode diverso. Com'è possibile?
  • Qual è il momento peggiore per un metodo get(key) per una chiave che non è nella tabella (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Qual è il momento peggiore per un metodo get(key) per una chiave che si trova in una tabella (O(1), O(log(N)), O(N), O(N*log(N)), O (N*N ))?
  • Spiegare il significato dei parametri nel costruttore HashMap(int initialCapacity, float loadFactor).
  • Qual è la differenza tra HashMap e IdentityHashMap? A cosa serve IdentityHashMap? Come può essere utile implementare la serializzazione o la clonazione?
  • Qual è la differenza tra HashMap e WeakHashMap? A cosa serve WeakHashMap?
  • WeakHashMap utilizza WeakReferences. Perché non creare una SoftHashMap su SoftReferences?
  • WeakHashMap utilizza WeakReferences. Perché non creare una PhantomHashMap su PhantomReferences?
  • Crea un HashSet da una HashMap (usa solo più chiavi, non più valori).
  • Crea HashMap da HashSet(HashSet >).
  • Confronta le interfacce java.util.Queue e java.util.Deque.
  • Chi estende chi: Queue estende Deque o Deque estende Queue?
  • Perché LinkedList implementa sia List che Deque?
  • Qual è la differenza tra le classi java.util.Arrays e java.lang.reflect.Array?
  • Qual è la differenza tra le classi java.util.Collection e java.util.Collections?
  • Scrivere un programma senza thread che faccia sì che una raccolta generi un'eccezione ConcurrentModificationException.
  • Che cos'è il "comportamento fail-fast"?
  • Esiste una classe speciale java.util.EnumSet per set di enumerazioni? Per che cosa? Perché agli autori non piaceva HashSet o TreeSet?
  • java.util.Stack - Considerato "obsoleto". Cosa si consiglia per sostituirlo? Come mai?
  • Quale raccolta implementa la disciplina del servizio FIFO?
  • Quale raccolta implementa la disciplina del servizio FILO?
  • Fornisci un esempio quando una raccolta genera un'eccezione UnsupportedOperationException.
  • Perché non puoi scrivere "ArrayList numeri = nuovo ArrayList ();" ma puoi "Elenca numeri = nuovo ArrayList ();"?
  • LinkedHashMap - cos'è questa "bestia"? Cosa c'è dentro da LinkedList e cosa c'è da HashMap?
  • LinkedHashSet: cos'è questa "bestia"? Cosa c'è dentro LinkedList e cosa c'è in HashSet?
  • Dicono che sia facile creare una semplice cache con "politica di invalidamento" su LinkedHashMap, sai come fare?
  • Cosa ti permette di fare PriorityQueue?
  • Quali sono le differenze tra java.util.Comparator e java.lang.Comparable?

Giava 8.

  • Cos'è un collegamento simbolico?
  • Qual è la differenza tra I/O e NIO?
  • Quali caratteristiche di NIO conosci?
  • Quali sono i tipi di flussi di I/O?
  • Assegna un nome alle classi principali dei flussi di input/output.
  • In che cosa differiscono OutputStream, InputStream, Writer, Reader e cosa hanno in comune?
  • A quali sottoclassi della classe InputStream di base sai a cosa servono?
  • Cosa sai di RandomAccessFile?
  • Quali modalità di accesso ai file ha RandomAccessFile?
  • Quali sono le sottoclassi della classe base OutputStream e sai a cosa servono?
  • A cosa serve PushbackInputStream?
  • A cosa serve SequenceInputStream?
  • A quali sottoclassi della classe base Reader sai a cosa servono?
  • A quali sottoclassi della classe base di Writer sai a cosa servono?
  • Che cos'è il percorso assoluto e il percorso relativo?
  • In quali pacchetti si trovano le classi di flusso?
  • Cosa sai delle classi di sovrastruttura?
  • Quale classe aggiuntiva ti consente di leggere i dati dal flusso di byte di input nel formato di tipi di dati primitivi?
  • Quale classe aggiuntiva ti permette di velocizzare la lettura/scrittura tramite l'uso di un buffer?
  • Quali classi ti consentono di convertire i flussi di byte in flussi di caratteri e viceversa?
  • Qual è la differenza tra la classe PrintWriter e la classe PrintStream?
  • Quale classe è progettata per funzionare con gli elementi del file system?
  • Quale carattere è il delimitatore quando si specifica un percorso nel file system?
  • Quali metodi della classe File conosci?
  • Cosa sai dell'interfaccia FileFilter?
  • Quali classi ti consentono di archiviare oggetti?

  • Su quale oggetto si verifica la sincronizzazione quando viene chiamato un metodo sincronizzato statico?
  • A cosa serve la parola chiave volatile, sincronizzata, transitoria e nativa?
  • Cosa significa priorità del thread?
  • Cosa sono i thread daemon in Java?
  • Cosa significa placare il flusso?
  • In quali stati può essere un thread in Java? Come funziona effettivamente uno stream?
  • Qual è la differenza tra le due interfacce per l'implementazione di attività eseguibili e richiamabili?
  • Differenze tra CyclicBarrier e CountDownLatch?
  • Che cos'è una condizione di razza?
  • Come fermare un thread?
  • Cosa succede quando si verifica un'eccezione in un thread?
  • Che cos'è una variabile ThreadLocal?
  • Cos'è FutureTask?
  • Differenza tra interrotto e isInterrupted?
  • Perché i metodi wait e notification vengono chiamati in un blocco sincronizzato?
  • Che cos'è un pool di thread?
  • Differenze tra livelock e deadlock?
  • Come verificare se un thread contiene un lucchetto?
  • Come ottenere un dump del thread?
  • Quale impostazione JVM viene utilizzata per controllare la dimensione dello stack di un thread?
  • Differenze tra sincronizzato e ReentrantLock?
  • Che cos'è un semaforo?
  • Cosa succede se la coda del pool di thread è già piena e si invia un'attività?
  • Differenze tra i metodi submit() ed execute() di un pool di thread?
  • Che cos'è un metodo di blocco?
  • Cos'è ReadWriteLock?
  • Che cos'è il doppio bloccaggio di Singleton?
  • Che cos'è il framework Fork/Join?
  • La Forza è un fiume da cui molti possono bere, e l'addestramento Jedi non è l'unico modo per attingere da esso." - Luke Skywalker Tutte le raccolte di libri lasciate indietro. Quale di loro leggere, cosa no, dipende da te. Ora ti resta un solo obiettivo: trovare un lavoro e costruirti una carriera senza calpestare un rastrello. L'ultimo articolo è suddiviso in sezioni: - Prima del lavoro - Colloquio - Durante il lavoro Ci sono molte mie opinioni personali in questa parte, quindi per favore non togliere le frasi dal contesto e trattarle come una conversazione franca con un vecchio amico :).

    Prima del lavoro

    Di seguito sono riportati i dieci cliché più popolari che emergono quando l'anima è attratta dalla programmazione, ma alcune circostanze interferiscono con la persona. Il mio compito è cercare di fermare la tua sospettosità e prepararti a un modo di pensare positivo. Se stai leggendo questo articolo, sei più lontano di quanto pensi! Mentalmente, sei già dove devi essere, e se hai già letto dei libri, la metà è già stata superata. Pertanto, smettila di dubitare: questo è il destino dei deboli. Solo avanti! Già meglio? Allora andiamo! "Non ho istruzione" Quando sono entrato nell'accademia di una delle grandi società di outsourcing, gli intervistatori mi hanno gentilmente accennato che non erano affatto interessati al diploma, quindi le domande erano specifiche: sull'OOP e su Java di base. Naturalmente, ti imbatterai in posti vacanti in cui la disponibilità di quelli. l'istruzione sarà un chiaro requisito. Voglio solo dire che la sua assenza non è un ostacolo in questi giorni. Molte sedi estere richiedono BS/MS Computer Science o, attenzione, esperienza rilevante. Non convince? Forse sarete incoraggiati dal fatto che non ho una formazione tecnica;), ma questo non mi ha assolutamente impedito di fare esperienza in grandi aziende. Chiedimi ora cosa farei se potessi riavvolgere il nastro? Certo, andrei a KPI/NAU, ma non mi addolorerei troppo se non entrassi. Smettila di impazzire per questo. Il tempo passerà - puoi ottenere una crosta a 40 se vuoi - ma per ora concentrati sul diventare uno sviluppatore junior qui e ora. "Ci saranno persone più intelligenti di me" Ci saranno sempre persone più intelligenti, più intelligenti, più flessibili, più talentuose di te e qualsiasi lavoro non fa eccezione. Questo fatto non ti dà assolutamente il diritto di deviare dall'obiettivo. Forse da qualche parte dall'altra parte del globo c'è un ragazzino giapponese che moltiplica e divide i numeri più velocemente di te, e qualche nonna della Repubblica Ceca digita sulla tastiera di un cellulare più velocemente di qualsiasi adolescente. Ma tu non ci pensi, vero? Allora perché dovresti preoccuparti delle persone con cui lavorerai quando ti sarai sistemato? In un certo senso, i tuoi futuri colleghi ti supereranno, in qualche modo perderanno contro di te. Questo va bene! Cancella. "Non credo di poterlo fare" Ebbene, prima di tutto nessuno ha detto che sarebbe stato facile, ma questo non significa affatto che il tuo obiettivo non sia fattibile. Nulla ti impedisce di provarlo semplicemente, anche se attualmente stai lavorando come contabile o assistente alle vendite. Vieni dopo una giornata di lavoro e siediti a studiare. Se dopo un po' vedi dei progressi, questo è un segno che ti stai muovendo nella giusta direzione. Non fermarti! Se questo ti interessa anche solo un po' e te lo viene dato, allora non conosco un solo punto che possa convincermi che non ne sei degno. "Sono pigro" La pigrizia è solo una mancanza di motivazione. Se noti che la maggior parte del tuo tempo libero, invece di studiare e non combattere il corso, stai stupidamente facendo spazzatura, mi affretto a informarti che, molto probabilmente, il lavoro di un programmatore non è tuo. Almeno non ora. Alcuni chiamano la pigrizia un peccato, una malattia, il colera dell'età moderna insieme all'obesità. Lascia questo lavoro agli isterici della carriera. A mio parere, tutto intorno a questa vita è saturo dell'illusione della lotta e della competizione: chi è più alto, chi è più forte, chi è più ricco. Chi ha un'auto più fresca, chi ha uno stipendio più alto nella squadra, chi preme più forte il bilanciere in palestra, quale delle ragazze si è sposata prima e ha avuto figli - questo ti fa star male, come un fast food puzzolente. Le persone hanno smesso di vivere e godersi la vita, seguendo i propri sogni, scambiando la propria zona di comfort per una scelta tra Pepsi e Coca-Cola. Per me la pigrizia fa bene, è semplicemente meravigliosa. Questa è una normale funzione protettiva del tuo corpo per risparmiare tempo ed energia su cose che gli sono inutili. Una persona è stata creata per essere libera, quindi se sei pigro - smetti di provare ad alzare il culo dal divano - forse è al suo posto ora :). "Ci vado per i soldi" Se raccogliamo sviluppatori e diciamo: d'ora in poi, il tuo stipendio sarà di 3-4k grivna per qualsiasi livello e i tester continueranno a ricevere le stesse tariffe, la domanda sarà diversa: non quanti saranno bombardati, ma quanti i programmatori dopo questa notizia rimarranno solo programmatori. Molte persone si dedicano all'IT a causa dell'impasto. Stipendio tradotto da dollari, formaggi e una costosa DSLR. Non importa quanto ho lavorato con le persone, le conversazioni su questo sono sempre scivolate via. Non sto dicendo che questo sia un male, voglio solo che tu non provi a persuaderti che stai uscendo da obiettivi puramente spirituali per cambiare il mondo in meglio. Prima di trovare un lavoro da junior, sapevo quali fossero gli stipendi di senior, tech lead - e persino middle - e questi pensieri mi hanno solo ispirato: ai miei tempi, prima di lavorare come programmatore, potevo solo sognare tali figure. Chiama queste cose con i loro nomi propri e smettila di vergognartene. "Non credo sia mio" Di chi allora? Sai, è facile da controllare. Apri il primo volume di Hortsmann e inizia a leggere, scrivendo il codice degli esempi. Se non sei annoiato e non stai segnando il tempo sullo stesso capitolo per la seconda settimana, lascia cadere i tuoi dubbi. Lo studio delle specialità tecniche è una cosa coerente. Non puoi andare in B senza conoscere A, ma avrai sempre la possibilità di tornare indietro di un capitolo e rafforzare le basi. Andare avanti. "Ci sono molti come me" C'è sempre competizione per un posto. Non discuto, ad esempio, ora questa cifra è di 300-400 tester senza esperienza, o anche di più per un posto. Sì, questa è un'amara verità, ma, d'altra parte, anche con tali indicatori non riesco a trovare un punto sufficientemente serio. Sì, almeno 100500 in atto!! Hai sempre l'opportunità di acquisire esperienza sui tuoi progetti: costruisci una sorta di servizio, un programma desktop, usa l'intero stack che conosci - e stai già facendo i salti, e il resto, a parte inviare il tuo curriculum, non fare nulla altro. “Nessuno risponde al mio curriculum” In prosecuzione del paragrafo precedente. Molto probabilmente, per i futuri informatici senza esperienza, riuscire a scrivere un bel curriculum fa bene, ma quando ci sono tante persone per un posto vacante, molti curriculum sono molto simili tra loro: ovviamente puoi inviare una foto con una scollatura (se una ragazza) o scrivi un sacco di tecnologie, che tu stesso conosci solo da Wikipedia. In entrambi i casi, alle risorse umane semplicemente non importerà: se nel posto vacante ci fosse una persona che, ad esempio, conosce AWS, cercherà AWS nel curriculum. Prendi in considerazione un altro punto importante, come le raccomandazioni dei colleghi. Questo è il dolore di qualsiasi persona che non abbia tali conoscenze, perché la parte del leone dei giovani viene presa da lì (se la persona, su raccomandazione, non è un idiota, ovviamente). Di solito, sottolineo, viene presa per la posizione di junior una persona attiva adeguata e pronta all'apprendimento, e anche al cibo. E se un tale candidato fallisce, è più probabile che tu sia il prossimo. Bene, mentre il resto viene intervistato, hai molte aree in cui puoi rinfrescarti: open source, enigmi su Internet e forse freelance. “Non supererò il colloquio / Voglio lavorare in un'azienda specifica” Sì, molto probabilmente, il primo colloquio sarà un fallimento, ma l'esperienza che ottieni non ha prezzo. Con ogni colloquio successivo, diventerai più sicuro e pieno di risorse. Come adesso ricordo il mio primo... Dio, di che sciocchezza stavo parlando?! Com'è stato imbarazzante andarsene dopo di lui (ricordo quel ghoul che mi sorrideva in faccia), ma quando sono tornato a casa e ci ho pensato su, ho capito che era una lezione meravigliosa. Dopo di lui, tutti i successivi eventi simili furono intrisi di facilità e sicurezza. Nessuno è morto, stanno cercando persone come me, quindi verrò. Credi in te stesso! Se vuoi in particolare per una determinata azienda, allora penso che non ti rivelerò un hack di vita popolare nel nostro ambiente, ma comunque: prima di organizzare un incontro con questo ufficio, fai prima un colloquio con i concorrenti. Forse ti verrà offerto qualcosa che non rifiuterai, o le condizioni saranno più brusche. So per certo una cosa: non te ne pentirai. "Sono bravo in questo lavoro" Sai, c'è questo vecchio detto: Le mieux est I'enneini du bien ("Il meglio è nemico del bene"). Forse il tuo lavoro non è il posto peggiore, ma sì, il capo è una capra, e allora? O, per esempio, il terzo anno senza bonus, ma stipendio stabile, soprattutto perché ho già più di 30 anni. In una certa misura può essere così, ricorda solo che hai una vita, e non dovrebbe essere spesa per delusioni, per conforto immaginario, quando ci sono tante cose interessanti in giro, e tutta la vita non basta per capirle. Non aver paura di essere migliore, non aver paura di essere migliore. Non ascoltare nessuno, vai alla meta con insistenza se sai che questo è ciò che vuoi davvero fare. Non aver paura di cambiare!

    Colloquio

    In generale, puoi trovare tutto su Internet o chiedere in giro con gli amici, ma penso che non sarà superfluo. Di seguito è riportato un esempio di intervista per uno sviluppatore Java junior come sarebbe ora se fossi l'intervistatore. Le domande possono essere qualsiasi cosa, ho solo cercato di raccogliere qualcosa di mediocre per l'ospedale. Facciamo finta che tu sia fortunato. Schema standard Passo 1. Un reclutatore ti chiama e tu organizzi un colloquio con lei, ad esempio, domani alle 11:00. Passo 2 Arrivi presto, poiché le 11:00 è molto probabilmente l'ora non per te, ma per gli sviluppatori, che hanno una specie di stanza riservata in cui verrai torturato. È buona educazione per qualsiasi reclutatore avvertire di questo. Passaggio 3 Infatti, a partire dal punto 3, tutti i punti possono essere mischiati, perché le interviste possono essere svolte in modi diversi. Ad esempio, qui ti possono essere chieste cose di base, da dove vieni, perché sei con noi e così via. È possibile che le stesse risorse umane possano farlo e, naturalmente, è possibile che in inglese. Giusto, dipende dall'azienda. Passaggio 4 Sei invitato in una sala riunioni, dove converserai con una, due, tre persone, una delle quali sarà un senior o un responsabile tecnico che lavorerà con te in futuro, tra le altre potrebbe esserci un Scrum master, altri sviluppatori o HR. Sei intervistato per un po', poi ti stringono la mano e ti lasciano andare. Passaggio 5 Forse sarà il giorno successivo, o forse subito dopo il passaggio 4: avrai una conversazione con un cliente straniero (se presente), o forse condurrà un colloquio lui stesso. Come puoi vedere, ci sono molte opzioni. Da qualche parte ci sono clienti, da qualche parte c'è anche un colloquio telefonico. Questo è solo un esempio. Esempio di colloquio tecnico per uno sviluppatore Java Junior Mi dispiace davvero per i sottosviluppatori che leggono qualcosa di intelligente per affogare / schiacciare / mettersi in mostra davanti al richiedente per un colloquio. Se vedi che una persona del genere è di fronte a te e senti pressione e tensione da parte sua, mandalo immediatamente a tre divertenti, perché dopo un passaggio riuscito con questo cretino dovrai lavorare. Non sprecare i tuoi preziosi nervi. Il colloquio, innanzitutto, dovrebbe svolgersi con l'obiettivo di scoprire ciò che il candidato sa e non ciò che non sa. Naturalmente, se hai bisogno di una persona che sappia qualcosa di specifico, chiediglielo, non tormentarlo con cose inutili che non usi nel progetto. Sii umano, dopotutto! Di seguito sono riportate le domande approssimative che possono incontrare in un'intervista. 5 domande per ogni tecnologia. OOP 1. Fai un esempio di polimorfismo dalla vita reale? Quali sono i vantaggi? Svantaggi? Scrivi un codice semplice. 2. Che cos'è un'interfaccia? Classe astratta? Perché abbiamo bisogno di interfacce se puoi scrivere stupidamente tutto con le classi (una piccola provocazione) ?. Lo stesso vale per una classe astratta. Quali sono i metodi predefiniti in Java 8? 3. Costruire una gerarchia di classi su un esempio specifico di database o programma immaginario (c'è un elenco di diverse classi di lavoratori dal database) e l'interazione tra loro (aggregazione, composizione). 4. In che modo la composizione è diversa dall'aggregazione (è-a, ha-a)? 5. Come aggirare il divieto dell'ereditarietà multipla in Java? JDK/JRE 1. In che modo JDK è diverso da JRE? Cos'è JVM? 2. Che cos'è un percorso di classe ea cosa serve? Come, ad esempio, caricare altre classi nel percorso di classe? 3. Cosa sai del caricatore di classi? 4. Ci parli di javadoc? Cosa serve? 5. Cos'è JAR, WAR? Java comune 1. Qual è la differenza tra metodi statici e metodi non statici? Qual è il finale? 2. Che cos'è il pugilato-unboxing? byte b = 127, b++, qual è il risultato e perché? 3. Cosa sono i wrapper, a cosa servono? 4. Cosa devo fare per creare la mia annotazione? Che cos'è l'override/sovraccarico? 5. Perché la classe String è definitiva? Cosa fa il metodo intern()? Strutture di dati 1. Ci parli della struttura dell'API Collections in Java? Hai già lavorato con l'API Stream? 2. Qual è la differenza tra ArrayList e LinkedList? Dov'è meglio usare ArrayList e dov'è LinkedList? 3. Ci racconti come funziona HashMap? Quali sono le caratteristiche di lavorare con TreeSet, HashSet? Hai esperienza con le collezioni Guava? 4. Array in Java, un esempio di array bidimensionale. 5. hashCode, uguale sull'esempio di HashMap? Concorrenza 1. Che cos'è un processo? Flusso? Come creare un thread? Cosa è sincronizzato? Come capire questo o quel pezzo di codice thread-safe? 2. Che cos'è Thread.sleep, oltre ad attendere, notificare, cedere? 3. Fornisci un esempio di deadlock? 4. Raccolte quando si lavora con il multithreading. 5. Operazioni ThreadLocal e Atomiche SQL/JDBC 1. Su un esempio specifico, prendi dal database Utenti quello il cui stipendio è maggiore di 5000. 2. Esempi di INNER JOIN, OUTER JOIN, Order By, Group By. 3. Perché ho bisogno di un driver JDBC? Esempi. 4. Racconta tutto ciò che sai su ResultSet, un paio di esempi. 5. Scrivi un semplice DAO usando RS. JPA/ibernazione 1. Quali sono i vantaggi e gli svantaggi dell'APP? 2. Che cos'è un EntityManager? entità? 3. Criteri in JPA/ibernazione. 4. One-To-One, Many-To-Many in JPA/Hibernate 5. Come faresti un JOIN in Hibernate? HQL? Primavera 1. Che cos'è DI/IoC? Vantaggi. 2. Che cos'è il contesto dell'applicazione? Fagiolo? 3. Quali sono i tipi di inizializzazione IoC? 4. Singleton, prototipo in primavera? Primavera basata su annotazioni? 5. Ciclo di vita dei fagioli? metodo init, metodo di distruzione? @PostConstruct, @PostDeploy? Esperto di 1. Le fasi principali di Maven, il ciclo di vita. 2. Come eseguire Maven con test, senza test? Cos'è l'archetipo, la dipendenza mvn? 3. Profili in Maven, come creare, come eseguire. 4. Cos'è l'istantanea in Maven? Repository centrali/remoti? 5. Plugin in mvn, il principio di funzionamento, un paio di esempi. Algo 1. Il concetto di algoritmo, la sua velocità, Big-O-Notation. 2. Come trovare l'elemento centrale in una LinkedList in una volta sola? 3. Scrivere uno Stack primitivo? Qual è la differenza tra Stack e Queue? LIFO, FIFO? 4. Ordinamento rapido, ordinamento unisci. 5. Scrivete un programma che controlli se un numero è palindromo. Sono d'accordo, forse la barra è piegata un po' più verso il centro rispetto alla junior, ma penso che una tale preparazione non ti farà sicuramente male. Cerca di approfondire ogni domanda. A proposito, molte direzioni in Java non sono indicate qui, si prega di tenerne conto.

    Durante il lavoro

    Ecco piccoli consigli per quegli sviluppatori junior/medi che hanno già deciso. Questi semplici suggerimenti potrebbero tornarti utili proprio come hanno aiutato me a mia volta. Non essere testardo Smetti di dimostrare il tuo punto, anche se è seducente vicino alla verità. Hai già notato che sei in una disputa da molto tempo, il che significa che dall'altra parte delle barricate c'è un asino normale che ha solo due opinioni nella vita: la sua e quella sbagliata. Abbiamo un numero incredibile di persone testarde che resistono fino all'ultimo, fintanto che il loro ego non viene scosso. E questi non sono solo i tuoi colleghi, sono ovunque - nel minibus, nel negozio, parenti, amici intimi - non puoi scappare o nasconderti da loro. Devi in ​​qualche modo interagire con loro, anche se capisci che una persona sta dicendo apertamente sciocchezze. Inoltre, la stessa cosa può succedere a te. Sono d'accordo, le cose semplici possono essere spiegate anche a una persona testarda, ma cosa succede se parliamo di questioni architettoniche in un progetto o in un'opinione personale? Dimentica questa spazzatura: sii flessibile. Ho molto rispetto per le persone che possono ammettere di sbagliare, davanti a tutti. È questa qualità che ti sarà utile come specialista junior: è difficile confrontarsi con una persona aperta, soprattutto quando ammette che sta imparando e ha il diritto di sbagliare. Non fare tardi Non importa se è un periodo di prova o solo un venerdì, in cui tutti segnano e arrivano a 11. Un'altra cosa è importante: la puntualità è una caratteristica di un professionista che si guadagna punti extra di punto in bianco. E i punti extra per una persona senza esperienza non faranno male, giusto? Cerca di non fare tardi e di lasciare il lavoro onestamente dopo aver lavorato 8 ore. Non abusare delle stime Sfortunatamente, questa è un'immagine molto comune in cui mi sono trovato una volta in passato. Lo sviluppatore si è prefissato 8-16 ore per completare l'attività e l'ha completata inaspettatamente in 3-4 ore. Il resto delle ore trascorre il suo tempo personale sotto forma di ping pong, come è successo con me, o guardando YouTube e altri divertimenti. Da un punto di vista legale, sembrano essere d'accordo, ma da un punto di vista umano, ti stai privando di cose molto importanti: 1. Stai fermo, mentre stai riempiendo il tempo extra con cose inutili; 2. Non sviluppi perché non informi la direzione dei tuoi rapidi progressi, nessuno sa che stai completando i compiti più velocemente del previsto; 3. Inizi a sovrastimare costantemente il tempo medio per i valori, è solo una strada verso il nulla. Dedica del tempo allo studio La possibilità di rimanere indietro rispetto al motore è irrealisticamente alta, quindi tieni presente che la tecnologia e le nuove versioni si stanno sviluppando molto rapidamente. Iscriviti agli evangelisti Java dei nostri giorni, leggi i riassunti Java e in generale si interessa, impara cose nuove. Questo ti aiuterà a mantenere il tuo marchio e a svilupparlo. Aiutare gli altri Non aver paura di aiutare gli altri, anche se sono verdi come te. In primo luogo, rafforzerai notevolmente la tua conoscenza e, in secondo luogo, riceverai rispetto agli occhi degli altri e allo stesso tempo ti aiuteranno. In un ambiente del genere nascono le squadre migliori, oltre a una crescita tecnica e personale rapidissima. Vai a fare sport. Avere un hobby No sul serio. Non solo le persone coinvolte nello sport hanno un aspetto e si sentono meglio, ma anche la loro funzione cerebrale è al top! Scoliosi, zona lombare, sovrappeso, vari problemi con gli organi interni: gli incontri 24 ore su 24 al computer, anche al di fuori del lavoro, contribuiscono a questo. Se non puoi fare sport (cosa di cui dubito), usa piccoli trucchi di vita: lavora in piedi di tanto in tanto, parti due fermate prima e vai al lavoro a piedi. E sì, cammina di più. Esiste anche il rischio di esaurimento se la programmazione richiede molto più tempo di 40 ore a settimana. Gli hobby personali verranno in soccorso, ad esempio fotografia, musica, ecc. Trova del tempo regolare per la spiritualità. Equilibrio nella tua vita personale Quando una ragazza/moglie dice: "computer portatile o io", devi pensare seriamente a quale posto occupa la programmazione nella tua vita. D'altra parte, quando inizi il tuo viaggio nell'IT, devi spiegare chiaramente alla tua anima gemella che ora devi studiare molto per ottenere di più. Spero che capiscano. Bene, cerchi di bilanciare e allocare correttamente il tuo tempo. andare oltre Sii proattivo, se ritieni, ad esempio, di poter condividere conoscenze o avere argomenti interessanti, perché non organizzare piccoli corsi all'interno dell'azienda per gli altri? Non aver paura di contribuire a grandi progetti open source se sai come aiutare. Se vuoi scrivere un gioco, un progetto sociale o un'altra idea, fallo, fallo, fallo! Non stare fermo, cerca sempre modi in cui puoi svilupparti. Sii competitivo Guarda le nuove tendenze, rimani aggiornato con le tendenze che stanno accadendo nella comunità Java. Ad esempio, non sarà superfluo se occasionalmente, di tanto in tanto, monitori le offerte di lavoro Java presso DOU, ma non per allontanarti dal lavoro, ma per sapere quali tecnologie rimangono rilevanti e quali stanno lentamente scomparendo dal mercato . Prova anche a seguire corsi su Coursera, Udacity, ecc., esplora nuovi orizzonti. E anche l'inglese: prova a guardare i tuoi film/serie TV preferiti in originale con i sottotitoli per migliorare le tue capacità di conversazione, scarica un paio di applicazioni interessanti per l'apprendimento della lingua (ad esempio LinguaLeo) e, alla fine, vai ai corsi .

    Conclusione

    Bene, il mio piccolo progetto DOU sta volgendo al termine. Cari amici, vi auguro sinceramente di trovare un lavoro e spero che tutto ciò che ho descritto in questi 7 articoli possa essere per voi una guida preziosa, anche per chi sta già lavorando come sviluppatore Java. Futuri juniores, ricordate che nulla è impossibile e, se spingete davvero, ci riuscirete sicuramente. Voglio che tu decida finalmente se questo è tuo o meno, sviluppi un piano di allenamento dettagliato e lo segua freddamente. Non arrabbiarti se ottieni il silenzio in cambio: è tutto temporaneo, l'importante è credere e in nessun caso smarrirsi, ma studia, studia e studia di nuovo. Vorrei esprimere la mia profonda gratitudine al team DOU per aver curato una grande quantità di materiale e per avermi dato la prima serata il lunedì. DOU è una fantastica community che ha smesso di essere solo un sito per gli IT ucraini. Vorrei anche ringraziare tutti i commentatori che hanno letto i miei articoli in diagonale e hanno preso frasi fuori contesto. Gli articoli non sarebbero così interessanti senza di te :) Che la Forza sia con te!

    Per chi sente per la prima volta la parola Java Core, questi sono i fondamenti fondamentali del linguaggio. Con questa conoscenza, puoi già svolgere in sicurezza uno stage / stage. Queste domande ti aiuteranno a rinfrescare le tue conoscenze prima del colloquio o ad imparare qualcosa di nuovo per te stesso. Per le abilità pratiche, continua a studiare.

      Come creare un oggetto immutabile in Java? Elenca tutti i vantaggi

      Una classe immutabile è una classe il cui stato non può essere modificato dopo che è stata creata. Qui, lo stato di un oggetto sono essenzialmente i valori memorizzati in un'istanza della classe, siano essi tipi primitivi o tipi di riferimento.

      Per rendere immutabile una classe, devono essere soddisfatte le seguenti condizioni:

      1. Non fornire setter o metodi che modificano campi o oggetti che fanno riferimento a campi. I setter implicano la modifica dello stato di un oggetto, che è ciò che vogliamo evitare qui.
      2. Rendi tutti i campi definitivi e privati. I campi designati come privati ​​non saranno accessibili dall'esterno della classe e designarli come definitivi ti assicura di non cambiarli nemmeno per caso.
      3. Non consentire alle sottoclassi di sovrascrivere i metodi. Il modo più semplice per farlo è dichiarare la classe come final . Le classi finalizzate in Java non possono essere sovrascritte.
      4. Ricorda sempre che le tue istanze variabili possono essere mutabili o immutabili. Definiscili e restituisci nuovi oggetti con contenuto copiato per tutti gli oggetti mutabili (tipi di riferimento). Le variabili immutabili (tipi primitivi) possono essere restituite in modo sicuro senza alcuno sforzo aggiuntivo.

      Inoltre, è necessario tenere a mente i successivi vantaggi delle classi immutabili. Potresti aver bisogno di loro per un colloquio. Classi immutabili:

      • facile da progettare, testare e utilizzare
      • sono automaticamente thread-safe e non hanno problemi di sincronizzazione
      • non richiedono un costruttore di copie
      • consentono di "inizializzare pigro" l'hashcode e memorizzare nella cache il valore restituito
      • non richiedono una copia sicura se utilizzato come campo
      • crea buone chiavi Mappa ed elementi Set (questi oggetti non dovrebbero cambiare stato quando sono nella raccolta)
      • rendere permanente la loro classe creandola una volta e non è necessario ricontrollarla
      • hanno sempre "atomicità fallimentare", un termine coniato da Joshua Bloch: se un oggetto immutabile genera un'eccezione, non sarà mai lasciato in uno stato indesiderato o indefinito.

      Guarda l'esempio scritto in questo post.

      La specifica Java afferma che tutto in Java viene passato per valore. Non esiste un "passa per riferimento" in Java. Queste condizioni sono associate alla chiamata di metodi e al passaggio di variabili come parametri del metodo. Bene, i tipi primitivi vengono sempre passati per valore senza alcuna confusione. Ma il concetto dovrebbe essere compreso nel contesto di un parametro di metodo di tipi complessi.


      Nell'esempio precedente, i bit di indirizzo della prima istanza vengono copiati in un'altra variabile di riferimento, facendo in modo che entrambi i riferimenti puntino alla stessa posizione di memoria in cui è archiviato l'oggetto. Ricorda che assegnando null al secondo riferimento, non assegnerai null al primo riferimento. Ma un cambiamento nello stato di un oggetto con una variabile referenziata si rifletterà anche nell'altro riferimento.

      A cosa serve il blocco finally? Questo blocco garantisce l'esecuzione del suo codice? Quando non viene chiamato il blocco finally?

      Il blocco finally viene sempre chiamato se esiste il blocco try. Ciò garantisce che il blocco finally venga chiamato anche se si verifica un'eccezione imprevista. Ma alla fine è più utile della semplice gestione delle eccezioni: questo blocco consente di ripulire il codice che ha accidentalmente ignorato return, continue o break. Posizionare il codice di pulizia in un blocco finally è sempre una buona pratica, anche quando non sono previste eccezioni.

      Se la macchina virtuale si chiude durante l'esecuzione del blocco try o catch, il blocco finally non verrà eseguito. Allo stesso modo, se un thread viene interrotto o terminato durante l'esecuzione di un blocco try o catch, il blocco finally non verrà eseguito anche se l'applicazione è ancora in esecuzione.

      Perché ci sono due classi Date, una nel pacchetto java.util e l'altra in java.sql?

      java.util.Date rappresenta una data e un'ora, mentre java.sql.Date rappresenta solo una data. Il complemento a java.sql.Date è la classe java.sql.Time, che rappresenta solo l'ora.

      La classe java.sql.Date è una sottoclasse (estensione) della classe java.util.Date. Quindi cosa è cambiato in java.sql.Date:

      • toString() produce una rappresentazione di stringa diversa: aaaa-mm-gg
      • il metodo statico valueOf(String) crea una data da una stringa con la rappresentazione sopra
      • esclusi getter e setter per ore, minuti e secondi

      La classe java.sql.Date viene utilizzata in JDBC ed è progettata per non avere una componente temporale, ovvero ore, minuti, secondi e millisecondi devono essere zero... ma questo non è richiesto dalla classe.

      Spiega le interfacce dei marker.

      Il modello di interfaccia del marcatore è un modello di progettazione informatica utilizzato dai linguaggi di programmazione che fornire informazioni sugli oggetti in fase di esecuzione. Questo fornisce un modo per associare i metadati della classe in cui il linguaggio non ha un supporto esplicito per tali metadati. Java utilizza le interfacce per questo senza specificare i metodi.

      Un buon esempio di utilizzo di un'interfaccia marker in Java è l'interfaccia serializzabile. La classe implementa questa interfaccia per indicare che i suoi dati non transitori possono essere scritti in un flusso di byte o in un file system.

      Il problema principale Un'interfaccia marker è che un'interfaccia definisce una convenzione per le classi che la implementano e quella convenzione è ereditata da tutte le sottoclassi. Ciò significa che non puoi "derealizzare" il token. Nell'esempio sopra, se crei una sottoclasse che non vuoi serializzare (forse perché è in uno stato transitorio), devi ricorrere a lanciare esplicitamente un NotSerializableException .

      Perché il metodo main() è dichiarato come public static void ?

      Perché pubblico? Il metodo principale ha il modificatore di accesso pubblico, quindi è possibile accedervi ovunque e da qualsiasi oggetto che desideri utilizzare questo metodo per avviare l'applicazione. Qui non sto dicendo che JDK/JRE abbia un motivo simile, perché java.exe o javaw.exe (per Windows) usano la chiamata Java Native Interface (JNI) per eseguire il metodo, quindi possono chiamarlo comunque indipendentemente dal modificatore di accesso .

      Perché statico? Assumiamo che il nostro metodo principale non sia statico. Ora, per chiamare qualsiasi metodo, è necessaria un'istanza della classe. Destra? Java ti consente di avere costruttori sovraccaricati, lo sappiamo tutti. Quindi quale dovrebbe essere usato e da dove proverranno i parametri per il costruttore sovraccaricato?

      Perché vuoto? Non è possibile utilizzare il valore restituito nella macchina virtuale che chiama effettivamente questo metodo. L'unica cosa che l'applicazione vuole comunicare al processo di chiamata è una terminazione normale o anormale. Questo è già possibile utilizzando System.exit(int) . Un valore diverso da zero implica una terminazione anormale, altrimenti va tutto bene.

      Qual è la differenza tra la creazione di una stringa come new() e un letterale (usando le virgolette doppie)?

      Quando creiamo una stringa usando new() , viene creata nell'heap e aggiunta anche al pool di stringhe, mentre la stringa creata con il letterale viene creata solo nel pool di stringhe.

      Devi saperne di più sul concetto di pool di stringhe per rispondere a questa o domande simili. Il mio consiglio è di imparare bene la classe String e il pool di stringhe.

      Come funziona il metodo substring() della classe String?

      Come altri linguaggi di programmazione, le stringhe in Java sono sequenze di caratteri. Questa classe è più simile a una classe di utilità per lavorare con questa sequenza. La sequenza di caratteri è fornita dalla seguente variabile:

      /** Il valore viene utilizzato per la memorizzazione dei caratteri. */ /** Il valore viene utilizzato per memorizzare i caratteri */ valore del carattere finale privato; Le seguenti variabili vengono utilizzate per accedere a questa matrice in vari scenari /** L'offset è il primo indice della memoria utilizzata. */ /** L'offset è il primo indice della memoria da utilizzare. */ offset int finale privato; /** Il conteggio è il numero di caratteri nella stringa. */ /** Il conteggio è il numero di caratteri nella stringa. */ conteggio int finale privato;

      Ogni volta che creiamo una sottostringa da un'istanza di stringa esistente, il metodo substring() imposta solo l'offset e le variabili di conteggio su nuovi valori. L'array di caratteri interno non viene modificato. Questa è una possibile fonte di perdita di memoria se il metodo substring() viene utilizzato con noncuranza:

      Il valore originale di value non viene modificato. Quindi, se crei una stringa di 10000 caratteri e crei 100 sottostringhe con 5-10 caratteri ciascuna, tutti i 101 oggetti conterranno lo stesso array di caratteri di 10000 caratteri. Questo è senza dubbio uno spreco di memoria.

      Questo può essere evitato modificando il codice in questo modo:

      sostituisci original.substring(beginIndex) con new String(original.substring(beginIndex)) , dove original è la stringa originale.

      Spiega come funziona HashMap. Come si risolve il problema dei duplicati?

      La maggior parte di voi sarà sicuramente d'accordo sul fatto che HashMap sia l'argomento dell'intervista più preferito al momento. Se qualcuno mi chiede di dirti "Come funziona HashMap?", risponderò semplicemente: "Basato sul principio dell'hashing". Per quanto semplice sia.

      Quindi, l'hashing è essenzialmente un modo per assegnare un codice univoco a qualsiasi variabile/oggetto dopo aver applicato qualsiasi formula/algoritmo alle sue proprietà.

      La definizione di una mappa è: "Un oggetto che lega le chiavi ai valori". Molto semplice, vero? Quindi, HashMap contiene la sua classe interna Entry , che assomiglia a:

      classe statica Entry implementa Map . Iscrizione(chiave K finale; valore V; voce successiva; hash int finale; …//Altro codice va qui)

      Quando qualcuno tenta di inserire una coppia chiave-valore in una HashMap , accade quanto segue:

      • Prima di tutto, l'oggetto chiave viene confrontato con null . Se la chiave è null, il valore viene archiviato nella tabella delle posizioni. Perché l'hashcode per null è sempre 0.
      • Quindi, il passaggio successivo consiste nel calcolare il valore hash chiamando il suo metodo hashCode() sulla variabile chiave. Questo hash viene utilizzato per calcolare l'indice nell'array per contenere l'oggetto Entry. Gli sviluppatori JDK erano ben consapevoli che il metodo hashCode() poteva essere scritto male e poteva restituire un valore molto grande o molto piccolo. Per risolvere questo problema, hanno introdotto un altro metodo hash() e passano l'hashcode dell'oggetto a questo metodo per trasmettere quel valore all'intervallo di dimensioni dell'indice dell'array.
      • Il metodo indexFor(hash, table.length) viene ora chiamato per calcolare la posizione esatta in cui archiviare l'oggetto Entry.
      • Ora la parte principale. Poiché sappiamo che due oggetti dissimili possono avere lo stesso valore hashcode, come possono essere archiviati due oggetti diversi nella stessa posizione in un archivio [chiamato cestino]?

      La risposta è LinkedList. Se ricordi, la classe Entry ha una proprietà "next". Questa proprietà punta sempre all'oggetto successivo nella catena. Questo comportamento è molto simile a LinkedList .

      Quindi, in caso di corrispondenze di hashcode, gli oggetti Entry vengono archiviati sotto forma di LinkedList . Quando una voce deve essere posizionata in un determinato indice, HashMap controlla se esiste un'altra voce in quella posizione? Se non ci sono record lì, il nostro oggetto verrà salvato in questa posizione.

      Se c'è già un altro oggetto nel nostro indice, il suo campo successivo viene selezionato. Se è null , il nostro oggetto diventa il nodo successivo nella LinkedList . Se next non è null , questa procedura viene ripetuta finché non viene trovato un campo null next.

      Cosa succede se aggiungiamo un altro valore chiave uguale a quello che abbiamo aggiunto in precedenza? È logico che dovrebbe sostituire il vecchio valore. Come succede? Dopo aver determinato l'indice di posizione per l'oggetto Entry, iterando sulla LinkedList che si trova al nostro indice, HashMap chiama il metodo equals() sul valore chiave per ogni oggetto Entry. Tutti questi oggetti Entry nella LinkedList hanno lo stesso valore hashcode, ma il metodo equals() verificherà la vera uguaglianza. Se chiave. uguale(k) volontà vero, entrambi verranno trattati come lo stesso oggetto. In questo modo verrà sostituito solo l'oggetto valore all'interno dell'oggetto Entry.

      Così HashMap garantisce l'unicità delle chiavi.

      Differenze tra interfacce e classi astratte?

      Questa è una domanda molto comune se stai intervistando un programmatore di livello junior. Le differenze più significative sono elencate di seguito:

      • Nelle interfacce Java, le variabili sono finali a priori. Le classi astratte possono contenere variabili non finali.
      • Un'interfaccia in Java non può assolutamente avere un'implementazione. Una classe astratta può avere istanze di metodi che implementano il comportamento di base.
      • I membri dell'interfaccia devono essere pubblici. Una classe astratta può avere modificatori di accesso di qualsiasi tipo.
      • È necessario implementare un'interfaccia con la parola chiave implements. Una classe astratta deve essere estesa con una parola chiave si estende.
      • In Java, una classe può implementare molte interfacce, ma può ereditare solo da una classe astratta.
      • Un'interfaccia è completamente astratta e non può essere istanziata. Anche una classe astratta non può avere istanze della classe, ma può essere chiamata se esiste il metodo main().
      • Una classe astratta è leggermente più veloce di un'interfaccia perché un'interfaccia prevede una ricerca prima di chiamare qualsiasi metodo sottoposto a override in Java. Nella maggior parte dei casi, questa è una piccola differenza, ma se stai scrivendo un'applicazione che richiede tempo, devi considerare anche questo fatto.
    1. Quando sovrascrivi i metodi hashCode() e equals()?

      I metodi hashCode() ed equals() sono definiti nella classe Object, che è la classe padre di tutti gli oggetti Java. Per questo motivo, tutti gli oggetti Java ereditano l'implementazione di base di questi metodi.

      Il metodo hashCode() viene utilizzato per ottenere un valore intero univoco per un determinato oggetto. Questo valore viene utilizzato per determinare la posizione del carrello quando l'oggetto deve essere archiviato in una struttura dati come una tabella hash. Per impostazione predefinita, il metodo hashCode() restituisce una rappresentazione intera dell'indirizzo di memoria in cui è archiviato l'oggetto.

      Il metodo equals(), come suggerisce il nome, viene utilizzato per l'equivalenza semplice degli oggetti. L'implementazione di base del metodo consiste nel controllare i riferimenti dei due oggetti per vedere se sono equivalenti.

      Nota che di solito è necessario sovrascrivere il metodo hashCode() ogni volta che il metodo equals() viene sovrascritto. Ciò è necessario per supportare la convenzione generale del metodo hashCode, che afferma che oggetti uguali devono avere codici hash uguali.

      Il metodo equals() deve determinare l'uguaglianza della relazione (deve essere ricorsivo, simmetrico e transitivo). Inoltre, deve essere persistente (se l'oggetto non è cambiato, il metodo deve restituire lo stesso valore). Inoltre, o.equals(null) dovrebbe sempre restituire falso.

      hashCode() deve anche essere stabile (se l'oggetto non è cambiato nelle condizioni del metodo equals(), deve continuare a restituire lo stesso valore.

      La relazione tra i due metodi è: sempre se a.equals(b) , allora a.hashCode() deve essere uguale a b.hashCode() .

    Buona fortuna con i tuoi studi!! Autore articolo Lokesh Gupta Articolo originale Collegamenti ad altre parti: