맵 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 |
댓글