본문 바로가기
Language/Java

[Java 봐 | 자료구조] 리스트 中 ArrayList

by ㅇ달빛천사ㅇ 2024. 6. 7.
728x90

리스트 vs 배열

  • 배열은 크기가 정해져 있지만 리스트는 크기가 변한다.

자료형의 개수가 계속 변하는 경우, 리스트를 사용한다.


리스트 자료형

  • ArrayList
  • Vector
  • LinkedList
    등...

ArrayList

리스트 자료형에서 가장 일반적으로 사용하는 자료형

import

import java.util.ArrayList;

생성

ArrayList 객체명 = new ArrayList();

기본 크기가 10인 배열 생성
자료형을 선언해 주지 않으면, 자료형에 관계 없이 값 삽입 가능


import java.util.ArrayList;

public class arraylist {
    public static void main(String args[]) {

        ArrayList arraylist = new ArrayList();
        arraylist.add(1);
        arraylist.add("1");
        arraylist.add('a');
        arraylist.add(1.1);
        arraylist.add(null);

        System.out.println(arraylist);

    }
}
Output
  [1, 1, a, 1.1, null]

ArrayList의 원소로 자료형에 관계없이 삽입 가능한 것을 확인
null도 삽입 가능



ArrayList 객체명 = new ArrayList(기본크기);

기본 크기를 지정
(배열이 다 차면 기본크기만큼 사이즈가 증가함)



ArrayList<제네릭> 객체명 = new ArrayList<>();

배열 값의 자료형을 지정
(자바 J2SE 5.0 버전부터 객체를 포함하는 자료형을 명확하게 표현할 것을 권고하고 있다.👍)


  • 제네릭(Generic)
    • 컬렉션 객체를 생성할 때 저장되는 데이터의 타입을 미리 지정하는 기능
    • 제네릭으로 지정한 타입 외에는 담길 수 없도록 함
import java.util.ArrayList;

public class arraylist {
    public static void main(String args[]) {
        ArrayList<String> arraylist = new ArrayList<>();

        arraylist.add("1");
        arraylist.add(null);

        System.out.println(arraylist);
    }
}
Output
  [1, null]

지정한 자료형 혹은 null만 삽입 가능


추가

  • void add(int index, Ojbect o)

    index매개변수는 생략가능
    index 매개변수를 주면 해당 인덱스로 값 삽입


    import java.util.ArrayList;
    
    public class arraylist {
        public static void main(String args[]) {
    
    ArrayList<String> arraylist = new ArrayList<>();
    
    arraylist.add("1");
    arraylist.add("4");
    arraylist.add("0");
    
    System.out.println(arraylist);
    
    arraylist.add(1, "idx1");
    System.out.println("1번 인덱스에 idx1가 들어왔을까? " + arraylist);
    
        }
    }
    Output
      [1, 4, 0]
      1번 인덱스에 idx1가 들어왔을까? [1, idx1, 4, 0]


  • boolean addAll(배열)

    두 컬렉션을 합침


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
            ArrayList<String> arrList1 = new ArrayList<>();
    
            arrList1.add("a");
            arrList1.add("4");
            arrList1.add("0");
    
            ArrayList<String> arrList2 = new ArrayList<>();
    
            arrList2.add("1");
            arrList2.add("apple");
            arrList2.add("banana");
    
            System.out.println("arrList1 = " + arrList1);
            System.out.println("arrList2 = " + arrList2);
    
            System.out.println("arrList1.addAll(arrList2) = " + arrList1.addAll(arrList2));
            System.out.println("arrList1 = " + arrList1);
        }
    }
    Output
       arrList1 = [a, 4, 0]
       arrList2 = [1, apple, banana]
       arrList1.addAll(arrList2) = true
       arrList1 = [a, 4, 0, 1, apple, banana]


