일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- docker
- DP
- series
- 파이썬
- 위상정렬
- Redis
- 백준
- equals
- ddd
- 세그먼트 트리
- pandas
- 이펙티브 자바
- springboot
- 알고리즘
- JPA
- dataframe
- 문자열
- 데이터 flow
- spring security
- BFS
- 자바
- 스프링
- disjoint set
- 포트앤어댑터 아키텍처
- 다익스트라
- java
- 비트마스크
- 헥사고날 아키텍처
- dfs
- UML
- Today
- Total
코딩못하는사람
배열과 Collections 프레임 워크(1)List 본문
Array,ArrayList의 구조와 차이점등이 궁금해서 정리해보려고 한다.
배열(Array)
여러 데이터를 하나의 이름으로 묶어서 관리하게 해주는 자료구조. index와 값으로 구성되어 있다.
배열에서 index는 어떤 값인지 알려주는 유일무이한 식별자이다.
(list에서는 index가 몇번째에 있는지 데이터인지 알려주는 척도)
연속된 메모리에 저장되어 있고 배열을 정의하면 길이를 바꿀 수 없다.
또한 배열은 정적이므로 엘리먼트가 삭제되면 빈공간으로 두게 된다.
장점: 인덱스를 통한 검색이 빠르다, 연속적이므로 메모리 관리가 편하다.
단점: 삭제된 공간을 빈공간으로 두기 때문에 메모리 낭비가 있다,크기를 바꾸지 못한다.
Collections 프레임워크
Array로만 모든 데이터를 다루게 되면 비효율적인 부분이 많다.(고정 크기,데이터 낭비 등)
그에 따라서 자바는 Collections 프레임워크에 널리 알려진 자료구조를 바탕으로 객체나 데이터들을
효율적으로 관리(추가,삭제,저장,검색)등을 할 수 있는 자료구조를 구현해 놓았다.
대표적으로는 List, Set, Map, Stack, Queue등이 있다.
List 컬렉션
List는 Collection을 확장한 자료형으로 데이터의 중복입력이 가능하고
(중복 저장일 때는 같은 주소를 갖는다) 다량의 데이터를 입력하고 다룰 때 사용된다.
객체를 일렬로 늘어 놓은 구조이다.
인덱스는 객체의 래퍼런스 값을 가지고 있다. (null도 저장가능)
종류에는 ArrayList,Vector,LinkedList가 있다.
ArrayList
Array와 마찬가지로 인덱스로 객체를 관리한다.하지만 ArrayList는 동적으로 배열의 크기가 늘어날 수 있다.
내부에서 처음 설정한 저장용량(default capacity=10)을 넘어가게 되면 배열의 크기를 1.5배로 늘린다.
ArrayList와 Array의 차이점
-
Array는 크기가 고정되어 있고 ArrayList는 크기가 동적으로 할당된다.
-
Array는 primitive,Object 모든 데이터를 받을 수 있지만 ArrayList는 Object만 받을 수 있다.
-
ArrayList는 타입 안정성을 제공해주는 제네릭을 사용 할 수 있다.
-
배열의 길이에 대해서 Array 는 length ,ArrayList는 size()메서드를 쓴다.
-
Array는 원소를 할당하고 ArrayList는 add()메서드로 넣어준다.
ArrayList에서의 객체의 삭제와 삽입
list에서는 빈공간을 허락하지 않으므로 삭제하거나 삽입할 때
굉장히 비효율적인 작업이 진행되는 것을 알 수 있다.
뒤에있는 데이터들을 모두 뒤로 미뤄주거나 앞으로 옮겨주어야 해서 시간이 많이 걸린다.
삽입과 삭제가 자주 일어나는 상황이면 Linked List를 써야한다.
LinkedList
노드간 연결을 통해서 구현된 객체이다. 노드에 데이터 값과 다음 노드에 관한 주소만을 가지고 있다.
인덱스가 없기 때문에 순차접속만이 가능하다.(계속 link를 타고 원하는 지점까지 가야함)
당연히 인덱스로 접근하는 ArrayList보다 탐색 속도가 느리다.
하지만 노드의 추가/삭제는 주변 노드의 주소정보 수정만으로 가능하기 때문에
모든 배열을 한칸씩 이동하는 ArrayList보다 훨씬 빠르다.
LinkedList 삽입/삭제 과정
Vector
Vector은 ArrayList와 동일한 구조를 가지고 있다. Vector와 ArrayList의 차이점은 동기화이다.
Vector 는 동기화된(synchronized) 메서드로 구성되어 있어서 multi-thread에 안전하게
객체를 추가하고 삭제할 수 있다(쓰레드에 안전하다). 하지만 동기화 되어있기 때문에 ArrayList보다 느리다.
데이터 추가시에 배열크기가 2배로 늘어난다.
-
ArrayList: 객체 검색 및 맨 뒤에 객체를 추가할 때 효율적
-
LinkedList: 객체 삽입 및 삭제가 자주 이루어질 때 효율적
-
Vector: multi-thread 환경에서 사용됨.
ArrayList,Vector와 LinkedList가 많이 달라서 Api를 보니 모두 AbstractList를 상속받지만 LinkedList는 AbstractSequntialList까지 상속받았다.
List클래스 주요 메서드
공부 및 참고한 곳
coding-factory.tistory.com/550?category=758267
velog.io/@adam2/Array%EC%99%80-List%EA%B7%B8%EB%A6%AC%EA%B3%A0-Java-List
'자바 메모장 > 개념 및 문법' 카테고리의 다른 글
Java Enum이란? (0) | 2021.02.27 |
---|---|
hashCode()와 equals() - Collection(2) (0) | 2021.02.12 |
Cloneable 인터페이스 deepcopy (0) | 2021.02.10 |
Immutable,mutable 객체 (0) | 2021.02.10 |
JVM 메모리 구조 정리 (2) | 2021.02.09 |