컬렉션 프레임워크

이정연·2023년 8월 8일

자바기초

목록 보기
23/25

주로 인터페이스로 List, Set, Map 을 제공한다.
여러데이터의 집합인 컬렉션을 다루기 위해 편리한 메서드들을 정의해놓은것

List

  • 데이터의 순서가 유지되며, 중복저장이 가능하다.

ArrayList

  • 객체가 인덱스로 관리된다.
  • 객체를 추가하면 자동으로 저장용량이 늘어난다.
  • 데이터가 연속적으로 존재한다. 즉, 순서를 유지한다.
ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);

ArrayList<String> container1 = new ArrayList<String>();
  • 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스 까지 모두 앞으로 1칸씩 당겨진다.
  • 데이터를 중간에 저장하거나 삭제할대는 데이터를 복사해서 이동해야 하므로 속도가 저하된다.
  • 하지만, 인덱스의 주고값을 얻기 위한 검색에는 유리하다.

LinkedList

  • 데이터를 효율적으로 추가, 삭제, 변겨하기 위해 사용한다.

  • 데이터가 불연속적으로 존재한다.

  • 그림과 같이 각 데이터들은 prev, Next를 가지고 서로 연결되어있다.

  • 따라서 데이터가 추가되거나 삭제될 때 각 node들을 끈어주고 이어주기만하면되기 때문에 처리속도가 훨씬 빠르다.

  • 검색에 있어서는 ArrayList 보다 느리다.

Set

  • 데이터의 순서가 유지되지 않으며, 중복저장이 불가능하다.

HashSet

  • Set인터페이스의 특성을 그대로 물려받음
  • 값을 추가할때 객체의 해시코드를 hasgCode()메서드를 이용해 확인 후 추가한다.
HashSet<String > languages = new HashSet<String>(); //생성

		// HashSet에 객체 추가
        languages.add("Java"); 
        languages.add("Python");
        languages.add("Javascript");
        languages.add("C++");
        languages.add("Kotlin");
        languages.add("Ruby");
        languages.add("Java"); // 중복

TreeSet

  • 이진탐색 트리 형태로 데이터 저장
  • 데이터 중복 허용하지않고, 저장순서 유지 x
  • 정렬과 검색에 특화된 자료구조
  • 모든 왼쪽 자식의 값이 루트나 부모보다 작고 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가진다.
  • 요소를 추가하면 자동으로 정렬순서에 따라 저장된다.
  • 기본정렬방식은 오름차순임.

Iterator

  • 컬렉션에 저장된 요소들을 순차적으로 읽어옴
  • 컬렉션 인터페이스에 저장된 iterator()를 호출하면 Iterator타입의 인스턴스가 반환된다.
ArrayList<String> list = ...;
Iterator<String> iterator = list.iterator();

while(iterator.hasNext()){        // 다음 객체가 있다면
	String str = iterator.next();   // 객체를 읽어오고,
	if(str.equals("str과 같은 단어")){ // 조건에 부합한다면
		iterator.remove();            // 해당 객체를 컬렉션에서 제거합니다. 
	}
}

Map

  • 키(key)와 값(value)의 쌍으로 데이터를 저장하는 컬렉션 구현
  • 데이터의 순서가 유지되지 않으며, 키는 중복불가, 값은 중복 가능하다
  • 기존에 저장된 키와 같은 값을 저장하면 기존의 값이 새로운 값으로 대치됨.

HashMap

  • Map 인터페이스를 구현한 대표적인 클래스
  • 해시함수를 통해 키와 값이 저장되는 위치 결정되므로, 사용자는 그 위치와 순서를 알 수 없다.
  • 해싱을 사용하기 때문에 많은양의 데이터를 검색하는데 있어서 뛰어난 성능을 보임
public class HashMapExample {
    public static void main(String[] args) {

	    // HashMap 생성
        HashMap<String, Integer> map = new HashMap<>();

        // Entry 객체 저장
        map.put("피카츄", 85);
        map.put("꼬부기", 95);
        map.put("야도란", 75);
        map.put("파이리", 65);
        map.put("피존투", 15);

        // 저장된 총 Entry 수 얻기
        System.out.println("총 entry 수: " + map.size());

        // 객체 찾기
        System.out.println("파이리 : " + map.get("파이리"));
				
        // key를 요소로 가지는 Set을 생성 -> 아래에서 순회하기 위해 필요합니다. 
        Set<String> keySet = map.keySet();

        // keySet을 순회하면서 value를 읽어옵니다. 
        Iterator<String> keyIterator = keySet.iterator();
        while(keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
            System.out.println(key + " : " + value);
        }

        // 객체 삭제
        map.remove("피존투");

        System.out.println("총 entry 수: " + map.size());

        // Entry 객체를 요소로 가지는 Set을 생성 -> 아래에서 순회하기 위해 필요합니다. 
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

        // entrySet을 순회하면서 value를 읽어옵니다. 
        Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
        while(entryIterator.hasNext()) {
            Map.Entry<String, Integer> entry = entryIterator.next();
            String key = entry.getKey(); // Map.Entry 인터페이스의 메서드
            Integer value = entry.getValue(); // Map.Entry 인터페이스의 메서드
            System.out.println(key + " : " + value);
        }

        // 객체 전체 삭제
        map.clear();
    }
}

HashTable

profile
반갑습니다.

0개의 댓글