컬렉션 프레임워크(Map 인터페이스)
Q1. Map 인터페이스의 특징은 무엇인가?
- Map 인터페이스는 key, value 쌍으로 데이터를 저장하는 인터페이스입니다.
이 때, key는 중복되어서는 안된다는 특징이 있습니다.
Map 인터페이스를 구현한 대표적인 클래스로는 HashMap 클래스, TreeMap 클래스,
LinkedHashMap 클래스 등이 있습니다.
Q2. Map 인터페이스에 새로운 key, value를 넣기 위한 메소드는 무엇인가?
- put() 메소드입니다.
Q3. Map 인터페이스에 해당 key가 있는지 판단하기 위한 메소드는 무엇인가?
- containsKey() 메소드입니다.
Q4. Map 인터페이스에 해당 value가 있는지 판단하기 위한 메소드는 무엇인가?
- containsValue() 메소드입니다.
Q5. Map 인터페이스에서 key 집합을 반환하기 위한 메소드는 무엇인가?
- keySet() 메소드입니다.
Q6. Map 인터페이스에서 value를 반환하기 위한 메소드는 무엇인가?
- values() 메소드입니다.
Q7. 자바에서의 Map은 무엇과 무엇으로 이루어져 있는가?
- key와 value로 이루어져 있습니다.
Q8. HashTable 클래스는 무슨 인터페이스를 구현했는가?
- Map 인터페이스를 구현했습니다.
Q9. HashMap 클래스와 HashTable 클래스의 차이점은 무엇인가?
- HashMap 클래스는 Thread-Safe하지 않고, null을 저장할 수 있습니다.
반면, HashTable 클래스는 Thread-Safe하고, null을 저장할 수 없습니다.
Q10. HashTable을 제외한 Map으로 끝나는 클래스들은
여러 쓰레드에서 동시에 접근하여 처리할 필요가 있을 때에는
어떻게 선언하여 사용해야만 하는가?
- Collection.synchronizedMap 처리를 해줘야 합니다.
Q11. HashMap에 객체가 들어가면 hashCode() 메소드의 결과 값에 따라
어떤 것이 만들어지는가?
-
Q12. HashMap은 무엇을 사용하여, HashTable에 비하여 무엇이 덜 발생할 수 있어서
성능상 이점이 있는가?
-
Q13. HashTable 구현에는 무엇이 거의 없는 반면, HashMap 구현은 어떠한가?
- HashTable 구현에는 개선이 거의 없는 반면, HashMap 구현은 꾸준히 개선되고 있습니다.
Q14. 어떤 X와 Y가 있을 때, X.equals(Y)가 거짓일 때, X.hashCode() != Y.hashCode()라면
이 때 사용하는 해시 함수는 어떤 해시 함수인가?
- 완전 해시 함수입니다.
Q15. '무엇'이나 '무엇'에 대해 완전 해시 함수를 제작하는 것은 사실상 불가능한가?
-
Q16. HashMap은 기본적으로 각 객체의 어떤 메서드가 반환하는 값을 사용하는가?
-
Q17. 32비트 정수 자료형으로는 왜 완전 해시 함수를 만들 수 없는가?
- 2의 32승-1개의 값만 나타낼 수 있기 때문입니다.
Q18. HashMap을 비롯한 많은 해시 함수를 이용하는 associative array 구현체에서는
메모리를 절약하기 위해 실제 해시 함수의 표현 정수 범위(N)보다 작은
몇 개의 원소가 있는 배열을 사용하는가?
이를 코드로 나타내면 어떠한가?
-
Q19. Q18의 코드와 같은 방식을 사용하면 서로 다른 객체가 '어떤' 확률로
같은 해시 버킷을 사용하게 되는가?
-
Q20. 해시 충돌이 발생하더라도 키-값 쌍 데이터를 잘 저장하고 조회할 수 있도록 하는 두 가지 방식이 있는데,
각각은 무엇인가?
- Open Addressing 방식과 Separate Chaining 방식이 있습니다.
Q21. Open Addressing 방식이란 무엇인가?
- 특정 위치에 이미 데이터가 있다면, 다른 인접한 위치의 공간에 데이터를 저장하는 방식입니다.
Q21-1. Open Addressing 방식에서 데이터를 저장/조회할 해시 버킷을
찾을 때, 어떤 방법을 사용하는가?
- Linear Probing 방식, Quadratic Probing 방식 등을 사용할 수 있습니다.
Q22. Separate Chaining 방식이란 무엇인가?
- 특정 위치에 데이터를 하나가 아닌 여러 개를 저장할 수 있도록
Linked List나 Tree를 연결하는 방식입니다.
Q23. Open Address 방식과 Separate Chaining 방식의 Worst case 시간 복잡도는 무엇인가?
-
Q24. Open Address은 연속된 공간에 데이터를 저장하기 때문에,
Separate Chaining에 비하여 '무엇'이 높은가?
Q24-1 캐시 효율이란 무엇인가?
-
Q25. 데이터 개수가 충분히 적다면 무엇이 무엇보다 좋은가?
- Open Addressing 방식이 Seperate Chaining 방식보다 좋습니다.
Q26. 배열의 크기가 커질수록 '무엇'이라는 Open Addressing 방식의 장점은 사라지는가?
그 이유는 무엇인가?
Q26-1. L1, L2 캐시 적중률이란 무엇인가?
-
Q27. Java HashMap에서 사용하는 방식은 무엇인가?
-
Q27-1. Open Addressing 방식은 무엇을 할 때 데이터를 효율적으로 처리하기 어려운가?
- 삭제를 할 때 데이터를 효율적으로 처리하기 어렵습니다.
Q27-2 HashMap에서는 무슨 메서드가 매우 빈번하게 호출될 수 있는가?
- 삭제 메서드가 빈번히 호출될 수 있습니다.
Q28. HashMap에 저장된 키-값 쌍 개수가 일정 개수 이상으로 많아지면,
일반적으로 무슨 방식은 무슨 방식보다 느린가?
그 이유는 무엇인가?
- Open Addressing 방식이 Seperate Chaining 방식보다 느립니다.
그 이유는 hash collision이 많이 발생하기 때문입니다.
Q29. Seperate Chaining 방식은 무엇이 잘 발생하지 않도록 조정할 수 있다면
무엇 또는 무엇에 가까운 일이 발생하는 것을 줄일 수 있는가?
-
Q30. 자바7에서 해시 버킷 관련 구현은 어떻게 하는가?
-
Q30-1. transient란 무엇인가?
-
Q30-2. Entry<K,V>란 무엇인가?
-
Q30-3 Map.Entry<K,V>란 무엇인가?
-
Q31. Separate Chaining 방식을 사용하기 때문에,
Java 7에서의 put() 메서드 구현은 어떠한가?
-
- 참고
Q1~Q6 Do it 자바 프로그래밍 5/18
Q7~Q10 자바의 신 6/17
Q11~Q31 https://d2.naver.com/helloworld/831311 6/17
A1~A6 5/20