본문 바로가기
WEB/Back-end

컬렉션_List, Set, Map (Java)

by 최새벽 2024. 7. 18.

컬렉션

  • 주요 인터페이스: List, Set, Map
    • List: 컬렉션 상속, 순서 유지 저장, 중복 가능
      • ArrayList
      • LinkedList
      • Vector
    • Set: 컬렉션 상속, 순서X, 중복X
    • Map: key, value로 구성된 엔트리 저장, 키 중복 불가
      • HashMap

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

  • key, value가 쌍으로 존재
  • key는 중복 불가, 불변의 값 사용
  • value는 중복 가능
  • 타입 제한이 없음(제네릭, 참조자료형)
  • index 없음 → 순서가 없음
    Map<K, V> map = new HashMap<K, V>();

'WEB > Back-end' 카테고리의 다른 글

Comparable, Comparator (Java)  (0) 2024.07.18
properties, path, lambda, stream (Java)  (0) 2024.07.18
멀티스레드, 동기화 (Java)  (0) 2024.07.18
제네릭 타입(Generic Type) (Java)  (0) 2024.07.18
어노테이션(Annotation) (Java)  (0) 2024.07.18