[Java] 컬렉션 프레임워크 (1)

우쓰·2023년 11월 16일
0

Java

목록 보기
9/10

📙Content

컬렉션 프레임워크

: 몇 가지 인터페이스를 통해 다양한 컬렉션 클래스를 이용할 수 있도록 설계 되어있다.

☑️ List 인터페이스

  • 순서를 유지하고 저장
  • 중복저장 가능
  • 구현클래스로는 ArrayList, LinkedList가 있다.

List 인터페이스 메소드

  • 객체 추가 메소드
    - boolean add(E element) : 주어진 element를 뒤에 추가
    - void add(int index, E element) : 인덱스에 element를 추가
    - set(int index, E element) : 인덱스의 객체를 element로 변경

  • 객체 검색 메소드
    - boolean contains(Object o) : 객체가 저장되어 있는지 여부
    - E get(int index) : 인덱스에 지정된 객체를 리턴
    - isEmpty() : 컬렉션이 비었는지 조사
    - int size() : 저장되어 있는 전체 객체 수를 리턴

  • 객체 삭제 메소드
    - void clear() : 저장된 모든 객체 삭제
    - E remove(int index) : 인덱스에 저장된 객체 삭제
    - boolean remove(Object o) : 주어진 객체를 삭제

✔️ LinkedList와 ArrayList의 차이점

  • ArrayList는 내부 배열에 객체를 저장하지만, LinkedList는 인접 객체를 줄로 연결하여 관리한다.
  • ArrayList는 객체를 삽입/삭제할 경우 객체가 하나씩 밀리거나 뒤에 있는 객체가 하나씩 앞으로 당겨온다 따라서 빈번한 삽입 삭제가 이루어진다면 LinkedList가 좋은 성능을 발휘한다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class LinkedListExample01 {

  public static void main(String[] args) {

    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new LinkedList<String>();

    long startTime;
    long endTime;

    startTime = System.nanoTime();
    for (int i = 0; i < 10000; i++) {
      list1.add(0, String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.printf("%-17s %8d ns \n", "ArrayList 걸린 시간 : ", (endTime - startTime));


    startTime = System.nanoTime();
    for (int i = 0; i < 10000; i++) {
      list2.add(0, String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.printf("%-17s %8d ns \n", "LinkedList 걸린 시간 : ", (endTime - startTime));
  }
}

콘솔

ArrayList 걸린 시간 :   7407700 ns 
LinkedList 걸린 시간 :   3148300 ns 

ArrayList의 작업 시간이 더 오래 걸리는 것을 확인할 수 있다.


☑️ Set 인터페이스

  • 순서를 유지하지 않고 저장
  • 중복저장 불가
  • 구현클래스로는 HashSet, TreeSet이 있다.

Set 컬렉션은 수학에서의 집합을 떠올리면 이해가 쉽다
집합과 Set컬렉션의 공통점은
같은 원소를 가질 수 없고 순서 상관이 없다는 점이 있다.

Set 인터페이스 메소드

  • 객체 추가 메소드
    - boolean add(E element) : 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false 리턴한다.
  • 객체 검색 메소드
    - boolean contains(Object o) : 객체가 있는지 여부
    - isEmpty() : 비었는지 조사
    - Iterator<E> iterator() : 저장된 객체를 한 번씩 가져오는 반복자 리턴
    - int size() : 저장된 전체 객체 수 리턴
  • 객체 삭제 메소드
    - void clear() : 모든 객체 삭제
    - boolean remove(Object o) : 주어진 객체를 삭제.

순서가 없기 때문에 인덱스도 존재할 수 없다.
대신 객체를 한 개씩 반복해서 가져오는 방법이 있다.
for each 문이나 Iterator를 사용하는 것이다.

✔️ Iterator

  • 메소드
    - hasNext() : 가져올 객체가 있으면 true 없으면 false를 리턴한다.
    - next() : 컬렉션에서 하나의 객체를 가져온다
    - remove() : next()로 가져온 객체를 Set 컬렉션에서 제거한다.
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class IteratorExample01 {

  public static void main(String[] args) {

    Set<String> set = new HashSet<>();

    set.add("가");
    set.add("나");
    set.add("다");
    set.add("라");
    set.add("마");
    set.add("바");
    set.add("사");

    Iterator<String> iterator = set.iterator();

    while (iterator.hasNext()) {
      String str = iterator.next();
      System.out.println(str);
      if (str.equals("라")) {
        iterator.remove();
        System.out.println(str + " 삭제");
      }
    }

    System.out.println("------");
    for (String s : set) {
      System.out.println(s);
    }
  }
}

콘솔

가
다
바
나
마
라
라 삭제
사
------
가
다
바
나
마
사

순서는 보장되지 않기 때문에 랜덤이지만 "라"는 삭제 되었다.

✔️ 사용 빈도가 높은 HashSet

HashSet은 hashcode() 메소드의 리턴값이 같고, equals() 메소드가 true이면
동일하다고 판단하여 중복 저장하지 않는다.
그러므로 같은 문자열을 갖는 String 객체는 중복 저장되지 않는다.

0개의 댓글