해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.
Array는 빠르지만 유연하지 못하고, List는 유연하지만 느린 장단점이 존재합니다!
해당 인덱스로 간다음 그곳에서 또 다시 리스트형식으로 확장하면 Array와 List의 장점을 합칠수 있습니다!
hashing
: 적절히 겹치지 않도록 index에 지정합니다.
hash collision
: 값은 다르지만 해시 값이 동일하다는 의미입니다. Map에서는 리스트로 확장합니다.
Hashtable<,>
레퍼런스와 Map<,>
인터페이스로 Map객체를 가리킬 수 있습니다. 또한 Map을 상속받는 Hashtable<>()
, HashMap<>()
, ConcurrentHashMap<>()
로 자료구조를 만들 수 있습니다.
예를 들어
Hashtable<String, Integer> map = new Hashtable<>();
Map<String, Integer> map = new Hashtable<>();
Map<String, Integer> map = new HashMap<>();
Map<String, Integer> map = new ConcurrentHashMap<>();
와 같이 맵 객체를 만들 수 있습니다.
Map<String,Integer>
객체 map
이 있다고 가정하고 리스트를 나열 하겠습니다.
map.put("A",1);
: "A" Key에 1의 값을 넣습니다.
map.replace("A",1,11);
: "A"가 1이면 11로 변경합니다.
map.remove("B",3);
: "B"가 3이면 삭제합니다.
map.putIfAbsent("C",10);
: "C"가 존재하지 않는다면 value 10 삽입, 존재하면 안 넣음.
map.getOrDefault("C",-1)'
: "C"가 존재하면 반환, 존재하지 않는다면 디폴트값 -1 반환합니다.
map.keySets();
: key들만 뽑아냅니다.
map.values();
: value들만 뽑아냅니다.
class MyData{
int v;
public MyData(int v){
this.v = v;
}
public String toString(){
return "[" + v + "]";
}
@Override
public boolean equals(Object o) { //객체간 비교시 객체 주소가 아닌 값 비교
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyData myData = (MyData) o;
return v == myData.v;
}
@Override
public int hashCode() { //값 비교시 해쉬값 비교
return Objects.hash(v);
}
}
객체를 Map에 삽입하기 위해선 2가지 메서드를 오버라이딩 해야 합니다.
객체의 주소가 아닌 객체가 가진 값을 비교하기위해 equals()
메서드를 또 그 값을 가지고 해쉬값으로 만들기 위해 hashCode()
메서드를 오버라이딩 해야합니다.
HashMap
: not sync, 멀티 쓰레드x, 속도Hashtable
: sync, 쓰레드, 안정성ConcurrentHashMap
: sync + high concurrency