Hashmap Wywiad Pytania i Odpowiedzi [Dla początkujących i doświadczonych]
Opublikowany: 2020-09-24Klasa java.util.HashMap jest zdecydowanie jedną z najważniejszych bibliotek Javy. Rzadko zdarzają się projekty, które są napisane w javie, a do ich implementacji nie jest wykorzystywana biblioteka HashMap. Jest to sposób, w jaki ta struktura danych jest zaimplementowana, co sprawia, że jest to prawie niezbędne dla każdego programu związanego z Javą. HashMap w swojej definicji jest bardzo prosty. HashMap to struktura danych zaimplementowana przy użyciu bardzo tabelarycznego podejścia.
Słusznie mówi się, że jeśli miałaby istnieć tylko jedna struktura danych, powinna to być HashMap. Jest to nie tylko bardzo przydatne, ale także bardzo wydajne czasowo. Proste wyszukiwanie w HashMap zajmuje tylko około O(1) czasu (co oznacza, że wszystkie wyszukiwania w HashMap są wykonywane w stałym czasie). Znajdziesz wiele implementacji HashMap w języku programowania Java, takich jak HashTable, concurrenthashmaps itp. Jeśli jednak szukasz ogólnej implementacji, nie powinieneś odchodzić od podstawowego HashMap.
Każda z tych implementacji HashMap zawiera własne zestawy funkcji i przypadków użycia. Jeśli chcesz, aby kolejność, w jakiej napisałeś mapowanie, została zachowana, powinieneś skorzystać z Linked HashMap. Jeśli chcesz posortować swoje mapowanie, powinieneś użyć implementacji TreeMap HashMap, która wykonuje sortowanie za Ciebie.
W podobny sposób, jeśli szukasz tabeli Hash, która jest bezpieczna dla wątków, która może być również używana we współbieżnej aplikacji przy zachowaniu skalowalności, będziesz patrzeć na współbieżną HashMap.
Jak widać, istnieje wiele sposobów wykorzystania HashMap. Aby naprawdę poznać znaczenie HashMap, powinieneś zapoznać się z pytaniami do rozmowy kwalifikacyjnej dla dowolnego profilu stanowiska inżyniera oprogramowania. Nie będziesz w stanie poprawnie zoptymalizować czasu, jeśli nie wiesz, jak poprawnie zaimplementować HashMap. Tak więc, jeśli jesteś programistą, nie możesz odejść od poznania tajników HashMap. Dlatego poniżej wymieniliśmy kilka wyjątkowych pytań do rozmowy kwalifikacyjnej z hashmapą, które powinny pomóc ci przygotować się do następnej rozmowy kwalifikacyjnej.
Ucz się online kursu nauki o danych z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.
Spis treści
Hashmap Wywiad Pytania i odpowiedzi
Q1. Jak użyjesz metody put() HashMap w Javie?
Odp. Metoda put() działa po prostu wykorzystując zasadę znaną jako hashowanie. Możesz użyć tej funkcji do przechowywania danego obiektu w zapleczu (który jest tablicą pamięci). Musiałbyś użyć innej funkcji razem z funkcją put(), aby móc ustalić dokładną pozycję tego obiektu w zapleczu. Funkcja hashcode() jest używana jako funkcja pomocnicza do put() w sposób, który opisaliśmy wcześniej.
Tak więc sposób, w jaki te dwie funkcje współpracują ze sobą, polega na tym, że szukają dostępnego klucza i lokalizacji pamięci w zapleczu. Jeśli zdarzy się, że się zderzą, obiekt, który ma obie wartości (czyli wartości zarówno klucza, jak i wartości), jest następnie dodawany do dynamicznej implementacji listy, znanej również jako lista połączona. Polubiona lista tutaj jest przechowywana w lokalizacji pamięci, która została wcześniej znaleziona.
Q2. Jakie są podstawowe potrzeby obiektu, aby mógł być używany jako klucz lub wartość HashMap?
Odp. Zarówno klucz, jak i wartość, której używamy w dowolnym HashMapie i jego implementacji, również powinny mieć zapisane w sobie te dwie funkcje. Nazwa tych dwóch funkcji to equals() i hashcode(). Funkcja o nazwie hashcode() jest używana, gdy wstawiamy wartość klucza w dowolnej HashMapie. Jednocześnie funkcja equals() jest wywoływana tylko wtedy, gdy próbujemy odzyskać wartość, która była już zapisana w HashMap.
Q3. Powiedzmy, że zgubiłeś klucze, których już użyłeś w HashMapie. Następny klucz, który chcesz dodać, jest już obecny w HashMapie. Jak myślisz, co się stanie w tym przypadku?
Odp. Jeśli uważasz, że powinien wystąpić błąd, nie pomylisz się, jeśli nie mówimy o HashMapie. Jeśli jednak używasz HashMap i zdarzy ci się wstawić klucz, którego wartość była już obecna w hashmapie, kompilator java nie zgłosi żadnego błędu. Zamiast tego kompilator po prostu przejdzie i znajdzie wartość powiązaną z wprowadzonym kluczem i tylko zaktualizuje tam wartość.
Jeśli użyjesz funkcji put(), aby dodać wartość do hashmap, wartość zwracana przez tę funkcję będzie starą wartością powiązaną z tym kluczem. Załóżmy więc, że dla klucza A masz przechowywaną wartość 1. Jeśli teraz ustawisz wartość A na, powiedzmy 50, to wartość, która zostanie zwrócona przez funkcję put() będzie 1 , a ostateczna wartość przechowywana w kluczu A wynosiłaby 50.
Q4. W przypadku konieczności zapisania wartości null. Czy w takim przypadku byłbyś w stanie użyć HashMap?
Odp. Tak, w takim przypadku moglibyśmy używać hashmap bez żadnych problemów, ponieważ hashmapy nie zmniejszają wartości, którą możesz przechowywać. W dowolnej hashmapie możesz przechowywać tyle wartości null, ile dusza zapragnie.
P5. Jak jest obsługiwana kolizja z implementacją hashmap w Javie?
Odp. Biblioteka kodu java.util.HashMap wykorzystuje metodę tworzenia łańcuchów do obsługi kolizji. Sposób, w jaki działa to łączenie w łańcuch, to każdy nowy wpis w hashmapie, który zawiera zarówno parę klucz, jak i wartość, byłby przechowywany na połączonej liście, a ta lista byłaby następnie przechowywana w miejscu, w którym znajdują się istniejące dane z hashmap (lokalizacja zasobnika) .
W przypadku, gdy wszystkie klucze, które masz w hashmapie okażą się mieć ten sam hashcode, to Twój hashmap nie będzie już hashmapą. Zostanie przekształcona w połączoną listę. Czas wyszukiwania wzrośnie o rząd jeden (o(1)), tj. czas stały, do rzędu N (O(N)) czyli czasu liniowego.
P6. Czy będziesz w stanie przechowywać klucz, który ma wartość null w implementacji hashmap w javie?
Odp. Tak, w implementacji hashmap w Javie będziesz mógł przechowywać klucze o wartości null. Ale będziesz mógł przechowywać tylko jeden taki klucz, który zawsze będzie przechowywany na początku listy życzeń. Hashmap nie wywoła tutaj funkcji hashcode(), ponieważ jeśli ta funkcja zostanie użyta na klawiszu zerowym, zgłosi błąd wyjątku wskaźnika zerowego. Będziesz musiał użyć funkcji get zamiast używać wartości null jako klucza, jeśli chcesz, aby pierwszy indeks twojego hashmapa został zwrócony.

