ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java Collection Framework(JCF) List
    개발하면서/Algorithm,Data Structure 2013.08.20 14:54

    ArrayList, CopyOnWriteArrayList, LinkedList, Vector, CheckedList,


    ArrayList

    멤버 변수에는 저장된 데이타의 갯수 size와 데이타를 담는(C에서 포인터처럼 가리키는) Object elementData[]가

    정의되어 있다.


    넉넉하게 elementData를 잡아놨다가 저장 공간이 부족하면 grow를 호출한다.

    또한 elementData 중간에 데이타를 추가하거나, 제거할때는 그 뒷부분의 배열을 앞쪽으로 당기거나 뒤쪽으로 미는
    동작을 수행한다.        마지막에 위치한  데이타를 삭제하고 추가시 elementData의 이동은 없다.


    여기까지가 기본적인 데이타 추가/수정/삭제 얘기고 ArrayList 보면서 재미진 부분에 대해(지극히 주관적입니다;;) 얘기한다.


    * removeAll, retailAll method  사실 이런게 있는지 처음 알았다... A.removeAll(B)는 A에 A-B의 데이타가 남고

    A.retailAll(B)는 A와 B의 교집합 데이타가 A에 남는다.


    * 데이타를 추가/삭제시 modCount++를 수행하는데 그 이유는 writeObject 에 있다.

    writeObject 를 보면 Object를 쓰기전에 modCount를 저장해놨다가 쓰기 작업이 완료된 후, 쓰기 작업 중간에
    추가/삭제 작업이 진행됐는지 체크한다.

    * sublist가 있는데 사용법은 아래 url에 잘 나와있다.

    http://stackoverflow.com/questions/6189704/how-to-take-a-valid-sublist-in-java  
    전체가 아닌 부분에 대해서만 작업을 하고 싶을때 사용하면 좋다고 한다.



    Vector에서 ArrayList와 가장 큰 차이점이 public method들이 synchronized를 사용한다는 점이다. (생성자와 enumeration 제외) 그래서 writeObject에서는 사용하지 않는다.


    Stack은 Vector를 상속하고 5개의 method가 추가되었다. LIFO 동작을 위해 필요한 method들이다.
    javadoc에서 더 확실한 LIFO를 사용하고싶다면 Deque를 사용하라고 한다.


    LinkedList는 배열이 아닌 포인터(이렇게 말해도 되려나..)를 이용해 양방향 링크드 리스트를 구현하였다.

    synchronized가 아니고, 다른 자료구조와는 다르게 modCount를 사용하지 않는다. 그래서 writeObject시 쓰는 중간에

    추가/수정/삭제가 실행되도 에러가 발생되지 않는다. 


    CopyOnWriteArrayList는 ArrayList를 thread-safe하게 만든 자료구조다.
    멤버 변수로 ReentrantLock lock을 갖고있고, 추가/수정/삭제시 lock을 건다. 그리고 clone 시에는 얕은복사를 하고,
    추가/수정/삭제시에 데이타를 갖고있는 array 복사를 한다.
    추가/수정/삭제시 매번 복사가 발생하므로 데이타 변경이 빈번한곳에서는 쓰면 안될것같다.

    TAG

    댓글 0

Designed by Tistory.