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 복사를 한다.
추가/수정/삭제시 매번 복사가 발생하므로 데이타 변경이 빈번한곳에서는 쓰면 안될것같다.