충분히 쌓여가는
ArrayList 본문
ArrayList
기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일하다
ArrayList와 달리 Vector은 자체적으로 동기화 처리가 되어 있다
List 인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다
데이터의 저장공간으로 배열을 사용한다(배열기반)
Vector 클래스의 source
Object[]: 객체 배열로 다형성 때문에 모든 종류의 객체를 저장 가능하다
public class Vector extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
{
...
protected Object[] elementData; // 객체를 담기위한 배열
...
ArrayList의 메서드
코드
ArrayList에는 객체만 저장가능한데 5도 되는 이유는 autoboxing에 의해 기본형이 참조형으로 자동변환되기 때문
sublist는 읽기 전용이기 때문에 새로운 list를 만들어줘야한다
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
// 기본 길이(용량, capacity)가 10인 ArrayList 생성
ArrayList list1 = new ArrayList(10);
// ArrayList에는 객체만 저장가능한데 5도 되는 이유는
// autoboxing에 의해 기본형이 참조형으로 자동변환되기 때문
list1.add(5); // list1.add(new Integer(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));
// list1에서 list를 새로 만든다, sublist는 읽기 전용이기 때문에 새로운 list를 만들어줘야한다
ArrayList list2 = new ArrayList(list1.subList(1,4)); // 1 <= x < 4, 밑의 2줄과 동일
// List sub = list1.subList(1, 4); // sub는 읽기만 가능 [4, 2, 0]
// ArrayList list2 = new ArrayList(sub); // sub와 같은 내용의 ArrayList 생성
print(list1, list2);
// Collection은 인터페이스, Collections는 util클래스
Collections.sort(list1); // list1과 list2를 정렬한다.
Collections.sort(list2); // Collections.sort(List l)
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"); // 0번쨰 자리의 1은 문자열 2번째 자리의 1은 숫자
System.out.println(list1.indexOf("1")); // indexOf()는 지정된 객체의 위치(index)를 알려준다
System.out.println();
list1.remove(1); // index가 1인 객체를 삭제
list1.remove(new Integer(1)); // 1을 삭제
// list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다.
System.out.println("list1.retainAll(list2):" + list1.retainAll(list2));
print(list1, list2);
// list2에서 list1에 포함된 객체들을 삭제한다.
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();
}
}
list1:[5, 4, 2, 0, 1, 3]
list2:[4, 2, 0]
list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4]
list1.containsAll(list2):true
list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4, A, B, C]
list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4, AA, B, C]
0
list1.retainAll(list2):true
list1:[2, 4]
list2:[0, 2, 4, AA, B, C]
list1:[2, 4]
list2:[0, AA, B, C]
ArrayList에 저장된 객체의 삭제과정
ArrayList에 저장된 세 번째 데이터(date[2])를 삭제하는 과정, list.remove(2)를 호출
1. 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다
// data[3]에서 data[2]로 2개의 데이터를 복사하라는 의미
System.arraycopy(date, 3, data, 2, 2)
2. 데이터가 모두 한 칸씩 이동했으므로 마지막 데이터는 null로 변경한다
data[size-1] = null;
3. 데이터가 삭제되어 데이터의 개수가 줄었으므로 size의 값을 감소시킨다
size--;
※ 마지막 데이터를 삭제하는 경우, 1의 과정(배열의 복사)은 필요없다
size를 1 감소시켜 주기만 하면 된다
① ArrayList에 저장된 첫 번째 객체부터 삭제하는 경우(배열 복사 발생)
for(int i=0, i<list.size(); i++)
list.remove(i);
② ArrayList에 저장된 마지막 객체부터 삭제하는 경우(배열 복사 발생 안함) 추천!!
for(int i=list.size()-1; i>=0, i--)
list.remove(i);
'Java > JAVA2' 카테고리의 다른 글
Stack & Queue (0) | 2023.07.07 |
---|---|
LinkedList - 배열의 단점 보완 (0) | 2023.07.07 |
Collection, List, Set, Map (0) | 2023.07.06 |
collections framework (0) | 2023.07.04 |
SimpleDateFormat (0) | 2023.07.04 |