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
에는 다음과 같은 메서드가 있습니다.
방법 | 설명 |
---|---|
|
컬렉션에 ( key , ) 쌍을 추가합니다.value |
|
키와 관련된 값을 반환합니다. |
|
컬렉션에 키가 있는지 확인 |
|
컬렉션에 값이 있는지 확인합니다. |
|
컬렉션에서 요소를 제거합니다. |
|
컬렉션을 지우고 모든 요소를 제거합니다. |
|
컬렉션에 있는 키-값 쌍의 수를 반환합니다. |
|
컬렉션의 키 집합을 반환합니다. |
|
컬렉션의 요소를 포함하는 집합을 반환합니다. |
|
컬렉션에 있는 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
: 키 집합
HashMap
a의 모든 항목을 화면에 표시하고 싶다고 가정해 보겠습니다 . 어떻게 해야 할까요? 이렇게 하려면 의 모든 항목을 살펴보는 방법을 알아야 합니다 HashMap
. 이는 여러 가지 방법으로 수행할 수 있습니다.
가장 쉬운 방법은 키를 반복하는 것입니다.
HashMap
항목은 순차적으로 번호가 매겨지지 않으므로 여기서는 카운터가 있는 루프가 작동하지 않습니다. 하지만 이 메서드를 사용하여 키 집합을 얻을 수 keySet()
있으며 집합을 반복하는 방법을 이미 알고 있습니다.
암호 | 설명 |
---|---|
|
map 키와 관련된 값 가져오기 의 키를 반복합니다. |
이 keySet()
메서드는 키 집합을 반환합니다. 이 세트는 두 가지 방법으로 사용할 수 있습니다.
콤팩트 표기 | 긴 표기법 |
---|---|
|
|
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);
}
나쁘지 않죠?
ArrayList
5. 와 비교HashMap
A는 문자열(또는 다른 유형)을 인덱스(키)로 사용할 수 있도록 허용하는 것과 HashMap
매우 유사합니다 .ArrayList
Integer
의 키에 를 사용하면 HashMap
와 더욱 유사해집니다 ArrayList
. 비교해보자:
ArrayList<String>을 사용한 코드 | HashMap<Integer, String>을 사용한 코드 |
---|---|
|
|