JavaRush /Java Blog /Random-KO /Java의 HashMap - 어떤 종류의 맵인가요?

Java의 HashMap - 어떤 종류의 맵인가요?

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘은 또 다른 데이터 구조인 Map에 대해 이야기하겠습니다. 공식적인 러시아 이름은 "연관 배열"이지만 자주 사용되지는 않습니다. 더 일반적인 옵션은 "사전", "맵" 또는 (가장 자주) 영어 속어인 "맵"입니다. :) 맵 내부에서는 데이터가 "키" - "값" 형식, 즉 쌍으로 저장됩니다. 키와 값은 모두 숫자, 문자열, 다른 클래스의 객체 등 어떤 객체라도 될 수 있습니다.

Map이 다른 데이터 구조와 다른 점

이전에는 요소가 스스로 저장되는 데이터 구조를 살펴보았습니다. 배열 또는 ArrayList / LinkedList 에서는 특정 수의 요소를 저장합니다. 하지만 우리의 임무가 조금 바뀌면 어떨까요? 예를 들어, 100명의 이름과 여권 번호가 저장되는 목록을 생성하는 작업에 직면했다고 가정해 보겠습니다. 원칙적으로는 그렇게 어렵지 않습니다. 예를 들어, 두 가지를 모두 한 줄에 맞추고 "Anna Ivanovna Reshetnikova, 4211 717171" 과 같은 줄 목록을 만들 수 있습니다. 하지만 이 솔루션에는 두 가지 단점이 있습니다. 먼저 여권 검색 기능이 필요할 수 있습니다. 그리고 이러한 정보 저장 형식을 사용하면 문제가 발생할 수 있습니다. 둘째, 동일한 여권 번호를 가진 두 명의 다른 사람을 생성하는 것을 막을 수 있는 것은 없습니다. 그리고 이것이 우리 솔루션의 가장 심각한 단점입니다. 이러한 상황은 완전히 배제되어야 하며, 동일한 여권 번호를 가진 두 사람이 있을 수 없습니다. 여기서 Map과 선언된 기능이 도움이 됩니다("키"-"값" 형식으로 쌍으로 데이터 저장). 가장 일반적인 Map 구현인 Java HashMap 클래스를 살펴보겠습니다 .HashMap - 이것은 어떤 종류의 지도인가요?  - 1

Java에서 HashMap 생성 및 클래스 작업

이 구현은 생성이 매우 간단합니다.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
여기에서는 요소가 "숫자-문자열" 형식으로 저장될 사전을 만들었습니다. 숫자는 키가 되고 문자열은 값이 됩니다. 또한 어떤 유형의 키를 갖게 될지 ( Integer), 어떤 유형의 값을 갖게 될지 ( String) 표시했습니다. 왜 그럴까요? 첫째, HashMap의 키는 항상 고유합니다 . 여권 번호를 열쇠로 사용하고 중복을 피할 수 있기 때문에 이것은 우리에게 큰 도움이 될 것입니다. 그리고 전체 이름이 포함된 행은 값 역할을 합니다(다른 사람의 전체 이름은 쉽게 반복될 수 있으므로 우리에게는 아무런 문제가 없습니다).

HashMap에 새 쌍 추가

이 작업은 다음과 같습니다.
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
이를 위해 메소드가 사용됩니다 put(). 또한 HashMap에는 재정의된 메서드가 있으므로 toString()콘솔에 인쇄할 수 있습니다. 출력은 다음과 같습니다: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

HashMap 키의 특징

이제 키가 정말 고유한지 확인해 보겠습니다. 이미 맵에 키가 있는 새 요소를 추가해 보겠습니다 .
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
출력: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} 보시다시피 키가 162348인 이전 요소를 덮어썼습니다. "The Key"가 열쇠라고 불리는 데에는 이유가 있습니다. HashMap의 값은 키로 액세스됩니다 (그 반대는 아닙니다. 값이 중복될 수 있으므로 키를 값으로 얻을 수 없습니다). 이는 요소를 가져오는 예제와 HashMap에서 요소를 제거하는 예제에서 명확하게 볼 수 있습니다.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
값을 얻거나 사전에서 쌍을 삭제하려면 이 값에 해당하는 고유 키를 get()메소드 에 정확하게 전달해야 합니다. HashMap에는 배열이나 목록과 같은 숫자 인덱스가 없습니다. 값은 키로 액세스됩니다. 콘솔 출력: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

키와 값이 있는지 확인

ArrayListLinkedList 클래스 에서는 목록에 특정 요소가 포함되어 있는지 확인할 수 있습니다. 또한 HashMap을 사용하면 쌍의 두 부분 모두에 대해 이 작업을 수행할 수 있습니다. 여기에는 메서드 containsKey()(키 존재 여부 확인) 및 containsValue()(값 존재 여부 확인)이 있습니다.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
출력: 거짓 참

모든 키와 값 목록 가져오기

HashMap의 또 다른 편리한 기능은 모든 키와 모든 값의 목록을 별도로 얻을 수 있다는 것입니다 . 이를 위해 다음 keySet()과 같은 방법이 사용됩니다 values().
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set<Integer> keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
키는 컬렉션으로 추출됩니다 Set. 그 특징은 반복되는 요소를 포함할 수 없다는 것입니다. 이제 기억해야 할 가장 중요한 점은 모든 키 목록을 HashMap에서 별도의 컬렉션으로 가져올 수 있다는 것입니다. 예제에서는 값을 Normal 에 저장했습니다 ArrayList. 콘솔 출력: 키: [212133, 8082771, 162348] 값: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] 메서드는 우리가 살펴본 이전 구조와 정확히 동일한 작업을 size()수행합니다 clear(). 첫 번째 메서드는 숫자 요소를 반환합니다. 현재 순간의 사전에서 두 번째 것은 모든 요소를 ​​삭제합니다.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
출력: 3 {} HashMap에 요소가 하나 이상 있는지 확인하려면 다음 메서드를 사용할 수 있습니다 isEmpty().
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
출력: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} 이제 예비 검증 후에만 콘솔에 출력하겠습니다 :)

두 개의 지도를 하나로 합치기

또 다른 흥미로운 점은 두 개의 지도를 하나로 결합할 수 있다는 것입니다 . 이에 대한 방법이 있습니다 putAll(). 첫 번째 HashMap 에서 이를 호출하고 두 번째를 인수로 전달하면 두 번째 요소가 첫 번째 요소에 추가됩니다.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
출력: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348=Ivan Mikhailovich Serebryakov} PassportsAndNames2 의 모든 요소는 PassportsAndNames 에 복사되었습니다 . 이제 좀 더 복잡한 예를 살펴보겠습니다. 즉, 루프에서 HashMap을 반복합니다.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
인터페이스는 Map.Entry사전 내의 키-값 쌍을 의미합니다. 이 메소드는 entrySet()HashMap에 있는 모든 쌍의 목록을 반환합니다. (우리 맵은 이러한 항목 쌍으로만 구성되므로 개별 키나 값이 아닌 쌍에 대해 반복합니다.) 결론: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov 미래를 위해 이 기사를 저장하십시오: https://habr.com/ru/post/128017/ 이제 읽기에는 너무 이르지만 미래에는 , HashMap을 직접 사용하게 되면 이 데이터 구조가 내부에서 어떻게 작동하는지 이해하는 데 도움이 될 것입니다. 또한 HashMap의 공식 Oracle 문서를 확인하는 것을 잊지 마십시오 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION