what is hashmap java
이 Java HashMap Tutorial은 Java에서 HashMap이란 무엇이며 어떻게 사용하는지 설명합니다. 여기에는 HashMap 선언, 초기화, 반복, 구현 및 인쇄 방법이 포함됩니다.
Java의 HashMap은 Map을 기반으로하는 모음이며 키-값 쌍으로 구성됩니다. HashMap은 또는로 표시됩니다. HashMap 요소는 키를 사용하여 액세스 할 수 있습니다. 즉, HashMap 요소에 액세스하려면 키를 알아야합니다.
HashMap은“Hashing”이라는 기술을 사용합니다. 해싱에서 긴 문자열은 일부 알고리즘 또는 '해시 함수'를 적용하여 짧은 문자열로 변환됩니다. 문자열은 더 빠른 검색에 도움이되므로 더 짧은 문자열로 변환됩니다. 또한 효율적인 인덱싱에도 사용됩니다.
=> 독점적 인 Java 교육 자습서 시리즈를 보려면 여기를 방문하십시오.
학습 내용 :
자바의 HashMap
HashMap은 HashMap이 동기화되지 않고 키와 값에 대해 null 값을 허용한다는 차이점을 제외하고 HashTable과 유사합니다.
HashMap의 중요한 특성 중 일부는 다음과 같습니다.
- HashMap은 java.util 패키지의 일부인 'Hashmap'클래스에서 Java로 구현됩니다.
- HashMap 클래스는 Map 인터페이스를 부분적으로 구현하는 'AbstractMap'클래스에서 상속됩니다.
- HashMap은 또한 '복제 가능'및 '직렬화 가능'인터페이스를 구현합니다.
- HashMap은 중복 값을 허용하지만 중복 키는 허용하지 않습니다. HashMap은 또한 여러 널값을 허용하지만 널 키는 하나만 될 수 있습니다.
- HashMap은 동기화되지 않으며 요소의 순서도 보장하지 않습니다.
- Java HashMap 클래스의 초기 용량은 16이고 기본 (초기)로드 계수는 0.75입니다.
Java에서 HashMap을 선언하는 방법?
Java의 HashMap은 java.util 패키지의 일부입니다. 따라서 코드에서 HashMap을 사용해야하는 경우 먼저 다음 명령문 중 하나를 사용하여 구현 클래스를 가져와야합니다.
import java.util.*;
또는
import java.util.HashMap;
HashMap 클래스의 일반적인 선언은 다음과 같습니다.
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
여기서 K => 맵에있는 키 유형
V => 맵의 키에 매핑 된 값 유형
HashMap 만들기
Java의 HashMap은 다음과 같이 만들 수 있습니다.
import java.util.HashMap; HashMap cities_map = new HashMap ();
위의 문은 먼저 Java의 HashMap 클래스를 포함합니다. 그런 다음 다음 문에서 키 유형이 정수이고 값이 문자열 인 'cities_map'이라는 HashMap을 만듭니다.
HashMap이 생성되면 값으로 초기화해야합니다.
해시 맵을 초기화하는 방법?
지도에 값을 넣어 put 메소드를 사용하여 HashMap을 초기화 할 수 있습니다.
아래 프로그램은 Java에서 HashMap의 초기화를 보여줍니다.
import java.util.*; class Main{ public static void main(String args()){ //create a HashMap and print HashMap colorsMap=new HashMap(); System.out.println('Initial Map: '+colorsMap); //put some initial values into it using put method colorsMap.put(100,'Red'); colorsMap.put(101,'Green'); colorsMap.put(102,'Blue'); //print the HashMap System.out.println('After adding elements:'); for(Map.Entry m:colorsMap.entrySet()){ System.out.println(m.getKey()+' '+m.getValue()); } } }
산출:
초기지도 : {}
요소를 추가 한 후 :
100 네트워크
101 그린
102 블루
HashMap은 내부적으로 어떻게 작동합니까?
HashMap은 키-값 쌍의 모음이며 'Hashing'이라는 기술을 사용합니다. 내부적으로 HashMap은 노드의 배열입니다. HashMap은 키-값 쌍을 저장하기 위해 배열과 LinkedList를 사용합니다.
다음은 프로그래밍 방식으로 클래스로 표현되는 HashMap 노드의 구조입니다.
위의 노드 표현에서 볼 수 있듯이 노드는 링크드리스트 노드와 유사한 구조를 가지고 있습니다. 이러한 노드의 배열을 버킷이라고합니다. 각 버킷의 용량이 같지 않을 수 있으며 두 개 이상의 노드도 가질 수 있습니다.
HashMap의 성능은 다음 두 가지 매개 변수의 영향을받습니다.
(i) 초기 용량 : 용량은 HashMap의 버킷 수로 정의됩니다. 초기 용량은 생성 될 때 HashMap 개체의 용량으로 정의됩니다. HashMap의 용량은 항상 2 배가됩니다.
(ii) LoadFactor : LoadFactor는 다시 해싱 할 때 측정하는 매개 변수로 용량 증가가 수행됩니다.
용량이 높으면 재해 싱이 필요하지 않으므로 부하율이 작아집니다. 마찬가지로 용량이 낮 으면 자주 재해시해야하므로 부하 계수가 높아집니다. 따라서 효율적인 hashMap을 설계하기 위해이 두 가지 요소를 신중하게 선택해야합니다.
HashMap을 반복하는 방법?
키-값 쌍을 조작하거나 인쇄하려면 HashMap을 순회해야합니다.
HashMap을 통해 순회하거나 반복 할 수있는 두 가지 방법이 있습니다.
- for 루프 사용
- while 루프와 반복자를 사용합니다.
아래의 Java 프로그램은이 두 메소드의 구현을 보여줍니다.
먼저 entrySet 메서드를 사용하여 HashMap에서 항목 집합을 검색 한 다음 for 루프를 사용하여 집합을 탐색합니다. 그런 다음 각각 getKey () 및 getValue () 메서드를 사용하여 키-값 쌍을 인쇄합니다.
while 루프를 사용하여 HashMap을 탐색하려면 먼저 HashMap에 대한 반복기를 설정 한 다음 반복기를 사용하여 키-값 쌍에 액세스합니다.
import java.util.*; public class Main{ public static void main(String () args) { //create a HashMap and initialize it HashMap cities_map = new HashMap(); cities_map.put(10, 'MUM'); cities_map.put(1, 'DL'); cities_map.put(20, 'PUN'); cities_map.put(7, 'GOA'); cities_map.put(3, 'HYD'); //print using for loop System.out.println('HashMap using for Loop:'); System.out.println(' KEY VALUE'); for (Map.Entry mapSet : cities_map.entrySet()) { System.out.println(' '+mapSet.getKey() + ' ' + mapSet.getValue()); } //print using while loop with iterator System.out.println('HashMap using while Loop:'); System.out.println(' KEY VALUE'); Iterator iterator = cities_map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry mapSet2 = (Map.Entry) iterator.next(); System.out.println(' '+mapSet2.getKey() + ' ' + mapSet2.getValue()); } } }
산출:
for 루프를 사용하는 HashMap :
핵심 가치
1 DL
3 장
20 펀
7 GOA
10 MUM
while 루프를 사용하는 HashMap :
핵심 가치
1 DL
3 장
20 펀
7 GOA
10 MUM
qa 인터뷰 질문과 경험이 풍부한 답변
해시 맵 인쇄
아래 프로그램에 표시된 foreach 루프를 사용하여 hashMap을 인쇄하는 또 다른 예를 살펴 보겠습니다.
import java.util.HashMap; public class Main { public static void main(String() args) { // create a HashMap and initialize HashMap colors = new HashMap(); colors.put('Red', 1); colors.put('Orange', 5); colors.put('Magenta', 8); //print the HashMap System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); for (String i : colors.keySet()) { System.out.println(' ' + i + ' ' + colors.get(i)); } } }
산출:
HashMap 콘텐츠 :
핵심 가치
네트워크 1
마젠타 8
오렌지 5
자바의 HashMap 생성자 / 메소드
아래 표는 Java의 HashMap 클래스에서 제공하는 생성자와 메소드를 보여줍니다.
생성자
생성자 프로토 타입 | 기술 | |
---|---|---|
putAll | void putAll (지도 맵) | HashMap에 지정된 '맵'요소를 삽입합니다. |
HashMap () | 기본 생성자. | |
HashMap (맵 m) | 지정된 맵 객체 m에서 새 HashMap을 만듭니다. | |
HashMap (int 용량) | 인수 'capacity'에 지정된 초기 용량으로 새 HashMap을 생성합니다. | |
HashMap (int 용량, float loadFactor) | 생성자가 제공하는 capacity 및 loadFactor 값을 사용하여 새 HashMap을 만듭니다. |
행동 양식
방법 | 방법 프로토 타입 | 기술 |
---|---|---|
맑은 | 무효 클리어 () | HashMap의 모든 매핑을 지 웁니다. |
비었다 | 부울 isEmpty () | HashMap이 비어 있는지 확인합니다. 그렇다면 true를 반환합니다. |
복제하다 | 개체 복제 () | HashMap에서 키 및 값 매핑을 복제하지 않고 단순 복사본을 반환합니다. |
entrySet | set entrySet () | HashMap의 매핑을 컬렉션으로 반환합니다. |
키셋 | keySet 설정 () | HashMap의 키 세트를 리턴합니다. |
놓다 | V put (개체 키, 개체 값) | HashMap에 키-값 항목을 삽입합니다. |
putIfAbsent | V putIfAbsent (K 키, V 값) | 주어진 키-값 쌍이 아직없는 경우 HashMap에 삽입합니다. |
없애다 | V 제거 (객체 키) | 주어진 키에 대해 HashMap에서 항목을 삭제하십시오. |
없애다 | 부울 제거 (개체 키, 개체 값) | HashMap에서 주어진 키-값 쌍을 삭제합니다. |
계산하다 | V 컴퓨팅 (K 키, BiFunction 재 매핑 기능) | 주어진 키와 현재 값 또는 null 값에 대해 '재 매핑 함수'를 사용하여 매핑을 계산합니다. |
방법 | 방법 프로토 타입 | 기술 |
computeIfAbsent | V computeIfAbsent (K 키, 함수 매핑 기능) | 'mappingFunction'을 사용하여 매핑을 계산하고 아직 존재하지 않거나 null 인 경우 키-값 쌍을 삽입합니다. |
computeIfPresent | V computeIfPresent (K 키, BiFunction remappingFunction) | 키가 이미 있고 null이 아닌 경우 키가 지정된 'remappingFunction'을 사용하여 새 매핑을 계산합니다. |
containsValue | 부울 containsValue (객체 값) | 주어진 값이 HashMap에 존재하는지 확인하고 만약 그렇다면 true를 반환합니다. |
containsKey | 부울 containsKey (객체 키) | 주어진 키가 HashMap에 있는지 확인하고 만약 그렇다면 true를 반환합니다. |
같음 | 부울 같음 (Object o) | 주어진 객체를 HashMap과 비교합니다. |
각각 | void forEach (BiConsumer 작업) | HashMap의 각 항목에 대해 주어진 '작업'을 실행합니다. |
가져 오기 | V get (객체 키) | 연관된 값과 함께 주어진 키를 포함하는 객체를 반환합니다. |
getOrDefault | V getOrDefault (객체 키, V defaultValue) | 주어진 키가 매핑되는 값을 반환합니다. 매핑되지 않은 경우 기본값을 반환합니다. |
비었다 | 부울 isEmpty () | HashMap이 비어 있는지 확인합니다. |
가다 | V 병합 (K 키, V 값, BiFunction 재 매핑 기능) | 주어진 키가 null인지 또는 value와 관련이 없는지 확인한 다음 remappingFunction을 사용하여 null이 아닌 값과 연결합니다. |
바꾸다 | V 교체 (K 키, V 값) | 지정된 키에 대해 지정된 값을 바꿉니다. |
바꾸다 | 부울 바꾸기 (K 키, V oldValue, V newValue) | 주어진 키의 이전 값을 새 값으로 대체합니다. |
전부 교체 | void replaceAll (BiFunction 함수) | 주어진 함수를 실행하고 HashMap의 모든 값을 함수 결과로 바꿉니다. |
가치 | 컬렉션 값 () | HashMap에있는 값 컬렉션을 반환합니다. |
크기 | int 크기 () | HashMap에있는 항목 수의 크기를 리턴합니다. |
해시 맵 구현
다음으로 이러한 기능의 대부분을 Java 프로그램에서 구현하여 작동을 더 잘 이해합니다.
다음 Java 프로그램은 Java에서 HashMap의 구현을 보여줍니다. 위에서 논의한 대부분의 방법을 사용했습니다.
import java.util.*; public class Main { public static void main(String args()) { HashMap hash_map = new HashMap(); hash_map.put(12, 'Leo'); hash_map.put(2, 'Seville'); hash_map.put(7, 'Lacy'); hash_map.put(49, 'Lily'); hash_map.put(3, 'Dillon'); System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); //display HashMap contents Set setIter = hash_map.entrySet(); Iterator map_iterator = setIter.iterator(); while(map_iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)map_iterator.next(); System.out.println(' '+ map_entry.getKey() + ' ' + map_entry.getValue()); } //get value for the given key String var= hash_map.get(2); System.out.println('Value at index 2 is: '+var); //delete value given the key hash_map.remove(3); System.out.println('Hashmap after removal:'); System.out.println(' KEY VALUE'); Set iter_set = hash_map.entrySet(); Iterator iterator = iter_set.iterator(); while(iterator.hasNext()) { Map.Entry mentry = (Map.Entry)iterator.next(); System.out.println(' '+mentry.getKey() + ' ' + mentry.getValue() ); } } }
산출:
HashMap 콘텐츠 :
핵심 가치
49 릴리
2 세비야
3 딜론
7 레이스
12 레오
인덱스 2의 값 : 세비야
제거 후 해시 맵 :
핵심 가치
49 릴리
2 세비야
7 레이스
12 레오
Java에서 HashMap 정렬
Java에서 HashMap은 순서를 유지하지 않습니다. 따라서 HashMap의 요소를 정렬해야합니다. 키 또는 값을 기반으로 HashMap의 요소를 정렬 할 수 있습니다. 이 섹션에서는 두 가지 정렬 방식에 대해 설명합니다.
키로 HashMap 정렬
import java.util.*; public class Main { public static void main(String() args) { //create and initialize a HashMap HashMap colors_map = new HashMap(); colors_map.put(9, 'Magenta'); colors_map.put(11, 'Yellow'); colors_map.put(7, 'Cyan'); colors_map.put(23, 'Brown'); colors_map.put(5, 'Blue'); colors_map.put(3, 'Green'); colors_map.put(1, 'Red'); //print the unsorted HashMap by getting a set and using iterator System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry me = (Map.Entry)iterator.next(); System.out.print(me.getKey() + ': '); System.out.println(me.getValue()); } //create a treemap from given HashMap so that the keys are sorted Map map = new TreeMap(colors_map); System.out.println('HashMap Sorted on keys:'); //print the sorted HashMap Set set2 = map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry me2 = (Map.Entry)iterator2.next(); System.out.print(me2.getKey() + ': '); System.out.println(me2.getValue()); } } }
산출:
정렬되지 않은 HashMap :
1 : 네트워크
3 : 녹색
5 : 블루
7 : 청록색
23 : 브라운
9 : 마젠타
11 : 노란색
HashMap 정렬 된 키 :
1 : 네트워크
3 : 녹색
5 : 블루
7 : 청록색
9 : 마젠타
11 : 노란색
23 : 브라운
위의 프로그램에서 해시 맵이 정의되고 값으로 채워지면이 해시 맵에서 트리 맵을 생성하는 것을 볼 수 있습니다. 해시 맵이 트리 맵으로 변환되면 해당 키가 자동으로 정렬됩니다. 따라서이 트리 맵을 표시 할 때 키에 정렬 된 맵을 얻습니다.
값으로 HashMap 정렬
값에 따라 HashMap을 정렬하려면 먼저 해시 맵을 LinkedList로 변환합니다. 그런 다음 비교기와 함께 Collections.sort 메서드를 사용하여 목록을 정렬합니다. 이 목록은 다시 HashMap으로 변환됩니다. 그런 다음 정렬 된 HashMap이 인쇄됩니다.
import java.util.*; public class Main { public static void main(String() args) { //Create and initialize the HashMap HashMap colors_map = new HashMap(); colors_map.put(5, 'B'); colors_map.put(11, 'O'); colors_map.put(3, 'I'); colors_map.put(13, 'R'); colors_map.put(7, 'G'); colors_map.put(1, 'V'); colors_map.put(9, 'Y'); //print the HashMap using iterator after converting to set System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)iterator.next(); System.out.print(map_entry.getKey() + ': '); System.out.println(map_entry.getValue()); } //call sortByValues method that returns a sorted Map. Map c_map = sortByValues(colors_map); System.out.println('HashMap sorted on values:'); //print the sorted HashMap Set set2 = c_map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry map_entry2 = (Map.Entry)iterator2.next(); System.out.print(map_entry2.getKey() + ': '); System.out.println(map_entry2.getValue()); } } private static HashMap sortByValues(HashMap hash_map) { //create a LinkedList from HashMap List list = new LinkedList(hash_map.entrySet()); // use Collections.sort method with Comparator to sort the list Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return ((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } }); //create a HashMap from linkedlist which preserves the order HashMap sortedHashMap = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedHashMap.put(entry.getKey(), entry.getValue()); } return sortedHashMap; } }
산출:
정렬되지 않은 HashMap :
1 : V
3 : 나
5 : B
7 : G
9 : 그리고
11 : O
13 : R
값에 따라 정렬 된 HashMap :
5 : B
7 : G
3 : 나
11 : O
13 : R
1 : V
9 : 그리고
자바의 동시 HashMap
일반적인 HashMap에서는 런타임이나 반복이 수행되는 동안 요소를 수정할 수 없습니다.
동시지도 구현은 다음과 같습니다.
import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class Main { public static void main(String() args) { //declare and initialize ConcurrentHashMap Map cCMap = new ConcurrentHashMap(); cCMap.put('1', '10'); cCMap.put('2', '10'); cCMap.put('3', '10'); cCMap.put('4', '10'); cCMap.put('5', '10'); cCMap.put('6', '10'); //print the initial ConcurrentHashMap System.out.println('Initial ConcurrentHashMap: '+cCMap); //define the iterator over the keys of ConcurrentHashMap Iterator it = cCMap.keySet().iterator(); //change one of the keys using iterator while(it.hasNext()){ String key = it.next(); if(key.equals('3')) cCMap.put(key+'c_map', 'c_map'); } //print the changed ConcurrentHashMap System.out.println('
ConcurrentHashMap after iterator: '+cCMap); } }
산출:
초기 ConcurrentHashMap : {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
반복자 이후 ConcurrentHashMap : {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
HashMap으로 동일한 작업을 수행했다면 ConcurrentModificationException이 발생했을 것입니다.
자바 맵 대 HashMap
Java에서 Map과 HashMap의 차이점을 표로 정리해 보겠습니다.
지도 | HashMap |
---|---|
추상적 인 인터페이스입니다. | Map 인터페이스의 구현입니다. |
해당 기능을 사용하려면 다른 클래스에서 인터페이스를 구현해야합니다. | 기능을 얻기 위해 구체적인 클래스와 클래스 개체를 만들 수 있습니다. |
TreeMap과 같은 맵 인터페이스 구현은 null 값을 허용하지 않습니다. | null 값 및 키를 허용합니다. |
TreeMap은 중복 값을 허용하지 않습니다. | 중복 값을 가질 수 있습니다. |
객체의 자연스러운 순서가 유지됩니다. | HashMap에서는 입력 순서가 유지되지 않습니다. |
자주 묻는 질문
Q # 1) Java에서 HashMap이 사용되는 이유는 무엇입니까?
대답: 키-값 쌍의 모음 인 HashMap은 키만으로 데이터를 검색하는 데 도움이됩니다. 또한 해싱 기술을 사용하므로 효율적인 데이터 조회를 제공합니다.
질문 # 2)해시 맵은 어떻게 생성합니까?
대답: HashMap은 java.util 패키지의 'HashMap'클래스를 인스턴스화하여 만들 수 있습니다. 정수 유형의 키와 문자열 유형의 값이있는 hashMap은 다음과 같이 만들 수 있습니다.
HashMap myMap= new HashMap();
질문 # 3)HashMap은 Java로 주문됩니까?
대답: 아니요, HashMap은 Java로 정렬되지 않습니다. 이러한 목적으로 Java에서는 사용되지 않지만 키-값 쌍에 요소를 저장하는 데 사용됩니다.
질문 # 4)HashMap은 스레드로부터 안전합니까?
대답: 아니요, hashMap은 Java에서 스레드로부터 안전하지 않습니다.
질문 # 5)더 빠른 HashMap 또는 ConcurrentHashMap은 무엇입니까?
대답: HashMap은 ConcurrentHashMap보다 빠릅니다. 그 이유는 HashMap은 일반적으로 하나의 스레드에서만 작동하므로 성능이 좋습니다. 그러나 이름에서 알 수 있듯이 동시 HashMap은 동시이며 여러 스레드에서 동시에 작동 할 수 있습니다.
결론
이 튜토리얼에서는 ConcurrentHashMap이라는 HashMap의 또 다른 변형과 함께 HashMap의 작동을 이해했습니다. 우리는 HashMap의 생성자, 메소드 및 예제를 보았습니다. 또한 ConcurrentHashMap에 대한 예제와 함께 논의했습니다.
다가오는 튜토리얼에서 Java 컬렉션에 대해 자세히 알아볼 것입니다.
=> 여기에서 Java 교육 자습서의 A-Z를 보려면 여기를 확인하십시오.