본문 바로가기
BackEnd/Java

[Java] 맵 Map

by summer_light 2021. 7. 19.

Map

Map은 Key와 value를 가진 집합이며, 중복을 허용하지 않는다.(키는 중복X, 값은 중복O)

{key=value, key=value...} 와 같은 형태로 저장

java.util 패키지에 여러 집합들을 사용하기 위한 interface와 class가 정의되어 있다.

 

선언은 다음과 같이 선언한다.

Map<자료형, 자료형> 객체명 = new HashMap<자료형, 자료형>();

좌변에는 Map, 우변에는 HashMap으로 선언하는 이유?



※ HashMap
HashMap은 Map Interface를 implements한 클래스로 중복을 허용하지 않는다.
Map이므로 Key-value의 한 쌍으로 구성된다.
Key 또는 value값으로 null을 허용한다.

 

※ HashTable
HashMap과 동일한 내부구조를 가지고 있다.
HashTable도 키로 사용할 수 있는 객체는 hashCode()와 equals()를 재정의 해서 동등 객체가 될 조건을 정해야 한다.

HashTable의 특징

HashTable은 동기화된 메소드로 구성되었기 때문에 멀티 스레드가 동시에 이 메소드를 실행할 수 없고, 
하나의 스레드가 실행을 완료해야 다른 스레드가 실행할 수 있다.

그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다.
이것을 스레드 안전(thread safe)이라고 한다.

 

 

 

01. 자주 사용하는 메소드 

1. map.put(a, b)

{a=b} 값 추가

중복된 key가 들어올 경우 덮어쓴다.

Map<String, String> map = new HashMap<String, String>();
map.put("1", "홍길동");
map.put("2", "김길동");
map.put("3", "김길동");
map.put("1", "홍길동2"); //중복된 key가 들어올 경우 덮어쓰기

System.out.println(map); //{1=홍길동2, 2=김길동, 3=김길동} //key 1이 중복되어 홍길동이 덮어씌워져 사라짐
System.out.println(map.size()); //3

 

2. map.get("key")

key에 해당하는 값(value) 반환

System.out.println(map.get("1"));//홍길동2


3. map.keySet()

map의 key들을 set으로 반환 

List<String> list = new ArrayList<String>(map.keySet());
System.out.println(list);//[1, 2, 3]

 

4. map.containsKey("a")

"a"라는 값을 key로 갖고 있는지 여부 T/F

Map<String, Integer> map = new HashMap<String, Integer>();
		
map.put("1", 10);
map.put("2", 20);
map.put("3", 30);
map.put("4", 40);
map.put("5", 50);
		
System.out.println(map); //{1=10, 2=20, 3=30, 4=40, 5=50}

System.out.println(map.containsKey("1"));//true
System.out.println(map.containsKey("10"));//false

 

5. map.containsValue("a") :

"a"라는 값을 value로 갖고 있는지 여부 T/F

System.out.println(map.containsValue(50));//true
System.out.println(map.containsValue(500));//false

 

 

6. map.values() : map의 value들만 가져오기 (반환형?)

List<Integer> list = new ArrayList<Integer>(map.values());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)); //List에 담았으므로 순서대로 출력
}

Set<Integer> set = new HashSet<Integer>(map.values());
for (Integer integer : set) {
System.out.println(integer); //Set에 담았으므로 순서 바뀌어 출력
}

 

EX01. key 값 출력하기

		//key 값 출력하기
		//1. map -> set -> list -> for
		for (int i = 0; i < map.size(); i++) {
			System.out.print(list.get(i) + " : ");
			System.out.println(map.get(list.get(i)));
		}
		
		//2. map -> set -> iterator
		//Iterator<String> it = map.keySet().iterator();
		Set<String> set = map.keySet();
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			//System.out.println(it.next());
			String key = it.next();
			System.out.print(key + " : ");
			System.out.println(map.get(key));
		}
		
		//3. map -> set -> foreach
		for (String str : map.keySet()) {
			System.out.print(str + " : ");
			System.out.println(map.get(str));
		}
		
		//4. Map.Entry : map 데이터를 key value 한쌍씩 뽑아내기 
		//map.entrySet() : 해당 map에 담겨있는 key value의 연결들(mapping)을 반환
		//.getKey(), .getValue() 를 이용하여 직접 값 추출
		for (Map.Entry<String, String> ele : map.entrySet()) {
			System.out.print(ele.getKey() + " : ");
			System.out.println(ele.getValue());
		}
		
		//5. map -> set -> Array -> for
		//배열로 변환 (set -> Array)
		Object[] keyArray = map.keySet().toArray();
		
		for (int i = 0; i < keyArray.length; i++) {
			String key = (String) keyArray[i];
			System.out.println(key + " = " + map.get(key));
		}

 

