해시 테이블은 '키-값'쌍을 저장하는 자료구조입니다. 평균적으로 빠른 검색과 삽입이 가능하지만, 해시 함수 품질과 해시 충돌을 처리하는 방법이 중요합니다.
해시 함수에 입력4로 변환[4]에 키-값 Apple-Red 쌍을 저장삽입, 삭제, 검색 모두 평균적으로 O(1), 충돌이 많은 최악의 경우에는 O(n)

만약 서로 다른 키 값이 해싱을 통해 동일한 인덱스를 얻어 해싱 충돌이 발생하는 경우에는 체이닝이나 개방 주소법등을 사용해 충돌을 해결할 수 있습니다.
HashTable, HashMap, HashSet, LinkedHashSet은 모두 다른 자료구조입니다.
| 자료구조 | 저장 구조 | 동기화 지원 여부 | Null 허용 | 순서 보장 여부 | 중복 허용 여부 | 사용 목적 |
|---|---|---|---|---|---|---|
| HashTable | Key-Value 쌍 저장 | 동기화 지원 | Null 허용 안 함 | 순서 보장 안 됨 | 중복 허용 안 됨 | 멀티스레드 환경에서 동기화된 해시맵 |
| HashMap | Key-Value 쌍 저장 | 동기화 미지원 | Key와 Value에 Null 허용 | 순서 보장 안 됨 | 중복 허용 안 됨 | 일반적인 해시 기반 맵 |
| HashSet | 값만 저장 (Set) | 동기화 미지원 | Null 허용 | 순서 보장 안 됨 | 중복 허용 안 됨 | 중복되지 않는 값을 관리할 때 사용 |
| LinkedHashSet | 값만 저장 (Set) | 동기화 미지원 | Null 허용 | 삽입 순서 보장 | 중복 허용 안 됨 | 삽입 순서를 유지하며 중복을 허용하지 않을 때 사용 |
연결 리스트는 노드로 이루어진 자료 구조입니다. 각 노드는 데이터와 포인터를 포함하고 있습니다. 각 포인터는 다음 노드가 위치한 메모리 주소를 저장하는 방법으로 노드들 간의 연결을 유지합니다. 동적으로 메모리에 할당하기 좋지만 검색 성능이 낮고 포인터 관리가 중요합니다.
아래는 단방향 연결 리스트의 예시로 그린 그림입니다.

특정 노드를 삽입, 삭제할 때는 O(1), 검색은 O(n)
힙은 특정한 순서 규칙을 따르는 트리 기반의 자료 구조입니다. 가장 크거나 가장 작은 값을 효율적으로 찾거나 제거할 수 있습니다.

O(log n): 완전 이진 트리 구조에서 트리 높이가 log n이기 때문에, 노드가 최상단이나 최하단으로 움직이는 최악의 경우를 고려했을 때 O(log n)이 소요O(1)protected 생성자와 private 생성자의 차이protected 생성자에 접근할 수 있지만, private 생성자에는 접근하지 못합니다. 그래서 JPA는 기본적으로 protected나 public 생성자를 요구합니다.private 생성자는 오직 해당 클래스 내부에서만 사용할 수 있으므로, JPA가 이를 사용할 수 없습니다. 그래서 JPA가 객체를 생성할 때는 protected 생성자를 사용하여 객체를 초기화하게 됩니다.LinkedHashSet으로 관리해서 중복을 허용하지 않게 됐는데, 중복의 기준은 무엇인가?LinkedHashSet은 객체의 equals()와 hashCode() 메서드를 기반으로 중복 여부를 판단합니다.equals()와 hashCode() 기준에 따라 중복 여부가 판단됩니다.equals()와 hashCode() 메서드가 id 필드를 기준으로 작성되어 있으므로, id가 다르면 동일한 content를 가진 댓글이라도 중복으로 처리되지 않습니다. 즉, id가 유일하다면, content, createdAt, createdBy 등이 달라도 댓글이 각각 등록될 수 있습니다.hashCode() 메서드를 id 필드를 기준으로 재정의한 이유hashCode() 메서드를 id 필드를 기준으로 재정의하면, 이 객체가 해시 기반 컬렉션(HashSet, HashMap)에서 어떻게 처리될지 결정됩니다.hashCode() 메서드를 통해 Article 객체가 id를 기준으로 중복되지 않도록 관리할 수 있습니다. 즉, 같은 id를 가진 객체는 같은 해시 값을 가지게 되어, 중복으로 간주됩니다.HashTable, HashMap, HashSet은 서로 다른 자료구조라는 말이 맞는가?HashTable은 키-값 쌍을 저장하는 자료구조로, 동기화된 버전입니다.HashMap은 키-값 쌍을 저장하지만, 동기화되지 않은 버전으로 성능이 더 좋습니다.HashSet은 값만 저장하는 자료구조로, 중복을 허용하지 않고, 내부적으로 HashMap을 사용하여 값을 관리합니다.HashTable, HashMap, HashSet의 차이점new 키워드를 사용하지 않고 객체를 생성할 수 있게 합니다.of라는 메서드를 통해 객체를 생성하면 더 읽기 쉬운 코드가 됩니다. 예를 들어, Article.of("제목", "내용", "해시태그")처럼 사용할 수 있어 객체를 생성하는 의도가 더 명확하게 드러납니다.hashCode() 메서드와 해시 기반 컬렉션 쉽게 설명HashSet, HashMap 등)은 데이터를 저장할 때 해시 값이라는 숫자를 사용해 데이터의 위치를 정합니다.hashCode() 메서드는 객체의 데이터를 기반으로 고유한 해시 값을 계산하는 메서드입니다.Article 객체에서 id 필드를 기준으로 해시 값을 만들면, 같은 id를 가진 객체는 같은 해시 값을 가지므로, 중복되지 않고 저장될 수 있습니다.Article 객체를 HashSet에 저장할 때, hashCode() 메서드가 id를 기준으로 해시 값을 계산하면, 동일한 id를 가진 두 객체는 중복으로 처리되므로, 한 번만 저장됩니다. 이를 통해 중복된 데이터를 저장하지 않게 하여, 메모리를 절약하고, 데이터 조회 성능을 높일 수 있습니다.