공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
ArrayList
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable{
...
transient Object[] elementData; //Object 배열
...
}
ArrayList 는 기존의 Vector 를 개선한 것이다( Vector 는 호환성을 위해서 남아있는 것이기 때문에 ArrayList 를 사용해야 함). ArrayList 는 Object 배열을 이용해서 데이터를 순차적으로 저장한다. 첫 번째로 저장한 객체는 Object 배열의 0 번째 위치에 저장되고 그다음 객체는 1 번째 위치에 저장되는 식으로 순서대로 배열에 쌓인다. 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장된다. 또한 위의 코드는 ArrayList 소스코드의 일부분인데 elementData 라는 이름의 Object 배열을 멤버 변수로 선언하고 있다는 것을 알 수 있다. 선언된 배열의 타입이 모든 객체의 최고 조상인 Object 이기 때문에 모든 종류의 객체를 담을 수 있다.
메서드 | 설 명 |
ArrayList( ) | 크기가 10 인 ArrayList 를 생성 |
ArrayList(Collection c) | 주어진 컬렉션이 저장된 ArrayList 를 생성 |
ArrayList(int initialCapacity) | 지정된 초기 용량을 갖는 ArrayList 를 생성 |
boolean add(Object o) | ArrayList 의 마지막에 객체를 추가, 성공하면 true |
void add(int index, Object element) | 지정된 위치( index )에 객체를 저장 |
boolean addAll(Collection c) | 주어진 컬렉션의 모든 객체를 저장 |
boolean addAll(int index, Collection c) | 지정된 위치( index )부터 주어진 컬렉션의 모든 객체를 저장 |
void clear( ) | ArrayList 를 전부 비운다 |
Object clone( ) | ArrayList 를 복제 |
boolean contains(Object o) | 지정된 객체( o )가 ArrayList 에 포함되어 있는지 확인 |
void ensureCapacity(int minCapacity) | ArrayList 의 용량이 최소한 minCapacity 가 되도록 한다. 이미 ArrayList 의 용량이 minCapacity 보다 크다면 아무일도 일어나지 않는다. |
Object get(int index) | 지정된 위치( index )에 저장된 객체를 반환 |
int indexOf(Object o) | 지정된 객체가 저장된 위치를 찾아 반환 |
boolean isEmpty( ) | ArrayList 가 비어있는지 확인 |
Iterator iterator( ) | ArrayList 의 Iterator 객체를 반환 |
int lastIndexOf(Object o) | 객체( o )가 저장된 위치를 끝부터 역방향으로 검색해서 반환 |
ListIterator listIterator( ) | ArrayList 의 ListIterator 를 반환 |
ListIterator listIterator(int index) | ArrayList 의 지정된 위치부터 시작하는 ListIterator 를 반환 |
Object remove(int index) | 지정된 위치( index )에 있는 객체 제거 |
boolean remove(Object o) | 지정된 객체를 제거 성공하면 true , 실패하면 false 를 반환 |
boolean removeAll(Collection c) | 지정된 컬렉션에 저장된 것과 동일한 객체들을 ArrayList 에서 제거 |
Object set(int index, Object element) | 주어진 객체( element )를 지정된 위치( index )에 저장 |
int size( ) | ArrayList 에 저장된 객체의 개수 반환 |
void sort(Comparator c) | 지정된 정렬기준( c )으로 ArrayList 를 정렬 |
List subList(int fromIndex, int toIndex) | fromIndex 부터 toIndex 사이에 저장된 객체를 반환 |
Object[ ] toArray( ) | ArrayList 에 저장된 모든 객체들을 객체배열로 반환 |
Object[ ] toArray(Object[ ] a) | ArrayList 에 저장된 모든 객체들을 객체배열 a 에 담아 반환 |
void trimToSize( ) | 용량을 크기에 맞게 줄인다.(빈 공간을 없앤다.) |
package Example;
import java.util.*;
public class Example {
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
list1.add(new Integer(1));
list1.add(new Integer(4));
list1.add(new Integer(0));
list1.add(new Integer(3));
list1.add(new Integer(5));
list1.add(new Integer(2));
ArrayList list2 = new ArrayList(list1.subList(1, 4)); // 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에서 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();
}
}
ArrayList 의 메서드를 사용하는 예제이다. list2 에서 list1 과 공통되는 요소를 삭제할 때 i 를 증가시켜가면서 삭제하면 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리이동을 하기 때문에 올바른 결과를 얻을 수 없다. 그래서 i 를 감소시켜가면서 삭제를 해야 자리이동이 발생해도 영향을 받지 않고 작업이 가능하다.
package Example;
import java.util.*;
public class Example {
public static void main(String[] args) {
Vector v = new Vector(5); //용량(capacity)이 5인 Vector를 설정한다.
v.add("1");
v.add("2");
v.add("3");
print(v);
v.trimToSize(); //빈공간을 없앤다.(용량과 크기가 같아진다.)
System.out.println("=== After trimToSize( ) ===");
print(v);
v.ensureCapacity(6); // v의 capacity 최소한 6이되도록한다(이미 6이상이라면 아무일도 일어나지 X)
System.out.println("=== After ensureCapacity(6) ===");
print(v);
v.setSize(7); //capacity가 새로 설정한 사이즈보다 작다면 기존의 크기보다 2배의 크기로 증가된다(6 x 2)
System.out.println("=== After setSize(7) ===");
print(v);
v.clear(); // v의 모든 요소를 삭제한다(capacity는 변하지 X)
System.out.println("=== After clear() ===");
print(v);
}
public static void print(Vector v) {
System.out.println(v);
System.out.println("size : " + v.size());
System.out.println("capacity : " + v.capacity());
System.out.println();
}
}
위의 예제는 Vector 의 용량( capacity )과 크기( size )에 관한 예제이다. 배열은 크기를 변경할 수 없기 때문에 내부적으로는 새로운 배열이 생성되어 그 배열의 주소 값을 Vector 인스턴스가 가리키고 있다.(이전의 배열은 참조 변수가 없어서 가비지 컬렉터에 의해 제거됨) ArrayList 나 Vector 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만 용량을 변경해야 할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야 하기 때문에 상당히 효율이 떨어진다는 단점이 있다. 그래서 처음에 인스턴스를 생성할 때, 저장할 데이터의 개수를 잘 고려해서 충분한 용량의 인스턴스를 생성하는 것이 좋다.
'Back end > Java' 카테고리의 다른 글
[Java] 스택(Stack)과 큐(Queue) (1) | 2019.07.22 |
---|---|
[Java] 연결리스트(Linked List)와 이중 연결리스트(Doubly linked list), 이중 원형 연결리스트(Doubly circular linked list) (0) | 2019.07.19 |
[Java] 컬렉션 프레임워크(Collections Framework) (0) | 2019.07.17 |
[Java] java.math 패키지 - BigInteger클래스와 BigDecimal 클래스 (0) | 2019.07.17 |
[Java] java.util 패키지 - 정규식(Regular Expression)과 기타 클래스 (0) | 2019.07.16 |