추출

  • Object get(int index)

    ArrayList에서 index의 값을 반환


    import java.util.ArrayList;
    
    public class arraylist {
        public static void main(String args[]) {
    
          ArrayList<String> arraylist = new ArrayList<>();
    
          arraylist.add("1");
          arraylist.add("a");
          arraylist.add("앙");
          arraylist.add("!");
          arraylist.add("-1");
    
          System.out.println("arraylist = " + arraylist);
          System.out.println("arraylist.get(2) = " + arraylist.get(2));
    
        }
    }
    Output
      arraylist = [1, a, 앙, !, -1]
      arraylist.get(2) = 앙

  • int indexOf(VALUE)

    배열에 VALUE가 존재하면 해당 값의 첫번째 index를 반환
    배열에 VALUE가 존재하지 않으면 -1을 반환


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
    
          ArrayList<Integer> arrList = new ArrayList<>();
    
          arrList.add(1);
          arrList.add(0);
          arrList.add(2);
          arrList.add(10);
          arrList.add(-5);
          arrList.add(123);
    
          System.out.println("arrList = " + arrList);
    
          System.out.println("arrList.indexOf(1) = " + arrList.indexOf(1));
          System.out.println("arrList.indexOf(10) = " + arrList.indexOf(10));
          System.out.println("arrList.indexOf(-1) = " + arrList.indexOf(-1));
        }
    }
    Output
      arrList = [1, 0, 2, 10, -5, 123]
      arrList.indexOf(1) = 0
      arrList.indexOf(10) = 3
      arrList.indexOf(-1) = -1

  • int lastIndexOf(VALUE)

    배열에 VALUE가 존재하면 해당 값의 마지막 index를 반환
    배열에 VALUE가 존재하지 않으면 -1을 반환


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
    
          ArrayList<Integer> arrList = new ArrayList<>();
    
          arrList.add(1);
          arrList.add(0);
          arrList.add(2);
          arrList.add(10);
          arrList.add(-5);
          arrList.add(0);
          arrList.add(123);
    
          System.out.println("arrList = " + arrList);
    
          System.out.println("arrList.lastIndexOf(0) = " + arrList.lastIndexOf(0));
          System.out.println("arrList.lastIndexOf(10) = " + arrList.lastIndexOf(10));
          System.out.println("arrList.lastIndexOf(-1) = " + arrList.lastIndexOf(-1));
        }
    }
    Output
      arrList = [1, 0, 2, 10, -5, 0, 123]
      arrList.lastIndexOf(0) = 5
      arrList.lastIndexOf(10) = 3
      arrList.lastIndexOf(-1) = -1

크기

  • int size()

    ArrayList의 요소의 개수를 반환


    import java.util.ArrayList;
    
    public class arraylist {
        public static void main(String args[]) {
    
            ArrayList<String> arraylist = new ArrayList<>();
    
            arraylist.add("1");
            arraylist.add("a");
            arraylist.add("앙");
            arraylist.add("!");
            arraylist.add("-1");
    
            System.out.println("arraylist = " + arraylist);
            System.out.println("arraylist.size() = " + arraylist.size());
    
        }
    }
    Output
      arraylist = [1, a, 앙, !, -1]
      arraylist.size() = 5


요소 포함 여부

  • boolean contains()

    리스트 안에 해당 항목이 있는지 판별해 그 결과를 boolean으로 반환

    • 자료형이 다른(String, char, int) 1의 포함 여부를 contains()메서드를 통해 알아보자.

      import java.util.ArrayList;
        
      public class arraylist {
          public static void main(String args[]) {
      
          ArrayList<String> arraylist = new ArrayList<>();
      
          arraylist.add("1");
          arraylist.add("a");
          arraylist.add("앙");
          arraylist.add("!");
          arraylist.add("-1");
      
          System.out.println("arraylist = " + arraylist);
          System.out.println("arraylist.contains(\"1\") = " + arraylist.contains("1"));
          System.out.println("arraylist.contains('1') = " + arraylist.contains('1'));
          System.out.println("arraylist.contains(1) = " + arraylist.contains(1));
      
      	}
      }
      Output
      arraylist = [1, a, 앙, !, -1]
      arraylist.contains("1") = true
      arraylist.contains('1') = false
      arraylist.contains(1) = false
      

      contains()메서드는 자료형과 값까지 일치하는 요소를 포함하는지 체크 함.


  • boolean containsAll(v1, v2, ...)

    배열에 매개변수의 모든 값이 포함되어 있으면 true 반환
    배열에 매개변수의 모든 값이 포함되어 있지 않으면 false 반환


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
    
          ArrayList<Integer> arrList1 = new ArrayList<>();
    
          arrList1.add(1);
          arrList1.add(0);
          arrList1.add(2);
          arrList1.add(10);
          arrList1.add(-5);
          arrList1.add(123);
    
          ArrayList<Integer> arrList2 = new ArrayList<>();
    
          arrList2.add(10);
          arrList2.add(0);
    
          System.out.println("arrList1 = " + arrList1);
          System.out.println("arrList2 = " + arrList2);
    
          System.out.println("arrList1.containsAll(arrList2) = " + arrList1.containsAll(arrList2));
    
          arrList2.add(369);
          arrList2.add(-55);
          System.out.println("arrList2 = " + arrList2);
          System.out.println("arrList1.containsAll(arrList2) = " + arrList1.containsAll(arrList2));
        }
    }
    Output
      arrList1 = [1, 0, 2, 10, -5, 123]
      arrList2 = [10, 0]
      arrList1.containsAll(arrList2) = true
      arrList2 = [10, 0, 369, -55]
      arrList1.containsAll(arrList2) = false

