
- 순서를 보장하지않음.
- 데이터 중복을 허용하지 않음.
- 데이터를 조회할시 list보다 성능이 좋음.
- 중복된 데이터를 제거할 때
- 데이터의 존재 여부를 확인해야할 때 -> 조회성능이 빠른 이유는 HashSet같은경우, HashTable를 통해 구현되기 때문에, 접근시 상수시간의 시간이 들기 떄문이다.
중복을 없애거나, 빠르게 조회를 해야하는 경우가 아니라면, 거의 대부분 List를 사용한다고 생각해도 무방하다.
만약, 데이터들이 중복이 없고, 순서도 상관없이 iteration목적으로만 접근하려고 한다면 Set? List를 써야하냐?
for(int i : peoples){
무엇을 수행....
}
이런식으로 데이터 전체에 접근해서 무언가를 실행하려고 했을 경우,
만약 ArrayList, LinkedList 같은 경우에는 배열로 차곡차곡 데이터가 쌓여있기 때문에, 순차적으로 접근하면 되며, LinkedList같은 경우도 노드 단위로 연결되어있기 때문에, 순차탐색으로 접근하면 됩니다.
하지만 HashSet같은 경우에는, HashTable로 이루어져 있기때문에, 데이터들이 테이블 전방에 랜덤해서 들어가있습니다. 그렇기 때문에 띄엄띄엄 저장되어있기에 데이터가 없는 곳 전체를 확인하기떄문에, List가 더 낫다.
Set에 객체를 저장하게 된다면, 객체 이름이 C1이라면, C1의 값과 해시코드랑 같이 HashTable에 저장을 합니다. 비교를 할땐, HashCode를 비교하고 HashCode%capacity를 통해 해당 주소로 가서, HashCode가 다르다면 다르다고 리턴을 하며 같을경우, 객체를 비교하게 되는데 객체는 메모리주소값으로 비교하여 같은지 안 같은지를 리턴한다.
객체의 x라는 필드 값이 10이였는데, 100으로 변경을 하게된다면, HashCode가 HashFunction을 통해 다른 값이 나오게 되어 원래 저장되어있던 주소값으로 가는 것이 아니라, 새로운 주소로 가게되어 contains()연산을 하게된다면 false가 나오게 됩니다. 만약 필드를 변경했는데, HashCode가 같게 나온다면? 객체의 메모리 주소값으로 비교하기 때문에 true가 나올 것이다. 그렇기에 이를 해결하기 위해서는 처음 객체를 만들때 필드를 final로 설정해서 사용해야한다.