Java

[Java] ArrayList

신소금 2022. 2. 23. 19:09

programmers 12910을 풀 때 사용된 ArrayList에 대해 조사 후 정리해보았다.

 

1. ArrayList 생성

 

자바에서 ArrayList를 사용하려면 아래와 같은 구문을 추가해야 한다.

import java.util.ArrayList;

 

그 다음, ArrayList를 생성한다.

생성할 때는 아래와 같은 방법을 사용할 수 있다.

List<Integer> list1 = new ArrayList<Integer>();		// 타입 지정
List<Integer> list2 = new ArrayList<>();		// 타입 생략
List<Integer> list3 = new ArrayList<>(10);		// 초기 용량(capacity) 생성
List<Integer> list4 = new ArrayList<>(list1);		// 다른 list 값으로 초기화
List<Integer> list5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

 

보통은 new ArrayList<>()를 사용하여 타입을 생략한다.

 

Arrays.asList()를 사용하면 기본 값들로 ArrayList를 생성할 수 있다.

Arrays.asList()는 배열의 내용을 수정하려고 할 때, Array를 List로 바꾸어 편리하게 사용하기 위한 것이다.

asList()를 사용하여 내용을 수정하면 원본 Array도 함께 변경된다.

asList()를 사용하여 만든 List에 새로운 원소를 추가/삭제는 불가능하다.

 

역으로, List를 Array로 바꾸는 방법은 아래와 같다.

List<Integer> list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
int[] arr = arrayList.toArray(list);

 

 

 

2. ArrayList 원소 추가/변경

 

ArrayList를 생성한 후 add() 메소드를 사용하여 원소를 추가할 수 있다.

또한, set() 메소드로 기존의 원소를 변경할 수도 있다.

 

예시

import java.util.ArrayList;

public class ArrayListTest {		// class 이름을 ArrayList로 설정하면 에러가 난다. 주의!!
	public static void main(String[] args) {
    	ArrayList<String> fruits = new ArrayList();
		
        // add() method 사용하여 원소 추가
        fruits.add("orange");
        fruits.add("strawberry");
        fruits.add(0, "cherry");	// index 0번째에 cherry 추가
        fruits.add("apple");
        
        // set() method 사용하여 원소 변경
        fruits.set(1, "kiwi");		// index 1번째 원소를 kiwi로 수정
        
        System.out.println(fruits);
    }
}

 

실행 결과

[cherry, kiwi, strawberry, apple]

 

0번째 index에 cherry가 추가되었고, 1번째 index가 orange에서 kiwi로 변경된 것을 확인할 수 있다.

 

 

 

3. ArrayList 원소 삭제

 

원소를 삭제할 때는 remove() 메소드를 사용한다.

()안에 index 번호 또는 원소를 적어 지정된 값을 삭제할 수도 있다.

모든 원소를 삭제할 때는 clear() 메소드를 사용한다.

 

예시

package java220222;

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListRemove {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>(Arrays.asList("cherry", "kiwi", "strawberry", "apple"));
        String removedFruit = fruits.remove(0);		// 0번째 index의 원소 삭제
        System.out.println(removedFruit + " is removed.");

        fruits.remove("kiwi");				// "kiwi" 삭제
        System.out.println(fruits);

        fruits.clear();					// 모든 원소 삭제 
        System.out.println(fruits);
    }
}

 

실행 결과

cherry is removed.
[strawberry, apple]
[]

 

String removedFruit = fruits.remove(0); 과 같이, index를 사용해 삭제하는 경우 삭제되는 원소를 리턴받을 수 있다.

따라서 0번째 index의 값을 지움과 동시에 해당 값을 removedFruit에 받아서 사용하였다.

 

 

4. ArrayList 전체 값 확인

 

예시

네 가지 방법으로 ArrayList의 전체 값을 출력할 수 있다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;

public class ArrayListLoop {
	public static void main(String[] args) {
		ArrayList<String> fruits = new ArrayList<>(Arrays.asList("Cherry", "Orange", "Apple", "Kiwi"));
		
		// for-each loop
		for(String fruit : fruits) {
			System.out.print(fruit + " ");
		}
		System.out.println();
		
		// for loop
		for(int i=0; i<fruits.size(); i++) {
			System.out.print(fruits.get(i) + " ");
		}
		System.out.println();
		
		// iterator
		Iterator<String> iterator = fruits.iterator();
		while(iterator.hasNext()) {
			System.out.print(iterator.next() + " ");
		}
		System.out.println();
		
		// listIterator
		ListIterator<String> listIterator = fruits.listIterator(fruits.size());
		while (listIterator.hasPrevious()) {
			System.out.print(listIterator.previous() + " ");
		}
		System.out.println();
	}
}

 

get() method를 사용하면 각 index의 값을 순차적으로 탐색할 수 있다.

listIterator를 사용할 경우, 생성 시 ArrayList의 크기를 입력해준 후 역방향으로 출력할 수 있다.

 

실행 결과

Cherry Orange Apple Kiwi 
Cherry Orange Apple Kiwi 
Cherry Orange Apple Kiwi 
Kiwi Apple Orange Cherry

 

 

5. 값 유무 확인

 

ArrayList의 안에 값이 존재하는지 확인할 때는 constains()를 사용한다.

값이 존재할 때, 어느 위치에 존재하는지 확인할 때는 indexOf()를 사용한다.

 

예시

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListContain {
	public static void main(String[] args) {
		ArrayList<String> fruits = new ArrayList<>(Arrays.asList("Cherry", "Orange", "Apple", "Kiwi"));
		boolean contains = fruits.contains("Orange");	// 값이 존재하면 true, 존재하지 않으면 false를 리턴
		System.out.println(contains); 
		
		int index = fruits.indexOf("Orange");		// 값이 존재하는 경우 
		System.out.println(index);
		
		index = fruits.indexOf("Banana");		// 값이 존재하지 않는 경우 
		System.out.println(index);
	}
}

 

실행 결과

true		// "Orange"가 존재
1		// "Orange"의 index
-1		// "Banana"가 존재하지 않으므로 -1

 

contains()를 사용하면 값이 존재하는 경우에는 true를, 존재하지 않는 경우에는 false를 리턴한다.

indexOf()를 사용하면 해당 원소의 index를 리턴한다. 존재하지 않는 원소일 경우에는 -1을 리턴한다.

 

 

참고 자료

https://psychoria.tistory.com/765