삭제

  • boolean remove(Object o)

    리스트에서 값이 o인 요소를 삭제 후,
    그 결과를 true 또는 false로 반환


    import java.util.ArrayList;
    
    public class arraylist {
        public static void main(String args[]) {
    
            ArrayList<String> arraylist = new ArrayList<>();
    
            arraylist.add("1");
            arraylist.add("a");
            arraylist.add("앙");
            arraylist.add("!");
            arraylist.add("-1");
    
            System.out.println("arraylist = " + arraylist);
            System.out.println("arraylist.remove(\"!\") = " + arraylist.remove("!"));
            System.out.println("arraylist = " + arraylist);
            System.out.println("arraylist.remove(\"d\") = " + arraylist.remove("d"));
            System.out.println("arraylist = " + arraylist);
    
        }
    }
    Output
      arraylist = [1, a, 앙, !, -1]
      arraylist.remove("!") = true
      arraylist = [1, a, 앙, -1]
      arraylist.remove("d") = false
      arraylist = [1, a, 앙, -1]

    • ArrayList에 같은 요소가 여러개있으면 어떻게 삭제될까?

      import java.util.ArrayList;
      
      public class arraylist {
          public static void main(String args[]) {
      
              ArrayList<String> arraylist = new ArrayList<>();
      
              arraylist.add("1");
              arraylist.add("a");
              arraylist.add("앙");
              arraylist.add("1");
              arraylist.add("!");
              arraylist.add("1");
      
              System.out.println("arraylist = " + arraylist);
              System.out.println("arraylist.remove(\"1\") = " + arraylist.remove("1"));
              System.out.println("arraylist = " + arraylist);
              System.out.println("arraylist.remove(\"1\") = " + arraylist.remove("1"));
              System.out.println("arraylist = " + arraylist);
      
          }
      }
      Output
        arraylist = [1, a, 앙, 1, !, 1]
        arraylist.remove("1") = true
        arraylist = [a, 앙, 1, !, 1]
        arraylist.remove("1") = true
        arraylist = [a, 앙, !, 1]

      인덱스가 작은 요소부터 삭제가 되는 것을 확인할 수 있다.



  • Object remove(int index)

    리스트에서 인덱스가 index인 요소를 삭제 후, 그 요소를 반환
    ArrayList의 인덱스 범위를 넘어선 index를 매개변수로 주면 IndexOutOfBoundsException 발생


    import java.util.ArrayList;
    
    public class arraylist {
      public static void main(String args[]) {
    
          ArrayList<String> arraylist = new ArrayList<>();
    
          arraylist.add("1");
          arraylist.add("a");
          arraylist.add("앙");
          arraylist.add("!");
          arraylist.add("-1");
    
          System.out.println("arraylist = " + arraylist);
          System.out.println("arraylist.remove(0) = " + arraylist.remove(0));
          System.out.println("arraylist = " + arraylist);
          System.out.println("arraylist.remove(\"d\") = " + arraylist.remove(-1));
          System.out.println("arraylist = " + arraylist);
    
      }
    }
    Output
      arraylist = [1, a, 앙, !, -1]
      arraylist.remove(0) = 1
      arraylist = [a, 앙, !, -1]
    
      Exception in thread "main" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 4
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
        at java.base/java.util.Objects.checkIndex(Objects.java:385)
        at java.base/java.util.ArrayList.remove(ArrayList.java:551)
        at arraylist.main(arraylist.java:17)

    • ArrayList로 생성한 ArrayList는 remove(int index)로 삭제시, 요소로 삭제될까? index로 삭제될까?

      import java.util.ArrayList;
      
      public class arraylist {
          public static void main(String args[]) {
      
              ArrayList<Integer> arraylist = new ArrayList<>();
      
              arraylist.add(1);
              arraylist.add(0);
              arraylist.add(2);
              arraylist.add(10);
              arraylist.add(-5);
              arraylist.add(123);
      
              System.out.println("arraylist = " + arraylist);
              System.out.println("arraylist.remove(1) = " + arraylist.remove(1));
              System.out.println("arraylist = " + arraylist);
              System.out.println("arraylist.remove(0) = " + arraylist.remove(0));
              System.out.println("arraylist = " + arraylist);
      
          }
      }
      Output
      arraylist = [1, 0, 2, 10, -5, 123]
      arraylist.remove(1) = 0
      arraylist = [1, 2, 10, -5, 123]
      arraylist.remove(0) = 1
      arraylist = [2, 10, -5, 123]

      remove()메서드의 매개변수를 인덱스가 아닌 요소로 보고 삭제를 한 것을 확인할 수 있다.


  • boolean retainAll(배열)'

    매개변수로 준 배열의 원소와 일치하는 값을 제외한 모든 값을 삭제


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
    
            ArrayList<Integer> arrList1 = new ArrayList<>();
    
            arrList1.add(1);
            arrList1.add(0);
            arrList1.add(2);
            arrList1.add(10);
            arrList1.add(-5);
            arrList1.add(123);
    
            ArrayList<Integer> arrList2 = new ArrayList<>();
    
            arrList2.add(3);
            arrList2.add(10);
            arrList2.add(5);
            arrList2.add(-1);
            arrList2.add(100);
            arrList2.add(0);
    
            System.out.println("arrList1 = " + arrList1);
            System.out.println("arrList2 = " + arrList2);
    
            System.out.println("arrList1.retainAll(arrList2) = " + arrList1.retainAll(arrList2));
            System.out.println("arrList1 = " + arrList1);
    
       System.out.println("arrList1.retainAll(arrList2) = " + arrList1.retainAll(arrList2));
            System.out.println("arrList1 = " + arrList1);
        }
    }
    Output
      arrList1 = [1, 0, 2, 10, -5, 123]
      arrList2 = [3, 10, 5, -1, 100, 0]
      arrList1.retainAll(arrList2) = true
      arrList1 = [0, 10]
      arrList1.retainAll(arrList2) = false
      arrList1 = [0, 10]

  • boolean removeAll(배열)

    매개변수로 준 배열의 원소와 일치하는 값을 모두 삭제
    삭제할 값이 있으면 true, 삭제할 값이 없으면 false를 반환
    retainAll()메서드와 반대


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
    
            ArrayList<Integer> arrList1 = new ArrayList<>();
    
            arrList1.add(1);
            arrList1.add(0);
            arrList1.add(2);
            arrList1.add(10);
            arrList1.add(-5);
            arrList1.add(123);
    
            ArrayList<Integer> arrList2 = new ArrayList<>();
    
            arrList2.add(3);
            arrList2.add(10);
            arrList2.add(5);
            arrList2.add(-1);
            arrList2.add(100);
            arrList2.add(0);
    
            System.out.println("arrList1 = " + arrList1);
            System.out.println("arrList2 = " + arrList2);
    
            System.out.println("arrList1.removeAll(arrList2) = " + arrList1.removeAll(arrList2));
            System.out.println("arrList1 = " + arrList1);
    
            System.out.println("arrList1.removeAll(arrList2) = " + arrList1.removeAll(arrList2));
            System.out.println("arrList1 = " + arrList1);
        }
    }
    Output
      arrList1 = [1, 0, 2, 10, -5, 123]
      arrList2 = [3, 10, 5, -1, 100, 0]
      arrList1.removeAll(arrList2) = true
      arrList1 = [1, 2, -5, 123]
      arrList1.removeAll(arrList2) = false
      arrList1 = [1, 2, -5, 123]

  • void clear()

    배열의 값을 모두 삭제


    import java.util.ArrayList;
    
    public class arrayList {
        public static void main(String args[]) {
    
            ArrayList<Integer> arrList = new ArrayList<>();
    
            arrList.add(1);
            arrList.add(0);
            arrList.add(2);
            arrList.add(10);
    
            System.out.println("arrList = " + arrList);
            arrList.clear();
            System.out.println("clear()메서드 사용 후, arrList = " + arrList);
        }
    }
    Output
      arrList = [1, 0, 2, 10]
      clear()메서드 사용 후, arrList = []

