17일차 09/14 2022

SangYu Lee·2022년 9월 17일
0

codestates backend

목록 보기
17/30

Keyword - Collection

Collection

자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미.
데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것.

이러한 컬렉션 프레임워크는 map을 제외하고 자바의 인터페이스(interface)를 사용하여 구현된다.

Collection 인터페이스의 공통 메서드

collections라는 클래스가 있다.
ex) collections.max(values); 가져온 값중에 가장 큰 값을 리턴한다.

List

  • 데이터의 순서가 유지되며, 중복 저장이 가능하다
  • ArrayList, Vector, Stack, LinkedList 등이 구현하고 있다.

Set

  • 데이터의 순서가 유지되지 않고, 중복 저장이 불가능하다
  • HashSet, TreeSet이 구현하고 있다.

Map

  • <key,value>의 쌍이 합쳐진 하나의 Entry라는 데이터를 요소로 저장하는 컬렉션
  • 각 entry가 들어온 순서가 저장되지 않고, 키는 중복이 불가능, 값은 중복이 가능하다.


List

  • 데이터의 순서가 유지되며, 중복 저장이 가능하다
  • ArrayList, Vector, Stack, LinkedList 등이 구현하고 있다.

ArrayList

만드는법

ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);

ArrayList<String> a1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정 

ArrayList<String> a2 = new ArrayList<String>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정

ArrayList(Collection<? extends E> c)
//Constructs a list containing the elements of the specified collection, 
//in the order they are returned by the collection's iterator.

1) new ArrayList<>(collection)?
ArrayList의 매개변수로 컬렉션을 받아서 생성하면 어떻게 될까?
=>그 컬렉션을 깊은 복사한다.

2) Arrays.asList() 와 new ArrayList<>() 의 차이점
  Arrays.asList() 메소드는 고정길이(fixed-size)의 원배열(specified array)의 list view를 리턴.
즉, 고정길이의 원래 배열의 list view를 리턴하기 때문에 Arrays.asList()를 사용해서 배열을 List로 변환한 후, List에 값을 추가하는 것이 불가능하고, 원래 배열의 값을 변경하면 List의 값도 같이 변경

이렇게 원본 배열의 값과 변환 된 List의 값이 동기화 되는 것을 막기 위해서 Arrays.asList()로 변환한 List로 새로운 ArrayList 객체를 생성해서 사용할 수 있다.

List<String> sl = new ArrayList<String>(Arrays.asList(배열));

출처: https://hianna.tistory.com/551


LinkedList

LinkedList()
//Constructs an empty list.
LinkedList(Collection<? extends E> c)
//Constructs a list containing the elements of the specified collection, 
//in the order they are returned by the collection's iterator.

LinkedList vs ArrayList
데이터를 중간에 추가하거나 삭제하는 경우, LinkedList는 ArrayList보다 빠름
데이터 검색에 있어서는 ArrayList보다 상대적으로 속도가 느림.

Iterator
컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할. Iterator의 컬렉션 순회 기능은 Iterator 인터페이스에 정의되어져 있으며, Collection 인터페이스에는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 메서드인 iterator()가 정의되어져 있다.
즉, Collection 인터페이스에 정의된 iterator()를 호출하면, Iterator 타입의 인스턴스가 반환되며 Collection 인터페이스를 상속받는 List와 Set 인터페이스를 구현한 클래스들은 iterator() 메서드를 사용할 수 있다.
참고 : https://brandpark.github.io/java/2021/01/24/iterator.html

  • Iterator로 순회할때는 값이 바뀌지 않는다.
  • hasNext(), next(), remove() 순서로 메서드를 사용해야 한다.
  • 한 번쓴 iterator를 다시쓰려면 재할당해야한다.

Set

  • 데이터의 순서가 유지되지 않고, 중복 저장이 불가능하다
  • HashSet, TreeSet이 구현하고 있다.

HashSet
hashcode와 equals를 이용해서 개체의 중복을 검사, 개체간 중복을 허용하지 않음

TreeSet
TreeSet은 이진검색트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스다. 이진 검색 트리는 정렬, 검색, 범위검색(range search)에 높은 성능을 보이는 구조로 TreeSet은 이진 검색 트리의 성능을 향상시킨 레드-블랙-트리(red-black-tree)로 구현되어 있다. 그리고 Set인터페이스를 구현했기 때문에 중복된 데이터의 저장을 허용하지 않으며, 정렬된 유치에 저장하므로 저장 순서를 유지하지도 않는다.

참고 : https://soongjamm.tistory.com/107

map

  • <key,value>의 쌍이 합쳐진 하나의 Entry라는 데이터를 요소로 저장하는 컬렉션
  • 각 entry가 들어온 순서가 저장되지 않고, 키는 중복이 불가능, 값은 중복이 가능하다.

보통 HashTable의 향상된 버전인 HashMap이 사용된다.

HashMap<String, Integer> hashmap = new HashMap<>();

Map은 키와 값을 쌍으로 저장하기 때문에 iterator()를 직접 호출할 수 없다. keySet() 이나 entrySet() 메서드를 이용해 Set 형태로 반환된 컬렉션에 iterator()를 호출하여 반복자를 만든 후, 반복자를 통해 순회해야 한다.

1) entrySet()메서드는 키와 값의 쌍인 entry를 set에 담아서 리턴하는데, set은 값이 하난데?

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

Map.Entry라는 Map 인터페이스에 정의된 Entry 멤버로 entrySet()의 결과를 받아서 사용해야 한다.

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 인터페이스의 메서드
        }
profile
아이스커피

0개의 댓글