해시맵 인터뷰 질문 및 답변 [초보자 및 경험자용]
게시 됨: 2020-09-24java.util.HashMap의 클래스는 단연코 가장 중요한 Java 라이브러리 중 하나입니다. Java로 작성된 프로젝트가 거의 없으며 구현 시 HashMap 라이브러리를 사용하지 않습니다. 이 데이터 구조가 구현되는 방식이므로 Java 관련 프로그램에서 거의 필수 불가결합니다. 정의에 따르면 HashMap은 매우 간단합니다. HashMap은 매우 표 형식의 접근 방식을 사용하여 구현되는 데이터 구조입니다.
데이터 구조가 하나만 있다면 HashMap이어야 한다는 말이 맞습니다. 이것은 매우 유용할 뿐만 아니라 매우 시간 효율적입니다. HashMap의 간단한 조회는 약 O(1) 시간만 걸립니다(HashMap의 모든 조회가 일정한 시간에 수행됨을 의미). HashTable,concurrenthashmaps 등과 같은 Java 프로그래밍 언어에서 HashMap의 많은 구현을 찾을 수 있습니다. 그러나 일반적인 구현을 찾고 있다면 기본 HashMap에서 멀리 벗어나서는 안됩니다.
이러한 HashMap의 각 구현에는 고유한 기능 및 사용 사례 세트가 있습니다. 매핑을 작성한 순서를 유지하려면 Linked HashMap을 사용해야 합니다. 매핑을 정렬하려면 정렬을 수행하는 HashMap의 TreeMap 구현을 사용해야 합니다.
비슷한 방식으로 스레드로부터 안전하고 확장성을 유지하면서 동시 응용 프로그램에서도 사용할 수 있는 해시 테이블을 찾고 있다면 동시 HashMap을 보게 될 것입니다.
보시다시피 HashMap을 사용할 수 있는 방법은 다양합니다. HashMap의 중요성을 제대로 알기 위해서는 모든 소프트웨어 엔지니어링 직무 프로필에 대한 인터뷰 질문을 확인해야 합니다. HashMap을 올바르게 구현하는 방법을 모르면 시간을 제대로 최적화할 수 없습니다. 따라서 프로그래머라면 HashMap의 모든 것을 배울 수 밖에 없습니다. 그래서 다음 인터뷰를 준비하는 데 도움이 될 몇 가지 뛰어난 해시맵 인터뷰 질문을 아래에 나열했습니다.
세계 최고의 대학에서 온라인으로 데이터 과학 과정을 배우십시오 . 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.
목차
해시맵 인터뷰 질문 및 답변
Q1. Java에서 HashMap의 put() 메소드를 어떻게 사용합니까?
앤. put() 메서드는 단순히 해싱으로 알려진 원리를 사용하여 작동합니다. 이 함수를 사용하여 문제의 객체를 백엔드(메모리 배열)에 저장합니다. 백엔드에서 이 객체의 정확한 위치를 확인할 수 있으려면 이 put() 함수와 함께 다른 함수를 사용해야 합니다. hashcode() 함수는 앞에서 설명한 방식으로 put()에 대한 도우미 함수로 사용됩니다.
따라서 이 두 기능이 함께 작동하는 방식은 백엔드에서 사용 가능한 키와 메모리 위치를 검색하는 것입니다. 충돌이 발생하면 두 값(키와 값 모두의 값을 의미)이 있는 객체가 목록의 동적 구현(연결 목록이라고도 함)에 추가됩니다. 여기에서 좋아요 목록은 이전에 발견된 메모리 위치에 저장됩니다.
Q2. 객체가 HashMap의 키 또는 값으로 사용되기 위해 필요한 기본 요구 사항은 무엇입니까?
앤. 우리가 HashMap과 그 구현에서 사용하는 키와 값 모두에는 이 두 함수가 작성되어 있어야 합니다. 이 두 함수의 이름은 equals() 및 hashcode()입니다. hashcode()라는 이름의 함수는 HashMap에 키 값을 삽입할 때 사용됩니다. 동시에 equals()의 함수는 HashMap에 이미 저장된 값을 되돌리려고 할 때만 호출됩니다.
Q3. HashMap에서 이미 사용한 키를 추적하지 못했다고 가정해 보겠습니다. 추가하려는 다음 키는 이미 HashMap에 있습니다. 이 경우 어떻게 될 것 같습니까?
앤. 오류가 있어야 한다고 생각한다면 HashMap에 대해 이야기하지 않았다면 틀리지 않을 것입니다. 그러나 HashMap을 사용 중이고 값이 이미 해시맵에 있는 키를 삽입하면 Java 컴파일러에서 오류가 발생하지 않습니다. 대신 컴파일러는 사용자가 입력한 키와 관련된 값을 찾아 해당 값만 업데이트합니다.
함수 put()을 사용하여 값을 해시맵에 추가하면 이 함수의 반환 값은 해당 키와 연결된 이전 값이 됩니다. 따라서 키 A에 대해 저장된 값이 1이라고 가정해 보겠습니다. 이제 A 값을 50이라고 가정해 보겠습니다. 그러면 put() 함수가 반환할 값은 1이 됩니다. , 키 A에 저장된 최종 값은 50입니다.
Q4. null 값을 저장할 필요가 있는 경우. 이 경우 HashMap을 사용할 수 있습니까?
앤. 예, 해시맵은 저장할 수 있는 값을 줄이지 않기 때문에 문제 없이 해시맵을 사용할 수 있습니다. 모든 해시맵에 마음이 원하는 만큼의 null 값을 저장할 수 있습니다.
Q5. Java에서 해시맵 구현으로 충돌을 어떻게 처리합니까?
앤. java.util.HashMap의 코드 라이브러리는 연결 방법을 사용하여 충돌을 처리합니다. 이 연결이 작동하는 방식은 키와 값 쌍을 모두 포함하는 해시맵에 대한 모든 새 항목이 연결 목록에 저장되고 이 목록이 해시맵의 기존 데이터가 있는 위치(버킷 위치)에 저장됩니다. .
해시맵에 있는 모든 키가 동일한 해시코드를 갖는 것으로 판명되면 해시맵은 더 이상 해시맵이 아닙니다. 연결 리스트로 바뀌게 됩니다. 룩업 시간은 1차(o(1)), 즉 일정한 시간 동안 선형 시간인 N(O(N)) 차수로 증가합니다.
Q6. java의 hashmap 구현에 null 값이 있는 키를 저장할 수 있습니까?
앤. 예, java의 해시맵 구현에서 null 값이 있는 키를 저장할 수 있습니다. 그러나 이러한 키는 하나만 저장할 수 있으며 항상 버킷 목록의 시작 부분에 저장됩니다. hashmap은 여기서 hashcode() 함수를 호출하지 않습니다. 해당 함수가 null 키에 사용되는 경우 Null 포인터 예외 오류가 발생하기 때문입니다. 해시맵의 첫 번째 인덱스를 반환하려면 null 값을 키로 사용하는 대신 get 함수를 사용해야 합니다.

