List 구현체
List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 공통적인 특징을 갖는다.
공통점 |
차이점 |
List 인터페이스를 구현한다.
저장순서가 유지되고 중복을 허용한다. 데이터의 저장 공간으로 배열을 사용한다. |
Vector는 멀티쓰레드에 대한 동기화가 되어 있으나 ArrayList는 그렇지 않다. |
=> Vector는 동기화처리 때문에, 성능이 좋지않으므로 사용할때 주의해야 한다.
LinkedList
배열은 가장 기본적인 형태의 자료구조로 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간(access time)이 가장 빠르다는 장점을 가지고 있다.
하지만 !! 아래와 같은 단점이 존재한다.
ArrayList와 LinkedList 비교
=> 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
ArrayList와 LinkedList 접근테스트
get을 사용한 방식과 Iterator를 사용하여 ArrayList와 LinkedList에 접근해보았다.
get 메소드를 사용하였을 때 LinkedList에서 데이터 접근하는 속도는 굉장히 느렸다.
=> ArrayList와 다르게 LinkedList에서 get은 효율적이지 않다. get을 호출할 때마다 내부적으로 반복문이 실행되는데.. Iterator는 내부적으로 반복 처리된 노드가 무엇인지에 대한 정보를 유지하기 때문에 Iterator를 사용하는 것이 더 유리하다고함
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 31 32 33 34 35 36 37 38 39 | public class ListTest { public static void main(String[] args) { ArrayList<Integer> al = new ArrayList<>(1000000); LinkedList<Integer> ll = new LinkedList<>(); insertData(al); insertData(ll); System.out.println("== Get 접근 테스트 =="); System.out.println("ArrayList : " + getAccess(al)); System.out.println("LinkedList : " + getAccess(ll)); System.out.println("== Iterator 접근 테스트 =="); System.out.println("ArrayList : " + iteratorAccess(al)); System.out.println("LinkedList : " + iteratorAccess(ll)); } public static void insertData(List<Integer> list) { for(int i=0; i<100000; i++) list.add(i); } public static long getAccess(List<Integer> list) { long start = System.currentTimeMillis(); for(int i=0; i<100000; i++) list.get(i); long end = System.currentTimeMillis(); return end - start; } public static long iteratorAccess(List<Integer> list) { Iterator<Integer> iter = list.iterator(); long start = System.currentTimeMillis(); while(iter.hasNext()) { iter.next(); } long end = System.currentTimeMillis(); return end - start; } } | cs |
결과
== Get 접근 테스트 ==
ArrayList : 3
LinkedList : 4747
== Iterator 접근 테스트 ==
ArrayList : 5
LinkedList : 3
스택은 마지막에 저장한 데이터를 가장 먼저 꺼내는 LIFO(Last In First Out)
큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)
스택의 활용 예
=> 수식계산, 수식괄호검사, undo/redo, 브라우저 (뒤로, 앞으로)
큐의 활용 예
=> 최근사용문서, 인쇄작업 대기목록, 버퍼
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] JCA(Java Cryptography Architecture) 자바 암호화와 보안 2 (0) | 2018.09.06 |
---|---|
[JAVA] JCA(Java Cryptography Architecture) 자바 암호화와 보안 (0) | 2018.09.05 |
[JAVA] 네트워크 프로그래밍 TCP 소켓 통신 (5) | 2018.07.08 |
[JAVA] 자바7 try-with-resources문, multicatch 문 (1) | 2018.07.08 |
[JAVA] 컬렉션프레임워크(CollectionFramework) 1 (0) | 2018.07.02 |