ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이것이 자바다 | 15장 컬렉션 프레임워크 (1)
    JAVA/이것이 자바다 2022. 7. 5. 15:06

    컬렉션 프레임워크: 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓은 것

     

    15.2 List 컬렉션

    • list 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조함
    • null 도 저장이 가능함 (해당 인덱스는 객체 참조를 하지 않음)

    1. ArrayList

    • 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어남
    • 객체를 추가하면 인덱스 0부터 저장됨
    • 특정 인덱스의 객체를 제거하면 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐

            => 빈번한 삭제 삽입이 일어날 경우 사용이 바람직하지 않음 but, 인덱스 검색이나 맨 마지막에 객체를 추가하는 경우 좋음

     

    import.java.util.*;
    
    public class ArrayListExample {
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>(); // ArrayList 생성
            
            list.add("Java"); // 객체 저장(추가)
            
            int size = list.size(); // 저장된 총 객체 수 얻기
            
            String skill = list.get(2); // 2번 인덱스의 객체 얻기
            
            list.remove(2); // 2번 인덱스 객체 삭제
        }
    }

     

    고정된 객체들로 구성된 List 생성

    List<T> list = Arrays.asList(T... a);

    < 사용 예 >

    List<String> list1 = Arrays.asList("홍길동", "신용권", "김자바");

     

    2. Vector

    • ArrayList와 동일한 내부구조를 가짐
    • ArrayList와 다른 점은 스레드가 안전하다는 것

    *스레드가 안전한다: Vector은 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있음 -> 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 가능

     

    3. LinkedList

    • ArrayList와 사용 방법은 같지만, 내부구조는 완전 다름
    • 인접 참조를 링크해서 체인처럼 관리 -> 빈번한 객체 삽입과 삭제가 일어나는 곳에서 더 좋은 성능 발휘함
    • 처음 생성될 때 어떠한 링크도 만들어지지 않기 때문에 내부는 비어 있다고 보면 됨
    List<E> list = new LinkedList<E>();

     

    < 사용 예 >

    List<String> list = new LinkedList<String>();

     

    ∴ 끝에서부터 추가/삭제 하는 경우 ArrayList가 빠르지만, 중간에 추가/삭제할 경우 LinkedList가 빠름

     

    15.3 Set  컬렉션

    • 저장 순서를 유지하지 않음
    • 중복 저장 불가능 -> 하나의 null만 저장 가능

        Iterator<E> iterator() : 저장된 객체를 한 번씩 가져오는 반복자 리턴

            => Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없지만, 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공

    < iterator 사용 예 >

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

    < Iterator 인터페이스에 선언된 메소드 >

    리턴 타입 메소드명 설명
    boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false 리턴
    E next() 컬렉션에서 하나의 객체를 가져옴
    void remove() Set 컬렉션에서 객체를 제거
    Set<String> set = ...;
    Iterator<String> iterator = set.iterator();
    // 저장된 객체 수 만큼 반복
    while(iterator.hasNext()) {
        // String 객체 하나를 가져옴
        String str = iterator.next();
    }

     

    1. HashSet

     

    < 사용 예 >

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

     

    hashCode()로 비교한 후, 동일한 해시코드가 있으면 equals() 로 다시 비교함 => 중복 저장 X

     

     

    15.4 Map 컬렉션

    메소드 설명
    Set<Map.Entry<K, V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
    Set<K> keySet() 모든 키를 Set 객체에 담아서 리턴
    Collection<V> values() 저장된 모든 값을 Collection 에 담아서 리턴

     

    < Set<Map.Entry<K, V>> entrySet() 사용법 > 

    Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

     

    < 저장된 전체 객체를 대상으로 객체를 하나씩 얻는 2가지 방법 >

    1. keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻기
    2. entrySet() 메소드로 모든 Map.Entry 를 Set 컬렉션으로 얻은 다음, 반복자를 통해 Map.Entry를 하나씩 얻고 getKey()와 getValue() 메소드를 이용해 키와 값 얻기

    1. HashMap

     

    키와 값의 타입은 기본 타입을 사용할 수 없고 클래스 및 인터페이스 타입만 가능함

    Map<String, Integer> map = new HashMap<String, Integer>();

     

    2. Hashtable

     

    • HashMap과 동일한 내부 구조를 가짐
    • HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있음 => 스레드가 안전함
    Map<String, Integer> map = new Hashtable<String, Integer>();

     

    3. Properties

    • Hashtable의 하위 클래스 - 다른점: 키와 값을String 타입으로 제한

     

Designed by Tistory.