Domande e risposte per l'intervista con hashmap [per principianti ed esperti]
Pubblicato: 2020-09-24La classe di java.util.HashMap è di gran lunga una delle più importanti librerie di Java. Raramente esiste un progetto scritto in java e non utilizza la libreria di HashMap nella loro implementazione. È il modo in cui viene implementata questa struttura di dati, che lo rende quasi indispensabile per qualsiasi programma relativo a Java. HashMap, nella sua definizione, è molto semplice. HashMap è una struttura di dati che viene implementata utilizzando un approccio molto tabulare.
Si dice giustamente che se ci fosse una sola struttura dati, dovrebbe essere HashMap. Non solo è molto utile, ma anche molto efficiente in termini di tempo. Una semplice ricerca in HashMap richiede solo circa O(1) tempo (il che significa che tutta la ricerca in una HashMap viene eseguita in un tempo costante). Troverai molte implementazioni di HashMap nel linguaggio di programmazione di Java, come HashTable, concurrenthashmaps, ecc. Tuttavia, se stai cercando un'implementazione generale non dovresti allontanarti da HashMap di base.
Ognuna di queste implementazioni di HashMap viene fornita con i propri set di funzionalità e casi d'uso. Se vuoi che l'ordine in cui hai scritto la mappatura sia preservato, dovresti cercare di usare la Linked HashMap. Se desideri che la tua mappatura sia ordinata, dovresti usare l'implementazione TreeMap di HashMap, che fa l'ordinamento per te.
In modo simile, se stai cercando una tabella Hash che sia thread-safe, che può essere utilizzata anche in un'applicazione simultanea mantenendo la scalabilità, dovresti considerare una HashMap simultanea.
Come puoi vedere, ci sono vari modi in cui puoi usare HashMap. Per conoscere davvero l'importanza di HashMap, dovresti vedere le domande del colloquio per qualsiasi profilo di lavoro di ingegneria del software. Non sarai in grado di ottimizzare correttamente il tempo se non sai come implementare correttamente una HashMap. Quindi, se sei un programmatore, non puoi allontanarti dall'imparare i dettagli di HashMap. Quindi abbiamo elencato di seguito alcune domande di intervista sull'hashmap in sospeso, che dovrebbero aiutarti a prepararti per la tua prossima intervista.
Impara il corso di scienza dei dati online dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzati o programmi di master per accelerare la tua carriera.
Sommario
Domande e risposte per l'intervista con hashmap
Q1. Come utilizzerai il metodo put() di HashMap in Java?
Ans. Il metodo di put() funziona semplicemente utilizzando il principio noto come hashing. Si utilizzerà questa funzione per memorizzare l'oggetto in questione nel back-end (che è un array di memoria). Dovresti usare un'altra funzione insieme a questa funzione put() per poter accertare l'esatta posizione di questo oggetto nel backend. La funzione hashcode() viene utilizzata come funzione di supporto per put() nel modo descritto in precedenza.
Quindi, il modo in cui queste due funzioni lavorano insieme è che vanno a cercare la chiave disponibile e la posizione di memoria nel back-end. Se si scontrano, l'oggetto che ha entrambi i valori (ovvero i valori di chiave e valore) viene quindi aggiunto a un'implementazione dinamica di un elenco, noto anche come elenco collegato. L'elenco dei preferiti qui è memorizzato nella posizione di memoria, che è stata trovata in precedenza.
Q2. Quali sono i bisogni di base che un oggetto deve avere per poter essere utilizzato come chiave o come valore di una HashMap?
Ans. Sia la chiave che il valore che usiamo in qualsiasi HashMap e la sua implementazione dovrebbero anche avere queste due funzioni scritte al loro interno. Il nome di queste due funzioni è equals() e hashcode(). La funzione che ha il nome di hashcode() viene utilizzata quando inseriamo il valore della chiave in una qualsiasi HashMap. Allo stesso tempo, la funzione di equals() viene chiamata solo quando stiamo cercando di recuperare il valore che era già memorizzato nella HashMap.
Q3. Diciamo che hai perso traccia delle chiavi che hai già utilizzato nella tua HashMap. La chiave successiva che vuoi aggiungere è già presente nella HashMap. Cosa pensi accadrà in questo caso?
Ans. Se ritieni che dovrebbe esserci un errore, non sbaglierai se non stessimo parlando di HashMap. Tuttavia, se stai usando HashMap e ti capita di inserire una chiave il cui valore era già presente nell'hashmap, il compilatore java non genererà alcun errore. Invece, ciò che accadrà è che il compilatore andrà semplicemente a trovare il valore associato alla chiave che hai inserito e aggiornerà solo il valore lì.
Se usi la funzione put() per aggiungere il valore alla hashmap, il valore restituito da questa funzione sarebbe il vecchio valore associato a quella chiave. Quindi, supponiamo che per la chiave A, tu abbia un valore memorizzato di 1. Se ora metti il valore di A come essere, diciamo 50, allora il valore che verrà restituito dalla funzione put() sarà 1 e il valore finale memorizzato nella chiave A sarebbe 50.
Q4. Nel caso in cui si presenti la necessità di memorizzare un valore nullo. Saresti in grado di utilizzare HashMap in quel caso?
Ans. Sì, in tal caso saremmo in grado di utilizzare hashmap senza problemi perché le hashmap non riducono il valore che puoi archiviare. Puoi memorizzare tutti i valori nulli che il tuo cuore desidera in qualsiasi hashmap.
Q5. Come viene gestita la collisione con l'implementazione della hashmap in Java?
Ans. La libreria di codice di java.util.HashMap utilizza il metodo di concatenamento per gestire le collisioni. Il modo in cui funziona questo concatenamento è che qualsiasi nuova voce nella hashmap, che contiene sia la chiave che la coppia di valori, verrebbe archiviata in un elenco collegato e questo elenco verrebbe quindi archiviato dove risiedono i dati esistenti delle hashmap (la posizione del bucket) .
Nel caso in cui tutte le chiavi che hai nella tua hashmap risultino avere lo stesso hashcode, la tua hashmap non sarà più hashmap. Verrà trasformato in un elenco collegato. Il tempo di ricerca aumenterà dell'ordine di uno (o(1)), cioè tempo costante, all'ordine di N (O(N)) che è il tempo lineare.
Q6. Sarai in grado di memorizzare una chiave che ha un valore nullo nell'implementazione di hashmap di Java?
Ans. Sì, nell'implementazione di java della hashmap, sarai in grado di memorizzare chiavi con un valore nullo. Ma sarai in grado di memorizzare solo una di queste chiavi, che sarà sempre archiviata all'inizio dell'elenco dei bucket. L'hashmap non chiamerà la funzione hashcode() qui perché se quella funzione viene utilizzata su una chiave nulla, genererà un errore di eccezione del puntatore nullo. Dovrai usare la funzione get invece di usare il valore null come chiave se vuoi che ti venga restituito il primo indice della tua hashmap.

