1. 키-값 쌍 세트.

키-값 쌍 세트

Java에서 또 다른 흥미로운 컬렉션(광범위하게 말하면)은 Map. 때로는 이 데이터 구조를 사전이라고도 합니다.

컬렉션 과 유사 Set하지만 요소 집합이 아닌 요소의 "쌍" 집합을 저장합니다. a의 각 쌍은 Map"키"와 "값"의 두 요소로 구성됩니다.

프로그램이 직원 이름과 급여 또는 동료 이름과 나이를 저장하기를 원한다고 가정해 보겠습니다. 그런 다음 다음과 같은 테이블이 필요합니다.

이름 나이
엘론 21
제프 22
청구서 48
남자 이름 ?

각 행에는 두 개의 값이 포함됩니다. 이름을 쌍의 키로 , 연령을 쌍의 으로 참조합니다 .

이 쌍의 전체 집합이 지도 ( Map)입니다.

쌍의 키는 를 제외한 모든 것이 될 수 있습니다 null. 키는 고유해야 합니다. 하나의 맵에 두 개의 동일한 키가 포함될 수 없습니다.


2. HashMap클래스

클래스 HashMap는 가장 인기 있는 컬렉션입니다 Map. 한편으로는 HashSet과 매우 유사하며 모든 메서드가 있습니다. 반면에 ArrayList단어(또는 다른 모든 것)를 인덱스로 사용할 수 있는 목록( )과 같습니다.

다음과 같은 using 문을 만들 수 있습니다 HashMap.

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

여기서 KeyType는 저장된 쌍의 키 유형이고 는 컬렉션 ValueType에 저장된 쌍의 값 유형입니다 HashMap.

클래스 HashMap에는 다음과 같은 메서드가 있습니다.

방법 설명
void put(KeyType key, ValueType value)
컬렉션에 ( key, ) 쌍을 추가합니다.value
ValueType get(KeyType key)
키와 관련된 값을 반환합니다.
boolean containsKey(KeyType key)
컬렉션에 키가 있는지 확인
boolean containsValue(ValueType value)
컬렉션에 값이 있는지 확인합니다.
ValueType remove(KeyType key)
컬렉션에서 요소를 제거합니다.
void clear()
컬렉션을 지우고 모든 요소를 ​​제거합니다.
int size()
컬렉션에 있는 키-값 쌍의 수를 반환합니다.
Set<KeyType> keySet()
컬렉션의 키 집합을 반환합니다.
Collection<ValueType> values()
컬렉션의 요소를 포함하는 집합을 반환합니다.
Set<Map.Entry<KeyType, ValueType>> entrySet()
컬렉션에 있는 Set모든 쌍( )의 집합( )을 반환합니다 .Map.Entry

에 요소 추가HashMap

메소드를 사용하여 요소가 쌍으로 맵에 추가됩니다 put(). 키는 첫 번째 인수로 전달되고 값은 두 번째로 전달됩니다.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

키-값 쌍을 추가할 때 키가 이미 컬렉션에 있으면 이전 값이 새 값으로 대체됩니다.

이 동작은 인덱스가 숫자가 아닌 HashMap단어( )인 배열이나 목록과 유사하게 만듭니다.String

중요한:

거의 모든 유형이 KeyType 또는 ValueType이 될 수 있습니다. KeyType에 대한 약간의 추가 요구 사항이 있으며 Java Collections 퀘스트에서 컬렉션을 자세히 연구할 때 이에 대해 배우게 됩니다.



3. a의 하위 집합 HashMap: 키 집합

HashMapa의 모든 항목을 화면에 표시하고 싶다고 가정해 보겠습니다 . 어떻게 해야 할까요? 이렇게 하려면 의 모든 항목을 살펴보는 방법을 알아야 합니다 HashMap. 이는 여러 가지 방법으로 수행할 수 있습니다.

가장 쉬운 방법은 키를 반복하는 것입니다.

HashMap항목은 순차적으로 번호가 매겨지지 않으므로 여기서는 카운터가 있는 루프가 작동하지 않습니다. 하지만 이 메서드를 사용하여 키 집합을 얻을 수 keySet()있으며 집합을 반복하는 방법을 이미 알고 있습니다.

암호 설명
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






map

키와 관련된 값 가져오기 의 키를 반복합니다.

keySet()메서드는 키 집합을 반환합니다. 이 세트는 두 가지 방법으로 사용할 수 있습니다.

콤팩트 표기 긴 표기법
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. 키-값 쌍에 대한 반복

더 복잡한 방법도 있습니다. a를 키-값 쌍 세트Map 로 변환 한 다음 이미 배운 대로 세트의 요소를 반복할 수 있습니다.

컬렉션 HashMap에는 키-값 쌍을 저장하는 도우미 클래스가 있습니다. 대략 다음과 같습니다.

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

entrySet()객체 에서 메서드를 호출한 결과는 다음과 같습니다 .HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

여기에는 유형 매개변수가 있는 제네릭 Set클래스가 있으며, 이 클래스는 Entry두 개의 유형 매개변수가 있는 제네릭 유형( )입니다.

초보자가 이것에 대해 혼란스러워하는 것은 매우 쉽습니다. 그러나 일단 이해하면 다음과 같은 코드를 작성할 수 있습니다.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

즉, 이 코드는 약간 단순화할 수 있습니다.

먼저 별도의 변수 생성을 건너뛰고 entries대신 루프 entrySet()내에서 직접 메서드를 호출할 수 있습니다 for.

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

둘째, 최근 도입된 연산자를 사용하여 키-값 쌍var 의 유형을 자동으로 유추 할 수 있습니다 .

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

나쁘지 않죠?



ArrayList5. 와 비교HashMap

A는 문자열(또는 다른 유형)을 인덱스(키)로 사용할 수 있도록 허용하는 것과 HashMap매우 유사합니다 .ArrayList

Integer의 키에 를 사용하면 HashMap와 더욱 유사해집니다 ArrayList. 비교해보자:

ArrayList<String>을 사용한 코드 HashMap<Integer, String>을 사용한 코드
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}