✅ 해시 함수의 정의
해시 함수는 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수를 말함
✅ 해시 함수 사용 예시
비밀번호 저장 용도
복제 문서인지 판별
검색용도
✅ HashMap
HashMap이란 Key-value의 pair를 관리하는 클래스이다. 데이터를 저장할 때는 키(Key) 값으로 해시함수를 실행한 결과를 통해 저장위치를 결정한다. HashMap은 특정 데이터의 저장 위치를 해시함수를 통해서 바로 알 수 있기 때문에 데이터의 추가, 삭제, 검색이 빠르다는 장점이 있다.
HashMap은 키(Key) 값을 통해서만 검색이 가능하며, HashMap의 키(Key) 값은 중복될 수 없고, Value값은 Key 값이 다르면 중복이 가능하다.
✔ HashMap 생성
HashMap<String, String> h1 = new HashMap<String, String>();
HashMap<Integer, String> h2 = new HashMap<>(); // new에서 타입 파라미터 생략 가능
✔ HashMap 메서드
1) 데이터 추가
V put(K key, V value) // key와 value를 저장
HashMap<Integer, String> hm = new HashMap<>();
hm.put(1, "one");
hm.put(2, "two");
2) 데이터 삭제
1. void clear() // 모든 데이터를 삭제
2. V remove(Object key) // key와 일치하는 기존 데이터 (key, value)를 삭제
3. boolean remove(Object key, Object value) // key와 value가 동시에 일치하는 데이터를 삭제
HashMap<Integer, String> hm = new HashMap<>();
hm.put(1, "one");
hm.put(2, "two");
hm.put(3, "three");
hm.remove(1); // key가 1인 값 삭제
hm.remove(2, "two"); // key가 2이고 value가 "two"인 값 삭제
hm.clear(); // 모든 데이터를 삭제
3) 데이터 수정
1. V replace(K key, V value) // key와 일치하는 기존 데이터의 value를 변경
2. V replace(K key, V oldValue, V newValue) : key와 oldValue가 동시에 일치하는 데이터의 value를 newValue로 변경
4) 데이터 확인
1. boolean containsKey(Object Key) : key와 일치하는 데이터가 있는지 여부를 반환(있으면 true)
2. boolean containsValue(Object value) : value가 일치하는 데이터가 있는지 여부를 반환 (있으면 true)
3. boolean isEmpty() : 데이터가 빈 상태인지 여부를 반환(빈 상태면 true)
4. int size() : key-value 맵핑 데이터의 개수를 반환
5) 데이터 반환
1. V get(Object key) : key와 맵핑된 value 값을 반환
2. V getOrDefalut(Object key, V defalutValue) : Key와 맵핑된 value 값을 반환하고 없으면 defaultValue 값을 반환
3. Set<Map.Entry<K, V>> entrySet( ) : 모든 key-value 맵핑 데이터를 가진 Set 데이터를 반환합니다.
4. Set<K> keySet( ) : 모든 key 값을 가진 Set 데이터를 반환합니다.
HashMap<Integer, String> hm = new HashMap<>(){{
put(1, "one");
put(2, "two");
put(3, "three");
}};
System.out.println(hm); // 전체 출력: {1=one, 2=two, 3=three}
System.out.println(hm.get(1)); // key 값 1의 value인 one이 출력
Map에 값을 전체 출력하기 위해서는 entrySet(), keySet() 메소드를 사용한다.
// entrySet() : key와 value 값이 모두 필요한 경우
for(Entry<Integer,String> entry : map.entrySet()){
System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
}
// 결과 예시
// key: 1 value: one
// keySet() : key를 출력하고 싶을 때
for(Integer i : map.keySet()){
System.out.println("key: "+i+" value: "+map.get(i));
}
// 결과 예시
// key: 1 value: one
Iterator를 사용하여 표현하는 방법도 있다.
HashMap<Integer, String> map = new HashMap<>(){{
put(1,"one");
put(2,"two");
put(3,"three");
}};
// entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<Integer, String> entry = entries.next();
System.out.println("key: "+entry.getKey()+" value: "+entry.getValue();
}
✅ HashSet
✔ HashSet의 변수 선언
// HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();
HashSet<Integer> hs1 = new HashSet<>(); // new 에서 타입 파라미터 생략 가능
HashSet<String> hs2 = new HashSet<>();
✔ HashSet의 값 추가
HashSet<Integer> hs1 = new HashSet<>();
hs1.add(1);
hs2.add(2);
HashSet<String> hs2 = new HashSet<>();
hs2.add("apple");
✔ HashSet의 값 삭제
HashSet<Integer> set = new HashSet<>();
// set.remove(value); // value 값 삭제
// set.clear(); // 전부 삭제
set.remove(1);
set.clear();
✔ HashSet의 크기 구하기
// 크기는 size() 메소드 이용
HashSet<Integer> hs1 = new HashSet<Integer>(Arrays.asList(1,2,3));
System.out.println("set의 크기: " + set.size());
✔ HashSet의 값 출력
1) 전체 출력
HashSet<Integer> hs = new HashSet<>(Arrays.asList(1,2,3));
System.out.println(hs); // 출력: [1,2,3]
2) 하나씩 출력
SET에는 인덱스로 객체를 가져오는 get(index) 메소드가 없음. 대신에 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)을 제공.
HashSet<Integer> hs = new HashSet<>(Arrays.asList(1,2,3));
Iterator iter = hs.iterator();
// 먼저 가져올 객체가 있는지 hasNext() 메소드로 확인
// hasNext()의 경우 가져올 객체가 있으면 true, 없으면 false 리턴
while(iter.hasNext()){
System.out.println(iter.next());
}
✔ HashSet의 값 검색
HashSet 내부에 원하는 값이 있는지 확인하고 싶다면 contains(value) 메소드를 사용. 결과는 HashSet이 가지고 있다면 true, 아니면 false를 반환.
HashSet<Integer> hs = new HashSet<>(Arrays.asList(1,2,3));
System.out.println(hs.contains(1)); // 결과 : true
** 출처2 : https://kadosholy.tistory.com/m/120