Leggi: Ordinamento nella struttura dei dati: categorie e tipi
Q7. Quale struttura di dati pensi che hashmap sia progettata per imitare?
Ans. L'hashmap dovrebbe imitare l'aspetto e la funzionalità della struttura dei dati della tabella hash. La struttura dei dati della tabella hash è la scelta ideale se si desidera archiviare i valori sotto forma di una coppia chiave e valore. Il motivo principale per cui questa tabella hash è preferita è il tempo di ricerca. Quindi, se hai la chiave che vuoi cercare, in un solo ordine di tempo o costante, sarai in grado di recuperare il valore che desideri.
Q8. Poiché hashmap non è una delle strutture di dati principali come la struttura o gli array. Cosa pensi che succeda sotto il cofano ogni volta che crei una hashmap? Quale combinazione di struttura dati pensi ci abbia fornito le hashmap?
Ans. Anche se l'hashmap in realtà rappresenta una tabella hash, ma sotto il cofano non è implementata direttamente. Usiamo due ben note strutture di dati per dare vita a una hashmap. Usiamo un elenco collegato e array. Un elenco collegato viene utilizzato per memorizzare dinamicamente la coppia chiave e valore e l'array viene utilizzato per archiviare in essi tutti questi elenchi collegati; insieme, formano una hashmap.
Da Java 8, se l'elenco collegato diventa sufficientemente grande, invece dell'elenco collegato Java implementa invece un albero di ricerca binario. Questa modifica viene eseguita per risparmiare tempo e migliorare le prestazioni complessive di hashmap.
Leggi anche: Domande sull'intervista sulla scienza dei dati
Q9. Nel caso in cui desideriamo memorizzare più valori sotto la stessa chiave, pensi che sarà possibile nell'implementazione hashmap presente in Java?
Ans. No, non sarai in grado di memorizzare chiavi duplicate nella hashmap. Se si tenta di memorizzare un nuovo valore in una chiave già presente nell'hashmap, l'hashmap rimuoverà semplicemente il valore precedentemente memorizzato in quella chiave e lo sostituirà con quello nuovo.
La dimensione della hashmap, in questo caso, non cambierebbe, il che significa che non ci saranno aggiunte di chiavi nella hashmap. Questa caratteristica è uno dei motivi per cui utilizziamo la funzione keyset() per recuperare tutte le chiavi di una hashmap e che questa funzione restituisce un set e non una raccolta (perché in un set tutti i valori devono essere univoci).
Q10. Sarai in grado di memorizzare valori duplicati in HashMap?
Ans. Sì, sarai in grado di memorizzare valori duplicati nella hashmap. Questo è il motivo per cui recuperi tutti i valori dalla hashmap. Quindi invece di ottenere un set, otteniamo una collezione. Non dà il valore sotto forma di lista perché l'ordine non è garantito.
Q11. Nell'implementazione Java dell'hashmap, è thread-safe?
Ans. No, l'Hashmap vanilla non è affatto thread-safe in Java. Idealmente, dovresti evitare di condividere l'hashmap con un thread che può modificare il valore e modificare l'hashmap in qualsiasi forma o forma. Puoi, tuttavia, utilizzare una hashmap di sola lettura e quindi inserirla nel thread. In questo modo, i valori in essi contenuti non cambieranno.
Q12. Cosa pensi accadrà se usiamo la hashmap in un'applicazione che utilizza multi thread?
Ans. Se ti capita di passare un hashmap a un'applicazione che utilizza più di un thread e ciascuno di questi thread può modificare, aggiungere o rimuovere i valori che sono memorizzati nell'hashmap, i dati interni attraverso i quali è stata costruita l'hashmap sarebbero danneggiati . I link che sono stati usati per formare l'hashmap andrebbero perduti, e quindi l'hashmap perderebbe la sua struttura e anche il suo scopo andrebbe perso. Quindi è sempre consigliabile utilizzare sempre hashmap thread-safe se si desidera utilizzarli in un'applicazione threaded.
Q13. Se vogliamo scorrere l'intera HashMap in Java. Quali sono i diversi modi in cui potremmo farlo?
Ans. Ci sono molti modi in cui potresti essere in grado di scorrere una hashmap in java; alcuni di essi sono elencati di seguito:
- È possibile utilizzare la funzione keySet accoppiata con una variabile iterativa.
- È possibile utilizzare la funzione enterySet accoppiata con una variabile iterativa.
- È possibile utilizzare la funzione entrySet e utilizzarla con un ciclo avanzato.
- Puoi usare il keySet e ottenere un metodo.
Leggi anche: Strutture dati e algoritmi in Python: tutto ciò che devi sapere
Cosa succede dopo?
Se sei curioso di conoscere la scienza dei dati, dai un'occhiata al programma Executive PG in Data Science di IIIT-B e upGrad, creato per i professionisti che lavorano e offre oltre 10 casi di studio e progetti, workshop pratici pratici, tutoraggio con esperti del settore, 1 -on-1 con mentori del settore, oltre 400 ore di apprendimento e assistenza al lavoro con le migliori aziende.
In che modo un Hashtable è diverso da un HashMap?
Una struttura dati non sincronizzata è una HashMap. Un Hashtable, d'altra parte, è thread-safe e può essere condiviso tra molti thread senza il requisito del codice di sincronizzazione. Hashtable non consente una chiave nulla o più valori nulli, ma HashMap lo consente. HashMap dovrebbe essere usato al posto di Hashtable nelle applicazioni non thread. Detto semplicemente, HashMap dovrebbe essere utilizzato in applicazioni a thread singolo o non sincronizzate.
È più veloce usare una HashMap o una TreeMap?
In una TreeMap, i valori sono determinati dalla chiave. Non può avere una chiave nulla, ma può avere più valori nulli. È identico a HashMap, tranne per il fatto che invece dell'ordine crescente, mantiene l'ordine crescente (ordinato usando l'ordine naturale della sua chiave). HashMap utilizza una struttura di dati basata su array per organizzare i suoi componenti in base alla funzione hash come implementazione basata su hashtable. Per la maggior parte delle operazioni come add(), delete() e contiene, HashMap prevede prestazioni a tempo costante di O(1)(). Di conseguenza, è molto più veloce di una TreeMap.
Quando è meglio usare HashMap invece di un ArrayList?
Solo quando sono disponibili chiavi univoche per i dati che desideriamo archiviare HashMap ha senso. Quando cerchiamo cose basate su una chiave, dovremmo usarla poiché il tempo di accesso rapido è un must. Quando è fondamentale mantenere lo stesso ordine di voci in una raccolta, dovremmo evitare HashMap. Sono entrambi distinti l'uno dall'altro e servono a scopi distinti. Se desideri archiviare oggetti in Java, utilizza HashMap per mappare le chiavi sui valori e in caso contrario ArrayList.