[Java/자바] ArrayList 클래스 사용법

ArrayList

ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 가집니다.

Object배열을 이용해 데이터를 순차적으로 index는 0부터 시작하고 그 다음은 1,2,3 ~ 으로 저장됩니다.

만약 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장됩니다.

또한 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있습니다.

 

ArrayList 선언
import java.util.ArrayList;

ArrayList<타입> arraylist1 = new ArrayList<>();
ArrayList<타입> arraylist2 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
ArrayList<타입> arraylist3 = new ArrayList<>(arraylist2); // 다른 Collection값으로 초기화
ArrayList<Integer> arraylist4 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // 기본값 생성

선언은 위처럼 하지만 위처럼 ArrayList 클래스 타입을 이용해 선언하게 되면

나중에 데이터의 용도가 바껴 삽입과 삭제가 유리한 LinkedList 클래스로 변경을 해야할 때 ArrayList로 선언된 모든부분을 LinkedList로 바꿔야한다는 불편함이 있습니다.

 

그렇기 때문에 ArrayList와 LinkedList는 List 인터페이스로 구현한 구현체로,

List 클래스 타입으로 업캐스팅해 선언한다면

List에서 제공하는 메소드까지 사용할 수 있으며 좀더 유연한 구조로 미리 설계할 수 있습니다.

 

선언 방식은 클래스 타입만 List로 바꾸면 됩니다.

import java.util.List;
import java.util.ArrayList;

List<타입> arraylist1 = new ArrayList<>();
List<타입> arraylist2 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
List<타입> arraylist3 = new ArrayList<>(arraylist2); // 다른 Collection값으로 초기화
List<Integer> arraylist4 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // 기본값 생성

 

 


ArrayList 메서드

 

메서드 반환 타입 설 명
add() boolean ArrayList의 마지막에 객체를 추가.
add(int i, Object element) void 지정된 위치(i)에 객체를 추가.
addAll(Collection c) boolean 주어진 컬렉션의 모든 객체를 저장
addAll(int i, Collection c) boolean 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장
clear() void ArrayList를 완전히 비운다.
clone() Object ArrayList를 복제
contains(Object o) boolean 지정된 객체(o)가 ArrayList에 포함되어 있는지 확인
containsAll(Collection c)
boolean ArrayList가 주어진 c의 모든 객체를 가지고 있는지 확인
ensureCapacity(int minCapacity) void ArrayList의 용량이 최소한 minCapacity가 되도록 한다.
get(int i) Object 지정된 위치(i)에 저장된 객체를 반환
indexOf(Object o) int 지정된 객체가 저장된 위치를 반환
isEmpty() boolean ArrayList가 비어있는지 확인
iterator() lterator ArrayList의 lterator 객체를 반환
lastIndexOf(Object o) int 객체(o)가 저장된 위치를 끝부터 역방향으로 검색해서 반환
listlterator() Listlterator ArrayList의 Listlterator를 반환
listlterator(int i) Listlterator ArrayList의 지정된 위치부터 시작하는 Listlterator를 반환
remove(int i) Object 지정된 위치(i)에 있는 객체를 제거
remove(Object o) boolean 지정된 객체를 제거
removeAll(Collection c) boolean 지정된 컬렉션에 저장된 것과 동일한 객체들을 ArrayList에서 제거
retainAll(Collection c) boolean ArrayList에 저장된 객체 중 주어진 컬렉션과 공통된 것만을 남기고 남머지 삭제
set(int i, Object element) Object 주어진 객체(element)를 지정된 위치(i)에 저장 또는 변경
size() int ArrayList에 저장된 객체의 개수를반환
sort(Collection c) void 지정된 정렬기준(c)로 ArrayList 정렬
subList(int start, int end) List start부터 end사이에 저장된 객체를 반환
toArray() Object[] ArrayList에 저장된 모든 객체들을 객체배열로 반환
toArray(Object[] a) Object[] ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환
trimToSize() void 용량을 크기에 맞게 줄인다 (빈 공간을 없앤다)

 


예제

 

값 추가, 정렬, 변경, 삭제
import java.util.*;

class ArrayListEx1{
	public static void main(String[] args) {
		ArrayList list1 = new ArrayList(10);
		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));

		ArrayList list2 = new ArrayList(list1.subList(1,4)); 
		print(list1, list2);

		System.out.println(" 정렬 후 ");
		// Collections 클래스를 이용해 정렬
		Collections.sort(list1);	// list1과 list2를 정렬한다.
		Collections.sort(list2);
		print(list1, list2);

		System.out.println("list1.containsAll(list2):" + list1.containsAll(list2));

		System.out.println(" .add() 로 추가 ");
		list2.add("B");
		list2.add("C");
		list2.add(3, "A");
		print(list1, list2);

		System.out.println(" .set() 으로 변경 ");
		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);
//		}
		
		// list1과 겹치는 모든 값들을 list2에서 제거
		System.out.println("list2.removeAll(list1):" + list2.removeAll(list1));
		list2.removeAll(list1);
		print(list1, list2);
	} 

	static void print(ArrayList list1, ArrayList list2) {
		System.out.println("list1:"+list1);
		System.out.println("list2:"+list2);
		System.out.println();		
	}
}

 

지정된 문자를 원하는 길이만큼 잘라 list 배열에 추가
import java.util.*; 

class ArrayListEx2 { 
	public static void main(String[] args) { 
		final int LIMIT = 10;	// 자르고자 하는 글자의 개수를 지정.
		String source = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ"; 
		int length = source.length(); 

		List list = new ArrayList(length/LIMIT + 10); // 크기를 약간 여유 있게 잡는다.

		for(int i=0; i < length; i+=LIMIT) { 
			if(i+LIMIT < length ) {
				// 10개씩 자른다.
				list.add(source.substring(i, i+LIMIT)); 
			} else 
				list.add(source.substring(i)); 
		} 

		for(int i=0; i < list.size(); i++) { 
			System.out.println(list.get(i)); 
		} 
	}
}

 


참고자료
자바의 정석3