EX02. 로그인

key = id, value = password

public class Map03 {
	public static void main(String[] args) {
    
		//key = id, value = password
		Map<String, String> login = new HashMap<String, String>();
		login.put("poseidon", "01234567");
		login.put("temp", "temp0000");
		login.put("admin", "00000000");
		login.put("root", "rootroot");
		
		Scanner sc = new Scanner(System.in);
		System.out.println("아이디를 입력하세요.");
		String id = sc.next();
		
		System.out.println("비밀번호를 입력하세요.");
		String pw = sc.next();
		
		if(login.containsKey(id)) {
			if(login.get(id).equals(pw)) {
				System.out.println("정상 로그인입니다.");
			}else {
				System.out.println("비밀번호가 일치하지 않습니다.");
			}
		}else {
			System.out.println("해당 ID는 시스템에 없습니다.");
		}
		
	}
}

 

EX03. 게시판

map → list

package jun16;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Map04 {
	public static void main(String[] args) {
		
		ArrayList<Map<String, Object>> list = 
				new ArrayList<Map<String,Object>>();
		
		Map<String, Object> in = new HashMap<String, Object>();
		in.put("제목", "제목");
		in.put("내용", "blablablablablab.a....");
		in.put("글쓴이", "poseidon");
		in.put("읽음", 100);
		in.put("날짜", "2021-06-15");
		
		list.add(in);
		
		in = new HashMap<String, Object>();
		in.put("제목", "제목2");
		in.put("내용", "bla");
		in.put("글쓴이", "admin");
		in.put("읽음", 5);
		in.put("날짜", "2021-06-14");
		
		list.add(in);
		
		in = new HashMap<String, Object>();
		in.put("제목", "제목3");
		in.put("내용", "bla3");
		in.put("글쓴이", "root");
		in.put("읽음", 1);
		in.put("날짜", "2021-06-13");
		
		list.add(in);
		
		System.out.println(list);
		
		//출력
		System.out.println("번호 \t 제목 \t 글쓴이 \t 읽음 \t 날짜");
		System.out.println("----------------------------------");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(i + "\t");
			System.out.print(list.get(i).get("제목") + "\t");
			System.out.print(list.get(i).get("글쓴이") + "\t");
			System.out.print(list.get(i).get("읽음") + "\t");
			System.out.print(list.get(i).get("날짜") + "\n");
		}
		System.out.println("----------------------------------");

//		왜 오류 발생?
//		Iterator<Map<String, Object>> it = list.iterator();
//		while (it.hasNext()) {
//			System.out.println(it.next().get("제목"));
//			System.out.println(it.next().get("글쓴이"));
//			System.out.println(it.next().get("읽음"));
//			System.out.println(it.next().get("날짜"));
//		}	
		
	}
}

출력결과

[{내용=blablablablablab.a...., 제목=제목, 글쓴이=poseidon, 읽음=100, 날짜=2021-06-15}, {내용=bla, 제목=제목2, 글쓴이=admin, 읽음=5, 날짜=2021-06-14}, {내용=bla3, 제목=제목3, 글쓴이=root, 읽음=1, 날짜=2021-06-13}]
번호   제목   글쓴이   읽음   날짜
----------------------------------
0 제목 poseidon 100 2021-06-15
1 제목2 admin 5 2021-06-14
2 제목3 root 1 2021-06-13
----------------------------------

'BackEnd > Java' 카테고리의 다른 글

[Java] 2진트리 Binary Tree  (0) 2021.07.19
[Java] 스택(Stack), 큐(Queue)  (0) 2021.07.19
[Java] Hash set  (0) 2021.07.19
[Java] VirtualBox 설치  (0) 2021.07.19
[Java] Linked List  (0) 2021.07.18

댓글