WEB/Back-end
컬렉션_List, Set, Map (Java)
by 최새벽
2024. 7. 18.
컬렉션
- 주요 인터페이스: List, Set, Map
- List: 컬렉션 상속, 순서 유지 저장, 중복 가능
- ArrayList
- LinkedList
- Vector
- Set: 컬렉션 상속, 순서X, 중복X
- Map: key, value로 구성된 엔트리 저장, 키 중복 불가
List
- boolean add(E e) : 객체 맨 끝에 추가
- int size() : 저장된 객체 개수 리턴
- E get(int index) : 주어진 인덱스에 해당하는 객체 리턴
ArrayList
- 내부 배열에 객체가 저장되고 제한없이 객체를 추가할 수 있음 ↔ 기본 array와 다른 점
- 객체 번지 저장. 객체 중복 저장 시 동일 번지가 저장되며 null 저장이 가능
- 인덱스 0번부터 차례대로 저장
- .remove(0)을 하면 뒤에 있는 인덱스가 하나씩 당겨짐 → 중간에 빈칸이 없음
- 빈번한 객체 삭제와 삽입이 일어나는 곳에서 바람직하지 않음
- 해당 경우 Linked List 사용하는 게 좋음
- Linked List는 앞의 순서를 통해 뒤의 순서를 알아내므로 순차적 출력의 경우 느림
- LinkedList 검색 느림
- 어플리케이션은 DB에서 삭제 삽입을 하는 경우가 많으므로 잘 안 사용함
- 순서가 있고 차례대로 저장되어 있으므로 순차적 작업이 필요한 경우 유리함
- 타입 제한이 없음(제네릭, 참조자료형)
Set
- 저장 순서 유지x,
- 수학에서의 집합, 순서가 상관없고 중복 허용이 안됨
- add, contains, isEmpty, iterator, size, clear, remove 등의 메서드 → get없음(인덱스가 없어서)
- Map에서 key 저장할 때 많이 사용
HashSet
Set<E> set = new HashSet<E>();
Set<E> set = new HashSet<>();
- 다른 객체여도 hashCode() 메서드의 리턴값이 같고 equals() 메서드가 true를 리턴하면 동일 객체라 판단함
- 같은 문자열 동일하게 판단
예시
- Member 클래스
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class Member {
public String name;
public int age;
@Override
public int hashCode() {
return name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member target) {
return target.name.equals(name) && (target.age==age);
}else {
return false;
}
}
}
- 실행 클래스
import java.util.*;
public class HashSetExample {
public static void main(String[] args) {
Set<Member> set = new HashSet<Member>();
Member m = new Member("홍길동", 30);
set.add(m);
set.add(m); // 같은 객체 추가
set.add(new Member("홍길동", 30));
set.add(new Member("홍길동", 30)); // 다른 객체 추가
System.out.println("총 객체 수 : " + set.size()); // 결과: 총 객체 수 : 1
// 현재 코드에서 다른 객체를 저장하더라도 내용이 동일하면 한 번만 저장이 되는 것을 알 수 있음
// Member 객체에서 equals를 오버라이딩 했기 때문 (오버라이딩 하지 않았을 시 총 객체 수 3개 나옴)
}
}
Map
- key와 value로 구성된 entry로 객체 저장
- 아래와 같은 메서드로 구성
- 추가: put(key, value)
- 객체 검색:
containsKeys(key)
, containsValues(value)
, Set<Map.Entry<K,V>> entrySet()
- get, isEmpty,
Set<K> keyset()
, size, values
- 삭제: clear, remove
HashMap