Collection은 컬렉션 프레임워크의 인터페이스로 여러 객체를 그룹화하여 추가, 저장, 삭제 등의 기본적인 기능을 제공한다. 대표적인 하위 인터페이스로는 List, set, Map이 있다.
Collections는 유틸리티 클래스로 Collection 인터페이스를 구현한 컬렉션 객체들을 검색, 조작 및 전달하는데 사용된다
Collection Framework는 컬렉션을 표현하고 조작하기 위한 통합 아키텍처이다.
📌 Collection에 대해서
사진 출처 :http://www.instanceofjava.com/2015/07/collections-interview-questions-java.html
HashMap을 구현할 때 Key를 신중하게 정해야하며 서로 다른 키들이 같은 해시 코드를 가질 경우를 대비해 충돌에 대한 해결책을 마련해 두고 초기 용량과 로드팩터를 잘 설정해 둔다. 그리고 HashMap은 동기화를 지원하지 않아 스레드 간의 안정성을 보장하지 않기 때문에 멀티 스레드를 사용할 경우 외부에서 동기화를 보장해줘야한다.
해시는 버킷에 저장이 되며 다른 키가 같은 해시 값을 가진다면 같은 버킷에 채워지게 된다. 이는 키에 용량이 무한대가 아니기 때문에 그렇다. 한 버킷에 여러 개가 존재하는 경우 충돌이 일어나는데 이러한 경우를 피하기 위해 버킷의 일정 용량이 채워질 경우 용량을 늘리며 원래 버킷의 값들을 새로운 버킷으로 옮기는 과정이 일어난다. 이 때 처음 용량이 초기용량이고 용량을 늘리는 기준점이 로드팩터이다. 용량을 너무 낭비하지도 않고, 용량을 늘리는 과정을 많이 반복해 성능 저하를 발생시키지 않는 적절한 값을 찾아야 하기 때문에 초기용량과 로드팩터의 설정이 중요하다.
HashSet을 구현할 때 Key를 신중하게 정해야하며 서로 다른 키들이 같은 해시 코드를 가질 경우를 대비해 충돌에 대한 해결책을 마련해 두고 초기 용량과 로드팩터를 잘 설정해 둔다. 그리고 HashSet은 동기화를 지원하지 않아 스레드 간의 안정성을 보장하지 않기 때문에 멀티 스레드를 사용할 경우 외부에서 동기화를 보장해줘야한다.
HashSet은 HashMap과 다르게 객체만 저장할 수 있으며 들어가는 객체를 이용하여 hashcode를 생성하고, equals()메소드를 이용해 hascode를 비교해 중복된 객체가 있는지 체크한다.
ArrayList와 LinkedList는 List의 Collection 구현체이지만 동작 방식이 다르다.
ArrayList는 중복을 허용하고 순서를 유지하며 인덱스로 원소들을 관리한다.
인덱스로 관리하기 때문에 무작위로 index의 데이터를 한번에 가져올 수 있다.
하지만 삽입과 삭제에 따라 데이터의 위치가 움직이는 단점이 있다.
LinkedList는 내부적으로 양방향의 연결 리스트로 구성되어 있어서 배열의 크기를 변경할 수 없으며 데이터에 순차적으로 접근하기 때문에 검색의 속도가 느리다.
하지만 데이터를 삽입과 삭제할 때 원하는 주소값만 병경해주면 되기 때문에 ArrayList에 비해 효율적이다.
조회시에는 ArrayList가 성능이 잘나오고 삽입,삭제 시에는 LinkedList가 더 성능이 뛰어나다.
반복문을 사용하여 배열의 요소를 add()를 통하여 List객체에 추가하는 방법이 있다.
Collections의 addAll() 메서드를 사용하여 List로 전환한다.
Stream API를 사용하여 배열을 스트림으로 변환후 Collectors.toList()메서드를 사용하여 스트림을 List로 변환할수 있다. 이때 Java의 버전이 1.8이상인 경우 사용 가능하다
두 배열은 크기가 동적인 배열을 사용할 때 주로 사용하는 클래스인데 둘의 가장 큰 차이점은 Vector는 동기화가 가능하며 ArrayList는 동기화가 되지 않는다. 따라서 Vector는 thread-safe하며 한번에 하나의 스레드만 액세스가 가능하다. ArrayList는 동기화 되지 않았기 때문에 Vector보다 더 빠르다.
동적 배열 클래스로 최대 인덱스를 초과할때 추가되는 인덱스의 수도 다른데 Vector는 현재 배열의 크기의 100%가 증가하며, ArrayList의 경우 현재 배열 크기의 50%가 증가한다.
Vector와 ArrayList의 비교
Array는 초기화시 size를 지정하고 고정되어있지만 ArrayList는 size를 표시하지 않으며 가변적이다.
Array는 원시타입(primitive type)과 Object타입을 모두 저장할수 있는 반면 ArrayList는 오직 Object타입만 저장할 수 있다.
Array는 for,for eact를 통해 순회할 수 있으며 ArrayList는 Iterator,for eact를 통해 순회할 수 있다.
길이를 조회할 때 Array는 Array.length를 사용하고 ArrayList는 size()메소드를 이용한다.
ArrayList는 배열의 크기가 증가함녀 자동 크기 조정을 통해 이전 배열의 요소를 새 배열로 복사하는 과정을 거치는데 이러한 과정 때문에 Array보다 성능이 떨어진다.
일반적으로 요소를 추가하고 조회할 때는 Array와 ArrayList는 비슷한 성능을 보인다.
Array는 다차원 배열을 구현하는게 가능하지만 ArrayList는 항상 단일 차원이다.
Array는 '='를 사용하여 요소를 추가하고 ArrayList는 add() 메소드를 사용하여 요소를 추가한다.
사진출처: https://javahungry.blogspot.com/2015/03/difference-between-array-and-arraylist-in-java-example.html
좋은 글 감사합니다. 자주 올게요 :)