본문 바로가기
ALGORITHM/개념들

[JAVA] HashMap 해쉬 맵

by sjs_2215 2019. 3. 31.

HashMap

출처: <https://whatisthenext.tistory.com/81>


기본 지식

  • Hashing

: 해시함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법을 말한다.

  • HashMap vs TreeMap

HashMap: 저장은 느리지만 많은 양의 데이터를 검색하는데 뛰어난 성능을 보인다.

TreeMap: HashMap에 비해 저장이 빠르지만 데이터를 가져올 때 약간 느리다.

  • Map 인터페이스

: 키(key)와 값(value)을 하나의 세트로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용

키: 중복 가능

값: 중복 불가

아이디는 중복 불가능하나 1234를 비밀번호로 설정하는 것은 가능한 것처럼

또한, Key와 Value값에 null값을 허용하기 때문에 데이터가 빠져있어도 문제되지 않는다.

<메서드>
void clear() : Map의 모든 객체를 삭제

boolean containsKey(Object key) : 지정된 key 객체와 일치하는 Map의 key객체가 있는지 확인

boolean containsValue(Object value) : 지정된 value 객체와 일치하는 Map의 value객체가 있는지 확인

Set entrySet() : Map에 저장되어 있는 key-value쌍을 Map.Entry 타입의 객체로 저장한 "Set"으로 반환

boolean equals(Object o) : 동일한 Map인지 비교

Object get(Object key) : 지정한 key객체에 대응하는 value객체를 찾아서 반환

int hashCode() : 해시코드를 반환

boolean isEmpty() : Map이 비어있는지 확인

Set keySet() : Map에 저장된 모든 key객체를 반환한다.

Object put(Object key, Object Value) : Map에 value객체를 key객체에 연결(mapping)하여 저장

void putAll(Map t) : 지정된 Map의 모든 key-value쌍을 추가

Object remove(Object key) : 지정한 key객체와 일치하는 key-value 객체를 삭제

int size() : Map에 저장된 key-value쌍의 개수를 반환

Collection values() : Map에 저장된 모든 value 객체를 반환

 

  • Map.Entry 인터페이스

: Map 인터페이스의 __내부 인터페이스__

: Map에 저장되는 키(key)와 값(value)을 다루기 위한 인터페이스

-> Map 인터페이스를 구현하는 클래스는 Map.Entry 인터페이스도 함께 구현해야 한다.

<메서드>
boolean equals(Object o) : 동일한 Entry인지 비교

Object getKey() : Entry의 key객체를 반환

Object getValue() : Entry의 value객체를 반환

int hashCode() : Entry의 해시코드를 반환

Object setValue(Object value) : Entry의 value객체를 지정된 객체로 바꾼다.

HashMap

__HashMap은 Map을 구현했으므로 키(key)와 값(value)을 묶어서 하나의 데이터로 저장한다.__

  • HashMap을 사용한 기본 id/password 검사 예제 (while문을 통해서 true가 될 때까지 반복한다. 만약 id가 없으면 다시 입력을 요구)

import java.util.*;

public class Main {
	public static void main(String[] args){
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("castello", "1234");
		map.put("as", "1234");
		map.put("as", "1234");

		Scanner scan=new Scanner(System.in);
		
		while(true){
			System.out.println("id와 password를 입력");
			System.out.println("id: ");
			String id=scan.nextLine().trim();
			
			System.out.print("password: ");
			String password=scan.nextLine().trim();
			System.out.println();
			
			//System.out.println(map.size());
			
			if(!map.containsKey(id)){
				System.out.println("입력하신 id:"+id+"는 없다. "+"다시 입력");
				continue;
			}
			else{
				if(!(map.get(id)).equals(password)){
					System.out.println(id+"의 비밀번호 틀림. 다시 입력");
				} else{
					System.out.println(id+"와 비번"+password+"맞음. 로그인 성공");
					break;
				}
			}
		}
	}
}

Trim() 메소드 참고

프로그래밍을 하다보면 예상치못한 경로로 문자열에 공백이 들어오는경우가 종종 발생합니다. 이럴경우 공백이 어디서부터 들어왔는지 소스가 길어질수록 찾아보기엔 굉장히 귀찮죠. 이럴경우 그냥 공백이 들어온 스트링값을 그냥 제거해주는 방식으로 프로그래밍을 진행할 수도 있습니다. 이럴때 유용하게 사용하는 함수가 바로 Trim이라는 함수입니다.

출처: <https://coding-factory.tistory.com/129>

key값을 중복해서 저장할 경우,

에러나지 않고 그냥 해시맵에 1개만 저장함.

ex)

map.put("castello", "1234"); map.put("as", "1234"); map.put("as", "1234");

이렇게 데이터를 저장하고

System.out.println(map.size()); 를 해주면

2를 출력한다.

  • Map인터페이스와 이의 내부 인터페이스 Map.Entry를 사용한 예제 코드(왜 entrySet()와 같은 메서드로 iterator()를 호출해야하는지 생각하며 코드 보기)

package till;
import java.util.*;

public class Main {
	public static void main(String[] args){
		HashMap map = new HashMap();
		map.put("김", new Integer(140));
		map.put("홍", new Integer(130));
		map.put("박", new Integer(180));
		map.put("송", new Integer(190));
		map.put("이", new Integer(110));
		
		//Map인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 한 세트로 저장하기 때문에 iterator()를 '직접' 호출할수 없고
		//대신, keySet()이나 entrySet()과 같은 메서드를 통해 키와 값을 따로 Set의 형태로 얻어온 후에 다시 iterator()를 호룰해야 한다. 
		Set set=map.entrySet(); //Set entrySet() : Map에 저장되어 있는 key-value쌍을  Map.Entry 타입의 객체로 저장한 "Set"으로 반환
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			Map.Entry e = (Map.Entry)it.next();
			System.out.println("이름: "+e.getKey()+", 점수: "+e.getValue());
		}
		
		set=map.keySet(); //Set keySet() : Map에 저장된 모든 key객체를 반환한다.
		System.out.println("참가자 명단"+set);
		
		Collection<Integer> values=map.values(); //Collection values() : Map에 저장된 모든 value 객체를 반환
		it=values.iterator();
		
		int total=0;
		
		while(it.hasNext()){
			Integer i=(Integer)it.next();
			total+=i.intValue();
		}			
		System.out.println("점수 합: "+total);
		System.out.println("팀 평균: "+(float)total/set.size());
		System.out.println("최저 점수: "+Collections.max(values));
		System.out.print("최고 점수: "+Collections.min(values));
		
	}
}

+HashMap은 맵의 순서를 보장하지 않음.

'ALGORITHM > 개념들' 카테고리의 다른 글

[JAVA] 알고리즘을 최적화 해보자  (2) 2019.06.24
[Computational Thinking Skills] 프로그래밍과 논리/수학  (0) 2019.04.27
[JAVA] Stack 스택  (0) 2019.03.31
[JAVA] QUEUE 큐  (0) 2019.03.31
알고리즘 Pseudo-code 모음  (0) 2018.12.17

Comments