초보 개발자의 스터디룸

[Java] ArrayList - 2(다양한 메서드 : subList, add, remove)

justdoIT0730 2022. 11. 28. 15:19
728x90
728x90

ArrayList에서 사용 가능한 메서드들에 대해 알아보자. 

 

2022.11.28 - [초보 개발자의 스터디룸] - [Java] ArrayList - 1(생성)

 

[Java] ArrayList - 1(생성)

ArrayList는 Object 배열을 이용해 데이터를 순차적으로 저장한다. 첫 번째로 저장한 객체는 Object배열의 0번째 위치에 저장되고 그 다음에 저장하는 객체는 1번째 위치에 저장된다. 배열에 더이상 저

justdoit0730.tistory.com

위에서 사용된 예제를 이용.

import java.util.*;

public class Q {
public static void main(String[] args) { 
    ArrayList list1 = new ArrayList(10); //1
    list1.add(5);
    list1.add(4);
    list1.add(2);
    list1.add(0);
    list1.add(1);
    list1.add(3);

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

    Collections.sort(list1);							//2
    Collections.sort(list2);
    print(list1, list2);

    System.out.println("list1.containAll(list2) : "+ list1.containsAll(list2));	//3
    list2.add("B");
    list2.add("C");	
    list2.add(3,"A");								//4
    print(list1, list2);

    list2.set(3, "AA");								//5
    print(list1, list2);

    System.out.println("list1.retainAll(list2) : " +list1.retainAll(list2));	//6
    print(list1, list2);

    for(int i=list2.size()-1; i>=0; i--) {
        if(list1.contains(list2.get(i))) {
            list2.remove(i);							//7
        }
    }
    print(list1, list2);
}

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

 

//1 : subList

List<E> subList(int fromIndex, int toIndex);

fromIndex부터 toIndex 사이에 저장된 객체를 반환

예시)를 통해 알아보자

//예시)
ArrayList list1 = new ArrayList(10);
    list1.add(5);
    list1.add(4);
    list1.add(2);
    list1.add(0);
    list1.add(1);
    list1.add(3);
ArrayList list2 = new ArrayList(list1.subList(2, 5));

System.out.println(list1);
System.out.println(list2);

//⦿ add, remove

list2.add(100);
list2.remove(0);

System.out.println(list1);
System.out.println(list2);

✓ list1 출력 결과 : [5, 4, 2, 0, 1, 3]

✓ list2 출력 결과 : [2, 0, 1]

 

// ⦿ add, remove 이후 : add(//1.1) remove(//1.2) 본문 하단에서 추가적으로 확인!

 

✓ list1 출력 결과 : [5, 4, 2, 0, 1, 3]

✓ list2 출력 결과 : [0, 1, 100]

즉 index 상 2번째 부터 5번째 전인 4번째까지 저장된다.

 

출처 : https://kevinntech.tistory.com/16, 자바의 정석

 전 포스팅에서 확일할 수 있듯이 ArrayList는 List 인터페이스 내 구현 클래스 중 하나이다.

ArrayList 클래스 내 list1에서 subList를 사용해 list2를 저장할 경우 상호 간 영향을 주지 않는다.

하지만 List 인터페이스로 list1을 만들어 subList를 사용해 list2를 저장할 경우 상호 간 영향을 미친다.

 

728x90

 

 List 인터페이스를 이용해 다시 출력해보자.

//예시)
List<Integer> sub1 = new ArrayList<Integer>();
    sub1.add(5);
    sub1.add(4);
    sub1.add(2);
    sub1.add(0);
    sub1.add(1);
    sub1.add(3);
List<Integer> sub2 = sub1.subList(2, 5);

System.out.println(sub1);
System.out.println(sub2);

//⦿ add, remove

sub2.add(100); 
sub2.remove(0);

System.out.println(sub1);
System.out.println(sub2);

//⦿ sub1 수정

sub1.add(0);
System.out.println(sub1);
System.out.println(sub2);

✓ sub1 출력 결과 : [5, 4, 2, 0, 1, 3]

✓ sub2 출력 결과 : [2, 0, 1]

 

// ⦿ add, remove 이후

 

✓ sub1 출력 결과 : [5, 4, 2, 0, 100, 3]

✓ sub2 출력 결과 : [0, 1, 100]

 

//⦿ sub1 수정 이후

 

✓ sub1 출력 결과 : [5, 4, 2, 0, 100, 3, 0]

✓ sub2 출력 결과 : Exception in thread "main" java.util.ConcurrentModificationException : 오류

 

 위 결과와 다르게 sub1의 정보가 수정되었다. 

즉, List 인터페이스에서 subList 메서드를 사용하게되면 참조 받던 sub2가 수정시 sub1도 함께 수정된다.

또한, sub1로부터 subList로 참조 받던 sub2는 sub1이 수정 시 오류가 출력되는 것을 알 수 있다.

 

//1.1 및 //4  : add

void add(int index, Object element);

지정된 위치(index)에 객체를 저장

 

 위에 저장된 list1에 add 메서드를 이용해 값을 추가시켜보자.

예시)를 통해 알아보자

list1.add(1,"test");
System.out.println(list1);
list1.add(9);
System.out.println(list1);

//⦿ addAll vs add

list1.addAll(list2);
System.out.println(list1);

✓ sub1 출력 결과 : [5, test, 4, 2, 0, 1, 3]

✓ sub1 출력 결과 : [5, test, 4, 2, 0, 1, 3, 9]

  index를 선언하지 않으면 마지막에 추가

  index 선언 시 index 위치에 element가 삽입

 

//⦿ addAll vs add 이후

 

✓ sub1 출력 결과 : [5, test, 4, 2, 0, 1, 3, 9, 0, 1, 100]

 

  만약 list1.add(list2);로 설정한다면

✓ sub1 출력 결과 : [5, test, 4, 2, 0, 1, 3, 9, [0, 1, 100]]

 

 

728x90

//1.2 및 //7 : remove

ArrayList list1 = new ArrayList(10);
    list1.add(5);
    list1.add(4);
    list1.add(2);
    list1.add(0);
    list1.add(1);
    list1.add(3);

ArrayList list2 = new ArrayList(10);
    list2.add(4);
    list2.add(2);

//⦿ removeAll vs remove
list1.removeAll(list2);

//⦿ removeAll vs remove 이후 

✓ sub1 출력 결과 : [5, 0, 1, 3]

 

만약 list1.remove(1); 으로 설정한다면

✓ sub1 출력 결과 : [5, 2, 0, 1, 3]

728x90
728x90