읽기: 데이터 구조에서 정렬: 범주 및 유형
Q7. hashmap이 모방하도록 설계된 데이터 구조는 무엇이라고 생각합니까?
앤. 해시맵은 해시 테이블 데이터 구조의 모양과 기능을 모방해야 합니다. 키와 값 쌍의 형태로 값을 저장하려는 경우 해시 테이블 데이터 구조가 이상적인 선택입니다. 이 해시 테이블이 선호되는 주된 이유는 조회 시간 때문입니다. 따라서 찾고자 하는 키가 있으면 한 번 또는 일정한 시간 순서로 원하는 값을 다시 얻을 수 있습니다.
Q8. 해시맵은 구조나 배열과 같은 핵심 데이터 구조 중 하나가 아니기 때문입니다. 해시맵을 생성할 때마다 내부적으로 어떤 일이 발생한다고 생각하십니까? 어떤 데이터 구조의 조합이 해시맵을 제공했다고 생각합니까?
앤. 해시맵은 실제로 해시 테이블을 나타내지만 내부적으로는 직접 구현되지 않습니다. 우리는 해시맵에 생명을 불어넣기 위해 잘 알려진 두 가지 데이터 구조를 사용합니다. 우리는 연결 목록과 배열을 사용합니다. 연결 목록은 키와 값 쌍을 동적으로 저장하는 데 사용되며 배열은 이러한 모든 연결 목록을 저장하는 데 사용됩니다. 함께 해시맵을 형성합니다.
Java 8부터 연결 목록이 충분히 커지면 연결 목록 대신 Java가 이진 검색 트리를 대신 구현합니다. 이 변경은 시간을 절약하고 해시맵의 전반적인 성능을 향상시키기 위해 수행됩니다.
더 읽어보기: 데이터 과학 인터뷰 질문
Q9. 동일한 키에 여러 값을 저장하려는 경우 Java에 있는 해시맵 구현에서 가능하다고 생각하십니까?
앤. 아니요, 해시맵에 중복 키를 저장할 수 없습니다. 해시맵에 이미 있는 키에 새 값을 저장하려고 하면 해시맵은 단순히 이전에 해당 키에 저장된 값을 제거하고 새 값으로 대체합니다.
이 경우 해시맵의 크기는 변경되지 않습니다. 즉, 해시맵에 키가 추가되지 않습니다. 이 기능은 keyset() 함수를 사용하여 해시맵의 모든 키를 반환하고 이 함수가 컬렉션이 아닌 집합을 반환하는 이유 중 하나입니다(집합에서 모든 값은 고유해야 하기 때문).
Q10. HashMap에 중복 값을 저장할 수 있습니까?
앤. 예, 해시맵에 중복 값을 저장할 수 있습니다. 이것이 해시맵에서 모든 값을 검색하는 이유입니다. 그런 다음 세트를 얻는 대신 컬렉션을 얻습니다. 순서가 보장되지 않기 때문에 목록 형태로 값을 제공하지 않습니다.
Q11. Java의 해시맵 구현에서 스레드로부터 안전합니까?
앤. 아니요, 바닐라 Hashmap은 Java에서 스레드로부터 전혀 안전하지 않습니다. 이상적으로는 값을 변경할 수 있고 어떤 형태나 형태로든 해시맵을 편집할 수 있는 스레드와 해시맵을 공유하는 것을 피해야 합니다. 그러나 읽기 전용 해시맵을 사용한 다음 스레드에 공급할 수 있습니다. 이렇게 하면 그 안에 포함된 값이 변경되지 않습니다.
Q12. 다중 스레드를 사용하는 응용 프로그램에서 해시맵을 사용하면 어떻게 될까요?
앤. 하나 이상의 스레드를 사용하는 응용 프로그램에 해시맵을 전달하고 이러한 각 스레드가 해시맵에 저장된 값을 수정, 추가 또는 제거할 수 있는 경우 해시맵이 구성되는 데 사용된 내부 데이터가 손상됩니다. . 해시맵을 구성하는 데 사용된 링크가 사라지면 해시맵이 구조를 잃고 목적도 손실됩니다. 따라서 스레드된 응용 프로그램에서 사용하려는 경우 항상 스레드로부터 안전한 해시맵을 사용하는 것이 좋습니다.
Q13. Java에서 전체 HashMap을 반복하려는 경우. 우리가 그것을 할 수 있는 다른 방법은 무엇입니까?
앤. Java에서 해시맵을 반복할 수 있는 방법에는 여러 가지가 있습니다. 그 중 일부는 다음과 같습니다.
- 반복 변수와 결합된 기능 keySet을 사용할 수 있습니다.
- 반복 변수와 결합된 enterySet 함수를 사용할 수 있습니다.
- entrySet 함수를 사용하고 향상된 루프와 함께 사용할 수 있습니다.
- keySet을 사용하여 메소드를 얻을 수 있습니다.
또한 읽기: Python의 데이터 구조 및 알고리즘: 알아야 할 모든 것
다음은?
데이터 과학에 대해 자세히 알아보려면 작업 전문가를 위해 만들어졌으며 10개 이상의 사례 연구 및 프로젝트, 실용적인 실습 워크샵, 업계 전문가와의 멘토링, 1 - 업계 멘토와 일대일, 400시간 이상의 학습 및 최고의 기업과의 취업 지원.
Hashtable은 HashMap과 어떻게 다릅니까?
동기화되지 않은 데이터 구조는 HashMap입니다. 반면에 Hashtable은 스레드로부터 안전하며 동기화 코드 없이도 여러 스레드에서 공유할 수 있습니다. Hashtable은 하나의 null 키 또는 여러 null 값을 허용하지 않지만 HashMap은 허용합니다. 스레드가 아닌 응용 프로그램에서는 Hashtable 대신 HashMap을 사용해야 합니다. 간단히 말해서 HashMap은 단일 스레드 또는 동기화되지 않은 응용 프로그램에서 사용해야 합니다.
HashMap 또는 TreeMap을 사용하는 것이 더 빠릅니까?
TreeMap에서 값은 키에 의해 결정됩니다. null 키를 가질 수 없지만 여러 null 값을 가질 수 있습니다. 오름차순 대신 오름차순을 유지한다는 점을 제외하면 HashMap과 동일합니다(키의 자연 순서를 사용하여 정렬됨). HashMap은 배열 기반 데이터 구조를 사용하여 해시 테이블 기반 구현으로 해시 함수에 따라 구성 요소를 구성합니다. add(), delete() 및 포함과 같은 대부분의 작업에 대해 HashMap은 O(1)()의 일정 시간 성능을 예측합니다. 결과적으로 TreeMap보다 훨씬 빠릅니다.
ArrayList 대신 HashMap을 사용하는 것이 더 나은 경우는 언제입니까?
저장하려는 데이터에 고유 키를 사용할 수 있는 경우에만 HashMap이 의미가 있습니다. 키를 기반으로 물건을 찾을 때는 빠른 접근 시간이 필수이기 때문에 이를 이용해야 합니다. 컬렉션에서 항목의 동일한 순서를 유지하는 것이 중요할 때 HashMap을 피해야 합니다. 둘 다 서로 다르며 서로 다른 목적을 수행합니다. Java에 객체를 저장하려면 HashMap을 사용하여 키를 값에 매핑하고 그렇지 않으면 ArrayList를 사용합니다.