Map
key와 value로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조
HashMap
- Map 인터페이스를 상속하여 Map의 성질을 그대로 가지고 있음
- 많은 양의 데이터를 검색하는데 뛰어난 성능을 보임
- key, value를 넣은 순서와 상관없이 들어감
1. HashMap Initializing
1) Static HashMap 초기화 - Map이 가변적일 때
static으로 정의된 map이 변하기 쉬울 때 사용한다. 자유롭게 각 Key value를 추가하거나 삭제할 수 있다.
public static Map<String, String> mapFruit;
static {
mapFruit = new HashMap<>();
mapFruit.put("A", "apple");
mapFruit.put("B", "Banana");
}
Map<String, String> doubleBraceMap = new HashMap<String, String>() {{
put("key1", "value1");
put("key2", "value2");
}};
이런 식으로 초기화할 수도 있지만 사용할 때마다 추가 클래스를 생성하는 등 메모리 누수 문제를 일으킬 수 있으므로 지양해야한다.
2) Java Collections로 초기화 - Map이 변하지 않을 때
map이 변하지 않을 때 사용한다. 만약 더 추가하려고 하면, 'java.lang.UnsupportedOperationException' 이 발생한다.
public static Map<String, String> createSingletonMap() {
return Collections.singletonMap("username1", "password1");
}
Collection의 emptyMap을 사용하여 빈 Map을 만들 수 있다.
Map<String, String> emptyMap = Collections.emptyMap();
3) HashMap 선언 방법들
HashMap은 저장공간을 초과한 값이 들어오면 List처럼 저장공간을 늘리는데, 약 두 배로 늘리면서 과부하가 발생한다.
그러므로 초기에 Map의 용량을 지정해주는 것이 좋다.
HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
put("a","b");
}};
https://d2.naver.com/helloworld/831311
2. HashMap Initializing - JAVA9
1) Map.of()
빈 Map, key-value가 한 쌍인 Map, 최대 10개의 key-value를 가진 Map 모두 만들 수 있다.
Map<String, String> emptyMap = Map.of();
Map<String, String> singletonMap = Map.of("a", "apple");
Map<String, String> map = Map.of("a","apple", "b", "banana");
2) Map.ofEntries()
불가변적인 map에만 지원된다. 가변적인 map에 사용할 경우, UnsupportedOpertaionException을 낸다.
key는 유일해야하고 null값이 들어가면 안된다.
Map<String, String> map = Map.ofEntries(
new AbstractMap.SimpleEntry<String, String>("name", "John"),
new AbstractMap.SimpleEntry<String, String>("city", "budapest"),
new AbstractMap.SimpleEntry<String, String>("zip", "000000"),
new AbstractMap.SimpleEntry<String, String>("home", "1231231231")
);
3. 값 추가하기 put
HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");
map.put(1,"딸기"); //값 변경
4. 값 삭제하기 remove, clear
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거
5. 값 가져오기 get
# map 전체
map; //{1=사과, 2=바나나, 3=포도}
# key값으로 가져오기
map.get(1); //사과
# entrySet
key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 keySet()보다 entrySet()이 좋다.
for (Entry<Integer, String> entry : map.entrySet()) {
System.out.println("[key]:" + entry.getKey() + " [value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
# keySet
for(Integer i : map.keySet()){
System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
6. forEach (람다)
코드라인이 줄어들어 가독성이 좋지만, for문보다 속도가 느리고 병렬처리로 CPU의 점유율이 올라갈 수 있다는 단점이 있다.
map.forEach((key, value) -> System.out.println(key + "=>" + map.get(key)));
// 1=>사과
// 2=>바나나
// 3=>포도
https://needjarvis.tistory.com/636
7. 특정 key가 존재하는지 확인 containsKey
key가 있으면 true, 없으면 false를 return한다.
map.containsKey("a") // fasle
map.containsKey(3) //true
8. 특정 value가 존재하는지 확인 containsValue
value가 있으면 true, 없으면 false를 return한다.
map.containsValue("체리") // false
map.containsValue("바나나")// true
9. key의 개수 구하기
map.size();
List<HashMap>
HashMap 배열 형태
1. 선언하기
List<HashMap<String,Object>> = new ArrayList<HashMap<String,Object>>();
LinkedHashMap
HashMap과 달리 key, value를 넣은 순서대로 들어감
TreeMap
들어간 key를 기준으로 이진트리구조를 사용하여 자동정렬
'Java' 카테고리의 다른 글
[Java] LocalDate 비교 (0) | 2023.08.10 |
---|---|
[JAVA] HashMap, LinkedHashMap - value로 key찾기 (0) | 2023.08.09 |
[JAVA] Set과 Map의 차이 (0) | 2023.07.27 |
[JAVA] 자바 TreeMap 사용하기 (0) | 2023.02.16 |
[JAVA] 변수형 타입 변환하기 (0) | 2022.12.06 |