CodeGym/Java Blog/무작위의/HashMap: 이것은 어떤 종류의 지도입니까?
John Squirrels
레벨 41
San Francisco

HashMap: 이것은 어떤 종류의 지도입니까?

무작위의 그룹에 게시되었습니다
회원
안녕! 이 레슨에서는 Java HashMap 에 대해 자세히 살펴보겠습니다 . 이전에는 요소가 자체적으로 저장되는 데이터 구조를 연구했습니다. 배열 또는 ArrayList / LinkedList 에 몇 가지 요소를 저장합니다. 하지만 작업이 조금 변경되면 어떻게 될까요?
HashMap: 이것은 어떤 종류의 지도입니까?  - 1
다음 작업을 상상해 보십시오. 각 사람의 이름과 여권 번호를 저장하는 100명의 목록을 만듭니다. 원칙적으로 이것은 그렇게 어렵지 않습니다. 예를 들어 두 문자열을 모두 입력한 다음 "Amelia Aguilar, 4211 717171"이라는 문자열 목록을 만들 수 있습니다. 하지만 이 솔루션에는 두 가지 단점이 있습니다. 첫째, 여권 번호로 검색하는 기능이 필요할 수 있습니다. 그리고 이것은 이 정보 저장 형식을 고려할 때 문제가 될 것입니다. 둘째, 동일한 여권 번호를 가진 두 명의 다른 사람을 생성하는 것을 막는 것은 없습니다. 이것이 우리 솔루션의 가장 심각한 단점입니다. 이것은 절대 허용되어서는 안 됩니다. 두 사람이 동일한 여권 번호를 가질 수 없습니다. 새로운 데이터 구조가 도움이 됩니다: 지도. "연관 배열"이라고도 하지만 이 용어는 자주 사용되지 않습니다. 더 일반적으로 "사전" 또는 "지도"라고 합니다. :) 이전에 고려한 데이터 구조와 근본적으로 다른 점은 무엇입니까? 무엇보다 Map의 데이터가 키-값 쌍으로 저장된다는 사실에 있습니다. 숫자, 문자열 또는 다른 클래스의 개체 등 무엇이든 키와 값으로 사용할 수 있습니다. 오늘 우리는 Map 클래스 의 가장 일반적인 구현인 Java HashMap 을 공부할 것입니다 . HashMap: 이것은 어떤 종류의 지도입니까?  - 2

그렇다면 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, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
이를 위해 put() 메서드를 사용합니다 . 또한 HashMap은 toString() 메서드를 재정의하므로 콘솔에 표시할 수 있습니다. 결과는 다음과 같습니다. {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} 이제 키가 정말 고유한지 확인하겠습니다. 지도에서 이미 사용된 키를 사용하여 새 요소를 추가해 보겠습니다 .
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
출력: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} 보시다시피 키 162348 과 관련된 이전 값을 덮어썼습니다. 이유 때문에 "키"라는 용어를 사용합니다. HashMap 의 값은 키를 사용하여 액세스하지만 그 반대는 아닙니다. 값이 고유하지 않을 수 있으므로 값을 사용하여 키를 얻을 수 없습니다. 이는 HashMap 에서 요소를 가져오거나 제거할 때 명확하게 볼 수 있습니다 .
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

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

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
값을 가져오거나 사전에서 쌍을 제거하려면 값에 해당하는 고유 키를 get()remove() 에 전달해야 합니다. 배열 및 목록과 달리 Java의 HashMap 에는 숫자 인덱스가 없습니다. 키를 사용하여 값에 액세스합니다. 콘솔 출력: Bridget Logan {212133= Bridget Logan, 8082771=Donald John Trump} ArrayList 및 LinkedList 클래스를 사용하면 목록에 특정 요소가 포함되어 있는지 확인할 수 있습니다. Java HashMap을 사용하면 이 작업을 수행할 수 있습니다. 또한 쌍의 두 구성원 모두에 대해 이 작업을 수행할 수 있습니다. 이것은 containsKey () (키 확인) 및 containsValue()(값 확인) 메서드는 다음을 위한 것입니다.
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
출력: false true Java에서 HashMap 의 또 다른 편리한 기능은 모든 키와 모든 값의 개별 목록을 얻을 수 있다는 사실입니다. 이는 keySet()values() 메소드를 사용하여 수행됩니다 .
public class Main {

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

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

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

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
키는 아직 다루지 않은 Set 로 추출됩니다. 반복되는 요소를 포함할 수 없다는 점에서 특별합니다. 이제 중요한 것은 모든 키 목록을 HashMap에서 별도 의 컬렉션으로 검색할 수 있다는 점을 기억하는 것입니다. 예제에서는 값을 일반 ArrayList 에 저장했습니다 . 콘솔 출력: Keys: [212133, 8082771, 162348] Values: [Bridget Logan, Donald John Trump, Ivan the Great] size ()clear() 메서드는 우리가 논의한 이전 구조에서와 정확히 동일한 작업을 수행합니다. 첫 번째는 현재 사전에 있는 요소의 수를 반환하고 두 번째는 모든 요소를 ​​제거합니다.
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   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, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
출력: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} 이제 사전 확인 후에만 콘솔에 출력합니다. :) 또 다른 흥미로운 점은 두 개의 맵을 하나로 결합할 수 있다는 것입니다. 이것은 putAll() 메서드를 사용하여 수행됩니다. 첫 번째 HashMap 에서 호출하고 두 번째를 인수로 전달하면 두 번째의 요소가 첫 번째에 추가됩니다.
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
출력: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} passportsAndNames2의 모든 쌍이 passportsAndNames 에 복사되었습니다 . 이제 좀 더 복잡한 예를 살펴보겠습니다. 특히 루프에서 HashMap을 반복합니다.
for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry 클래스는 사전 내부의 키-값 쌍을 나타냅니다 . entrySet () 메서드는 HashMap 의 모든 쌍 목록을 반환합니다 . 맵은 이러한 Map.Entry 쌍으로 구성되어 있으므로 별도의 키나 값이 아니라 쌍을 통해 반복합니다. 출력: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan the Great 또한 HashMap 에 대한 공식 Oracle 문서를 공부하는 것을 잊지 마십시오 .
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다