for 문 으로 배열/컬렉션인스턴스 에서 요소 꺼내는거 단점보완버전
컬렉션 프레임워크 -> 자바 라이브러리 이다
- 다수의 데이터를 쉽고 효율적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합
- 자료구조와 알고리즘을 구조화하여 클래스로 구현해 놓은
다수의 데이터를 효율적으로 관리,저장 할 수 있는 자료구조를 제공함
인터페이스와 클래스로 구성
각 데이터 구조와 특징에 따라 다양한 클래스 사용
Set, List, Queue 등 하위 인터페이스들이 Collection을 상속받음
List - 중복 가능, 순서 있는 데이터 집합
- ArrayList : 특정 원소의 조회가 많은 경우 사용
배열이용하여 만든 리스트
인덱스로 조회 가능, 인덱스만 알면 해당 데이터 빠르게 조회가능
삽입, 삭제 하면 그 뒤의 데이터를 밀거나 당겨야 하기 때문에 느림
- LinkedList : 조회보다 삽입/삭제가 많은 경우에 사용
노드와 포인터를 이용해 만든 리스트
특정 원소 조회할 경우 첫 노드부터 순회함 -> arrayList에 비해 느리다
포인터로 각 노드를 연결하고 있어서, 삽입/삭제 빠름 -> 단순히 기존포인터 끊고 새로운 노드에 연결하면 되기 때문, but 중간에 데이터를 삽입,삭제 할 경우 그 데이터까지 순차적으로 조회해야 하기 때문에 O(N)의 시간복잡도를 가짐
(O(N) -> 빅오 표기법)
- Vector : arrayList와 비슷하게 배열리스트지만 thread-safe 하다
한번에 하나의 스레드만 접근 가능
get, put에 모두 syncronized가 걸려있어서 스레드마다 lock이 걸리게되고 성능이 arrayList보다 안좋음
- Stack : LIFO 특성 자료구조
마지막에 들어온 원소가 처음으로 나감 last in first out
들어올땐 push 나갈땐 pop
Set - 중복 불가능, 순서 없는 데이터 집합
- HashSet : 객체 저장 전 , 먼저 객체의 haseCode()메소드를 호출하고 같으면 equals로 비교하여 동등성 판단
- LinkedHashSet : 중복 X, 순서 O
- TreeSet : 중복 X, 순서X 정렬O . 이진트리 기반 Set컬렉션
Map
- HashMap은 key : value 형태. 순서 X, key는 중복 불가능. value는 가능
key 와 value에 null허용
동기화 보장 x
- HashTable은 HashMap과 동일 특징, thread-safe 하여 동기화 지원
key , value 에 null 허용하지 않는다
동기화 보장함 get() put() remove()등에 syncronized키워드 붙어있다
( 멀티스레드와 syncronized?
멀티스레드 : 여러스레드가 동시에 실행 , 동시에 자원에 접근 가능
syncronized : 스레드 간에 공유자원에 대한 접근을 제어. 데이터 일관성 보장.
한스레드당 한개만 접근하도록. 성능저하 발생)
- LinkedHashMap : 순서 가지는 Map
- TreeMap : key기준으로 정렬되어 저장되는 map
이진트리 기반 map
부모 키값을 비교하여 낮은건 왼쪽 높은건 오른쪽 Map.entry를 저장
저장시간이 오래걸림
Stream
자바 8에서 추가됨
데이터의 흐름 . 배열 또는 컬렉션 인스턴스에 람수 여러개를 조합하여 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 람다를 이용해 코드양 줄이고 간결하게 표현 가능.
-> 즉 배열과 컬렉션을 함수형으로 처리가 가능하다!
-> 멀티스레드 가능하다.
-> 중간연산, 최종연산으로 나뉘고 최종연산이 수행될 때 스트림이 처리된다 -> 지연 연산.
-> 내부 반복을 사용하므로 루프를 명시적으로 작성X
생성 -> 가공 (중간연산) -> 결과(최종연산)
스트림 인스턴스를 생성하고, filtering , mapping등 중간작업(intermediate operations) 거쳐서, 결과를 만들어냄 terminal operations
자주 사용되는 스트림 메서드
1. filter()
- 조건에 맞는 요소를 추출하는 중간연산
2. map()
- 각 요소를 변환하는 중간 연산. 요소를 다른 타입으로 매핑할 때 사용
3. collect()
- 스트림의 결과를 리스트, 셋 등의 컬렉션으로 변환하는 최종 연산
4. forEach()
- 각 요소를 순회하며 특정 작업을 수행하는 최종연산
5. reduce()
- 스트림의 요소들을 하나의 값으로 축약하는 최종연산
6. sorted()
- 스트림의 요소들을 정렬하는 중간연산
7. distinct()
- 중복 요소 제거하는 중간 연산
8. limit()
- 스트림 요소 중 n개 까지만 선택하는 중간연산
9. skip()
- 처음 n개의 요소를 건너뛰는 중간 연산
10. parallel()
- 병렬처리. 대용량데이터 처리에서 유용. 각 요소들이 동시에 여러스레드에서 병렬 처리됨
- 순서가 보장되지 않아서 순서필요하면 forEachOrdered()사용해야함
차이 예시 :
순서적용
작은 데이터셋일땐 stream보다 for-each가 더 빠를 수 있음
stream 은 내부적으로 람다 표현식과 함수형 인터페이스를 사용하고, 추가적인 메서드 호출과 추상화 레이어가 있기 때문에 작은 작업에선 오버헤드 발생할 수 있다
대용량 데이터셋 일땐, 병렬스트림 사용 시 stream이 권장됨
parallel 메서드로 처리하면 병렬 처리하기 때문에 빠르다
람다표현식도 도입되었다
메서드를 식으로 간단하게 표현 가능하게 됨
'기술면접준비' 카테고리의 다른 글
CORS 가 무엇인지, 문제 해결은 어떻게? (0) | 2024.10.12 |
---|---|
내가 이해한 배포개발환경 vs 로컬개발환경 (2) | 2024.10.11 |
github action을 이용한 CICD 파이프라인 자동화 (0) | 2024.10.10 |
Docker와 컨테이너, 오케스트레이션? (0) | 2024.10.10 |
JVM (0) | 2024.10.10 |