Przeczytaj: Sortowanie w strukturze danych: kategorie i typy
P7. Jak myślisz, którą strukturę danych ma naśladować hashmap?
Odp. Hashmap ma naśladować wygląd i funkcjonalność struktury danych tablicy mieszającej. Struktura danych tabeli mieszającej jest idealnym wyborem, jeśli chcesz przechowywać wartości w postaci pary klucza i wartości. Głównym powodem, dla którego ta tablica mieszająca jest preferowana, jest czas wyszukiwania. Tak więc, jeśli masz klucz, którego chcesz szukać, to w kolejności jednego lub stałego czasu będziesz w stanie odzyskać pożądaną wartość.
P8. Ponieważ hashmap nie jest jedną z podstawowych struktur danych, takich jak struktura czy tablice. Jak myślisz, co dzieje się pod maską, gdy tworzysz hashmapę? Jak myślisz, kombinacja której struktury danych dała nam hashmapy?
Odp. Chociaż hashmap faktycznie reprezentuje tablicę haszującą, ale pod maską, nie jest bezpośrednio zaimplementowany. Używamy dwóch dobrze znanych struktur danych, aby tchnąć życie w hashmapę. Używamy połączonej listy i tablic. Połączona lista służy do dynamicznego przechowywania pary klucza i wartości, a tablica służy do przechowywania wszystkich tych połączonych list w nich; razem tworzą hashmapę.
Od Javy 8, jeśli połączona lista staje się wystarczająco duża, to zamiast połączonej listy Java implementuje zamiast tego drzewo wyszukiwania binarnego. Ta zmiana ma na celu zaoszczędzenie czasu i poprawę ogólnej wydajności hashmap.
Przeczytaj także: Pytania do wywiadu dotyczącego nauki o danych
P9. W przypadku, gdy chcemy przechowywać wiele wartości pod tym samym kluczem, czy myślisz, że będzie to możliwe w implementacji hashmap obecnej w Javie?
Odp. Nie, nie będziesz mógł przechowywać zduplikowanych kluczy w hashmapie. Jeśli spróbujesz zapisać nową wartość w kluczu już obecnym w hashmapie, to hashmap po prostu usunie wartość, która była wcześniej zapisana w tym kluczu i zastąpi ją nową.
W tym przypadku rozmiar hashmapy się nie zmieni, co oznacza, że nie będzie dodawania kluczy do hashmapy. Ta funkcja jest jednym z powodów, dla których używamy funkcji keyset(), aby odzyskać wszystkie klucze z mapy haszującej i że ta funkcja zwraca zestaw, a nie kolekcję (ponieważ w zestawie wszystkie wartości muszą być unikatowe).
Q10. Czy będziesz w stanie przechowywać zduplikowane wartości w HashMap?
Odp. Tak, będziesz mógł przechowywać zduplikowane wartości w hashmapie. To jest powód, dla którego pobierasz wszystkie wartości z hashmap. Wtedy zamiast zestawu, otrzymujemy kolekcję. Nie podaje wartości w formie listy, ponieważ kolejność nie jest gwarantowana.
P11. Czy w implementacji Javy hashmap jest bezpieczny dla wątków?
Odp. Nie, waniliowy Hashmap wcale nie jest bezpieczny dla wątków w Javie. Najlepiej byłoby unikać udostępniania hashmapy wątkowi, który może zmienić wartość i edytować hashmapę w dowolnej formie lub kształcie. Możesz jednak użyć hashmapy tylko do odczytu, a następnie wprowadzić ją do wątku. W ten sposób wartości w nich zawarte nie ulegną zmianie.
P12. Jak myślisz, co się stanie, jeśli użyjemy hashmap w aplikacji, która korzysta z wielu wątków?
Odp. Jeśli zdarzy się, że przekażesz hashmapę do aplikacji, która używa więcej niż jednego wątku, a każdy z tych wątków może modyfikować, dodawać lub usuwać wartości, które są przechowywane w hashmapie, wtedy wewnętrzne dane, przez które hashmapa została skonstruowana, zostaną uszkodzone . Zaginęłyby linki, które zostały użyte do utworzenia hashmapy, a następnie hashmapa utraciłaby swoją strukturę, a także jej przeznaczenie. Dlatego zawsze zaleca się, aby zawsze używać hashmapy bezpiecznej dla wątków, jeśli chcesz ich używać w aplikacji, która jest wątkowa.
P13. Jeśli chcemy iterować po całej HashMapie w Javie. Na jakie różne sposoby moglibyśmy to zrobić?
Odp. Istnieje wiele sposobów na iterację hashmapy w javie; niektóre z nich są wymienione poniżej:
- Możesz użyć funkcji keySet połączonej ze zmienną iteracyjną.
- Możesz użyć funkcji enterySet połączonej ze zmienną iteracyjną.
- Możesz użyć funkcji entrySet i użyć jej z rozszerzoną pętlą.
- Możesz użyć zestawu kluczy i uzyskać metodę.
Przeczytaj także: Struktury danych i algorytm w Pythonie: wszystko, co musisz wiedzieć
Co następne?
Jeśli jesteś zainteresowany nauką o danych, sprawdź program IIIT-B i upGrad Executive PG w dziedzinie Data Science, który jest stworzony dla pracujących profesjonalistów i oferuje ponad 10 studiów przypadków i projektów, praktyczne warsztaty praktyczne, mentoring z ekspertami z branży, 1 -on-1 z mentorami branżowymi, ponad 400 godzin nauki i pomocy w pracy z najlepszymi firmami.
Czym różni się Hashtable od HashMap?
Niezsynchronizowana struktura danych to HashMap. Z drugiej strony Hashtable jest bezpieczny wątkowo i może być współużytkowany przez wiele wątków bez wymogu kodu synchronizacji. Hashtable nie zezwala na jeden klucz null lub wiele wartości null, ale HashMap pozwala. HashMap powinien być używany zamiast Hashtable w aplikacjach bez wątków. Mówiąc najprościej, HashMap powinien być używany w aplikacjach jednowątkowych lub niezsynchronizowanych.
Czy szybciej jest używać HashMap czy TreeMap?
W TreeMap wartości są określane przez klucz. Nie może mieć klucza null, ale może mieć wiele wartości null. Jest identyczny z HashMap, z wyjątkiem tego, że zamiast w kolejności rosnącej zachowuje porządek rosnący (posortowany według naturalnej kolejności swojego klucza). HashMap wykorzystuje strukturę danych opartą na tablicy, aby uporządkować swoje komponenty zgodnie z funkcją skrótu jako implementacją opartą na tablicy haszującej. W przypadku większości operacji, takich jak add(), delete() i zawiera, HashMap prognozuje wydajność w czasie stałym O(1) (). W rezultacie jest znacznie szybszy niż TreeMap.
Kiedy lepiej używać HashMap zamiast ArrayList?
Tylko wtedy, gdy dostępne są unikalne klucze dla danych, które chcemy przechowywać, HashMap ma sens. Szukając rzeczy opartych na kluczu, powinniśmy z niego korzystać, ponieważ szybki czas dostępu to konieczność. Gdy zachowanie tej samej kolejności wpisów w kolekcji ma kluczowe znaczenie, powinniśmy unikać HashMap. Oba różnią się od siebie i służą różnym celom. Jeśli chcesz przechowywać obiekty w Javie, użyj HashMap do mapowania kluczy na wartości, a ArrayList w przeciwnym razie.