[Collection Framework] Map<K,V>, Hashing

포키·2022년 11월 29일
0

국비과정

목록 보기
35/73

로또 궁금한 점
1. Integer[]로 밀고 나간 것
2. Scanenr scan 멤버변수로 두기 - 어차피 Scanner 클래스의 메서드는 객체 생성해서 만들어야 하니까, 계속 쓸 거라면 멤버변수 만들어두고 (아니면 아예 생성까지 해서) 계속 쓸 수 있음
3. Arrays.copyOfRange() : 배열과 범위를 지정하고 복사해옴
4.

		List<Integer> goalList = new Vector<Integer>(
			Arrays.asList(excBonus)	
		);
  • 상위 타입으로 두는 편이 사용이 더 자유롭고
  • 많이 그렇게 사용함
  • 메서드를 쓰더라도, 이게 Vector가 아니라 List의 메서드임을 알 수 있다.


  • Collection에서 equals는 필수
    Collection에 새로 만든 클래스를 원소로 사용할 때는 반드시 equals를 오버라이딩해야 한다.
    (ex) remove(Object o), ~~)
  • Hash-가 붙는 클래스에서 hashCode는 필수
    Hash-가 붙는 클래스를 사용할 때는 반드시 hashCode()를 오버라이딩해야 한다.

interface Map<K,V>

  • 지도의 목적 : 위치 찾기
  • 위치 찾기 위해서 필요한 것은 '지명(이름)'
  • array나 List(index 사용)에서는 꺼내기 전까지 원소의 정체를 알 수 없다.
    (index = 단순 숫자이기 때문)
  • 반대로 의미를 부여한 식별자를 사용하는 것이 Map
  • Map은 키와 값을 쌍으로 저장한다.
  • 내가 찾는 값을 직관적으로 알 수 있음 / 더 많은 공간 차지
  • Map의 핵심은 key(식별자)
  • Map은 값 비교에 기본적으로 hash방식을 사용한다.
    따라서 임의의 클래스를 만들어 사용할 때, equals()뿐 아니라 hashCode() 또한 오버라이딩해야 한다.
import java.util.*;
class MapEx1 {
	public static void main(String[] args) {
		Hashtable<String, String> table = new Hashtable<String, String>();

		table.put("아이유", "010-1234-5678");
		table.put("윤아", "010-9876-5432");
		table.put("김유정", "010-1357-9246");
		table.put("김혜수", "010-2468-1357");

		System.out.println(table.size());

		String tel = table.get("김우정"); // null
		System.out.println(tel);

		table.put("김혜수", "010-0000-0000");
		System.out.println(table);
	}
}
  • 객체를 print 하면 {}로 묶여서 나옴 (array, collection은 [])
  • 같은 키에 다른 값을 집어넣으면 기존 값이 덮어씌워짐
    -> containsKey(<K> key) 사용
    -> get(<K> key) 했을 때 null이 나오는지 아닌지로도 확인 가능

Map 메서드

  • put(<K> key, <V> value) : (key, value)를 추가
  • containsKey(<K> key) : 해당 'key'가 Map 안에 존재하는지 확인
  • containsKey(<V> value) : 해당 'value'가 Map 안에 존재하는지 확인
  • clear() : 모든 원소 삭제 (비우기)
  • keySet() : 모든 key 가져오기 (return : Set)
  • values() : 모든 value 가져오기 (return : Collection)

Hash
'Hash'가 붙는다는 것은 'Hashing'을 사용한다는 것이다.

hashing
검색속도를 높이기 위한 방법 중 하나.
hash함수를 이용하여 데이터를 소그룹으로 분류한 후, 값을 검색할 때 해당하는 소그룹을 찾아 그룹 내부 데이터와 값을 비교한다.

  • hashCode() : int : 객체의 hashCode값을 리턴하는 메서드 (from Object)
  • object의 hashCode는 기본적으로 Object의 주소값(10진수 형태)
  • toString으로 객체를 출력하면 기본값은 객체@주소이다. (주소는 16진수)
    이 주소는 hashCode()를 오버라이딩하면 (그래서 return값이 변경되면) 따라 변경된다.
    변하지 않는 고유한 주소값을 알고싶다면 System.identityHashCode()를 사용한다.
    (System.identityHashCode() : 객체의 고유한 hashcode를 리턴하는 메소드)

String의 hashCode()는 고유한 값을 반환하는가? 참고

Hashtable<K,V>

HashMap<K,V>

profile
welcome

0개의 댓글