공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

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 를 증가시켜가면서 삭제하면 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리이동을 하기 때문에 올바른 결과를 얻을 수 없다. 그래서  를 감소시켜가면서 삭제를 해야 자리이동이 발생해도 영향을 받지 않고 작업이 가능하다. 

 

 

 

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 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만 용량을 변경해야 할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야 하기 때문에 상당히 효율이 떨어진다는 단점이 있다. 그래서 처음에 인스턴스를 생성할 때, 저장할 데이터의 개수를 잘 고려해서 충분한 용량의 인스턴스를 생성하는 것이 좋다.

 

 

 

+ Recent posts