1. set 은 언제 사용하는가?
- 순서에 상관없이, 중복하지 않는 데이터를 저장
- 인덱스없이 그냥 해당 데이터가 존재하는지 존재하지 않는지만 확인하고 싶을 때 사용
- 구현한 주요 클래스로는 HashSet, TreeSet, LinkedHashSet이 있다.
1) HashSet : 가장 대표격인 Set클래스. 해쉬값으로 저장한다.
2) TreeSet : 이진트리 + balanced Tree = 레드 블랙트리구조를 가진다.
이진트리의 장점 = 중위탐색으로 , 정렬된 결과를 반환할수있다. 루트의 하위 왼쪽 노드는 루트노드보다 작은 숫자, 루트의 하위 오른쪽노드는 루트노드보다 큰 숫자.
이진트리의 약점( depth가 n만큼 증가할 수 있다는 점) 을 보완하여, 조회삭제수정 연산에서 logn의 매우 향상된 성능을 보인다.
2. HashSet
- set의 생성자중 독특한 점 : load factor
- load factor란, 해당 셋에 얼마만큼 원소가 차있는가를 나타낸다. 이 값은 0.75로 자바에서는 셋팅되어있다(default 값, 사용자가 건드리지 않은 경우.)
만약 set에 저장된 원소의 개수가 많아져서 0.75를 초과하게 될 경우, set의 크기는 2배로 resize되며 이 과정에서 다시 원소들의 해쉬값을 계산하고 새 배열로 이동하는 연산이 이루어진다. 이 과정에서 성능 하락 있을 수 있음. 0.75가 웬만하면 최적화된 수치라고 하니 적어두 근 몇년간 자바견습생이 건드릴 일은 아마 없을 것..ㅎㅎ
3. LinkedList
- list의 일종이자, queue와 deque를 구현하고 있다.
- deque는 double ended queue이다.
- 배열 중간의 데이터가 수정/삭제 연산이 많이 이루어진다면, LinkedList를 사용하는 것을 고려해본다.
- linkedList가 데려오는 iterator 는 두가지 종류가 있는데 , 일반적인 Iterator와 ListIterator 가 있다. ListIterator는 특이하게 previous() 가 가능하다. 원소의 앞뒤에 붙은 원소를 탐색할 수 있어야 하기 때문에. next()로 다음으로 가는 것도 가능하고 이전으로 가능것도 가능한 것이다.
<Map>
1 . key, value를 가진다. key는 고유해야 하므로, equals와 hashcode를 구현해야 한다.
2. 만약 equals, hashcode를 구현하지 않은 타입을 key로 저장할경우 해당 객체의 메모리주소를 가지고 객체의 동일성을 판단하게 되므로, 논리적으로는 같아보이는 값이 여러번 저장될 것이다.
3. Map은 Collection에 속하지 않는다. put(), get()으로 넣고 뺀다.
4. keySet() 메소드로 key만 Set타입으로 뽑아볼 수 있다.
5. values() 메소드로 값만 Collection타입으로 뽑아볼 수 있다.
6. Map을 구현한 Properties클래스라는 것이 있다.
1) 따라서 마찬가지로 key, value로 값을 저장한다.
2) 추가적으로, 데이터를 읽고 쓰기 위한 메소드들을 제공한다.
3) system properties를 이 객체를 통해 확인해 볼 수 있다. ( encoding type, user.dir 같은 속성들..)