ArrayList
- ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일, ArrayList와 달리 Vector는 자체적으로 동기화처리가 되어있다.
- List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다.
- 데이터의 저장공간으로 배열(Array)을 사용한다. (배열기반)
ArrayList의 메서드
- 생성자
- ArrayList() , 기본 생성자
- ArrayList(Collection c)
- ArrayList(int initialCapacity), (initialCapacity : 배열의 길이)
- 추가 메서드
- boolean add(Object o) - 성공 : true, 실패 : false 반환
- void add(int index, Object element) - index : 저장위치
- boolean addAll(Collection c) - 컬렉션이 가진 요소 그대로 저장
- boolean addAll(int index, Collection c)
- 삭제 메서드
- boolean remove(Object o) - 성공 : true, 실패 : false 반환
- Object remove(int index) - 특정위치 삭제
- boolean removeAll(Collection c) - 컬렉션이 가진 요소 삭제
- void clear() - 모든 객체 삭제
- 검색 메서드
- int indexOf(Object o) - 객체의 인덱스 반환, 못 찾으면 -1 반환
- int lastIndexOf(Object o) - 역방향, 객체의 인덱스 반환, 못 찾으면 -1 반환
- boolean contains(Object o) - 객체가 존재하는지
- Object get(int index) - 객체 읽기, 특정 위치에 있는 객체 반환
- Object set(int index, Object element) - 특정 위치에 있는 객체 변경
- List subList(int fromIndex, int toIndex) - from ~ to까지 뽑아서 새로운 List 반환
- Object[ ] toArray() - ArrayList의 객체 배열을 반환
- boolean isEmpty() - 비어있는지
- void trimToSize() - 빈 공간 제거
- int size() - 저장된 객체의 갯수
실습
class Ex1 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
list1.add(5);
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(new Integer(0));
list1.add(new Integer(1));
list1.add(new Integer(3));
ArrayList list2 = new ArrayList(list1.subList(1,4));
print(list1, list2);
Collections.sort(list1);
Collections.sort(list2);
print(list1, list2);
System.out.println("list1.containsAll(list2):"+list1.containsAll(list2));
list2.add("B");
list2.add("C");
list2.add(3, "A");
print(list1, list2);
list2.set(3, "AA");
print(list1, list2);
list1.add(0, "1");
System.out.println("index=" + list1.indexOf("1"));
print(list1, list2);
list1.remove(new Integer(1));
print(list1, list2);
System.out.println("list1.retainAll(list2):"+list1.retainAll(list2));
print(list1, list2);
for(int i= list2.size()-1; i >= 0; i--) {
if(list1.contains(list2.get(i)))
list2.remove(i);
}
print(list1, list2);
}
static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1 :"+list1);
System.out.println("list2 :"+list2);
System.out.println();
}
}
ArrayList에 저장된 객체의 삭제과정
- ArrayList에 저장된 세 번째 데이터(data[2])를 삭제하는 과정
-> list.remove(2) 호출
- ArrayList에 저장된 첫 번째 객체부터 삭제하는 경우 (배열 복사 발생)
- 배열이 [0, 1, 2, 3, 4], 처음에 remove(0)이 실행, 0이 사라짐 -> 뒤에 있는 것들이 앞으로 당겨지고 remove[1] 실행, 2 사라짐 -> 뒤에 있는 것들이 앞으로 당겨지고 remove[2] 실행, 4사라짐 -> 1, 3이 남게됨
-> 앞으로 당겨지기 때문에 제대로 실행 X
for(int = 0; i < list.size(); i++)
list.remove(i);
- ArrayList에 저장된 마지막 객체부터 삭제하는 경우 (배열 복사 발생안함)
for(int = list.size()-1 ; i >= 0; i++)
list.remove(i);
정리
- ArrayList : 기존 Vector개선, 구현원리와 기능적 동일, Vector는 자체 동기화 처리 되어 있음 (Javadoc참고), 저장 공간으로 배열 사용
- list.add() <- autoboxing에 의해 자동으로 참조형 형변환
- subList()로 만들어진 List는 읽기 전용
- 뒤에서 부터 삭제하면 배열 복사 발생하지 않는다.
위에서 부터 지우면 성능상에서도 안좋고, 자잘한 문제 발생