형 변환(Type Casting)

배열 to ArrayList

  • Arrays.asList(배열)

    import java.util.ArrayList;
    import java.util.Arrays;
    
        public class arraylist {
            public static void main(String args[]) {
                Integer[] intArr = {1, 3, 0, 10};
                ArrayList<Integer> arraylist = new ArrayList<>(Arrays.asList(intArr));
    
                System.out.println("arraylist = " + arraylist);
        }
    }
    Output
      arraylist = [1, 3, 0, 10]

    ※ 위의 매개변수에는 int[]형을 넣으면 에러 발생


    매개변수에 직접 요소를 넣어서 ArrayList를 만들 수도 있다.

    import java.util.ArrayList;
    import java.util.Arrays;
    
        public class arraylist {
            public static void main(String args[]) {
                ArrayList<Integer> arraylist = new ArrayList<>(Arrays.asList(1, 3, 0, 10));
    
                System.out.println("arraylist = " + arraylist);
        }
    }
    Output
    arraylist = [1, 3, 0, 10]


ArrayList to 배열

  • toArray()

    ArrayList 타입의 인스턴스를 일반 배열 타입으로 반환
    저장할 배열 타입에 맞춰 자동 형변환
    배열 크기 또한 자동으로 맞춰서 바꿔줌


    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class arrayList {
        public static void main(String args[]) {
    
            ArrayList<String> arrList = new ArrayList<>();
    
            arrList.add("1");
            arrList.add("0");
            arrList.add("2");
            arrList.add("10");
    
            System.out.println("arrList = " + arrList);
    
            String[] strArr = new String[0];
            System.out.println("strArr = " + Arrays.toString(arrList.toArray(strArr)));
        }
    }
    Output
      arrList = [1, 0, 2, 10]
      strArr = [1, 0, 2, 10]


ArrayList to String

  • String String.join(String s, ArrayList arraylist)

    첫번째 매개변수는 구분자
    두번째 매개변수는 리스트 객체
    리스트의 각 요소에 구분자를 넣어 하나의 문자열로 만들어 반환


    import java.util.ArrayList;
    
    public class arraylist {
        public static void main(String args[]) {
            ArrayList<String> arraylist = new ArrayList<>();
            arraylist.add("H");
            arraylist.add("A");
            arraylist.add("P");
            arraylist.add("P");
            arraylist.add("Y");
    
            System.out.println("String.join(\",\", arraylist) = " + String.join("+",arraylist));
        }
    }
    Output
      String.join(",", arraylist) = H+A+P+P+Y


정렬

sort()메서드를 사용 (Java8 버전부터 사용 가능)

  • 오름차순(순방향) 정렬
    Comparator.naturalOrder()

    import java.util.ArrayList;
    import java.util.Comparator;
    
    public class arraylist {
        public static void main(String args[]) {
            ArrayList<String> arraylist = new ArrayList<>();
            arraylist.add("Hello");
            arraylist.add("Apple");
            arraylist.add("People");
            arraylist.add("Pocket");
            arraylist.add("Yellow");
    
            arraylist.sort(Comparator.naturalOrder());
            System.out.println("arraylist = " + arraylist);
        }
    }
    Output
      arraylist = [Apple, Hello, People, Pocket, Yellow]


  • 내림차순(역방향) 정렬
    Comparator.reverseOrder()

    import java.util.ArrayList;
    import java.util.Comparator;
    
    public class arraylist {
        public static void main(String args[]) {
            ArrayList<String> arraylist = new ArrayList<>();
            arraylist.add("Hello");
            arraylist.add("Apple");
            arraylist.add("People");
            arraylist.add("Pocket");
            arraylist.add("Yellow");
    
            arraylist.sort(Comparator.reverseOrder());
            System.out.println("arraylist = " + arraylist);
        }
    }
    Output
    arraylist = [Yellow, Pocket, People, Hello, Apple]

📚 References(참고 자료)

728x90