Java/객체지향

[객체지향][자바의 정석] - 13. ArrayList

얄루몬 2022. 1. 25. 19:35

1. ArrayList란?

  • ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일하다.
  • ArrayList와 달리 Vector는 자체적으로 동기화처리 되어 있다.
  • List인터페이스로 구현하기에 저장 순서가 상관 없이 유지되고 중복을 허용한다
  • 데이터 저장공간으로 배열을 사용한다.(배열기반)

 

 

2. ArrayList의 메서드

 

 

 

3. 실습

package javajungsuk;


import java.util.ArrayList;
import java.util.Collections;

public class Java11_2_1 {
	public static void main(String[] args) {
		ArrayList list1 = new ArrayList(10);
		
		//autoboxing에 의해서 기본형으로 들어간 원래는 
		//list1.add(new Integer(5));이렇게 쓰는 게 맞음
		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));
		print(list1,list2);
		
		//Collection - 인터페이스 / Collections - 유틸클래스
		Collections.sort(list1);
		Collections.sort(list2);
		print(list1,list2);
		
		//list2가 list1에 있는지 확인하는 코드
		System.out.println("list1.containsAll(list2): "+list1.containsAll(list2));
		
		//맨 뒤에 값을 추가해줘
		list2.add("B");
		list2.add("C");
		//중간 3번째 자리에 A를 넣어라
		list2.add(3,"A"); 
		print(list1,list2);
		
		//교체
		list2.set(3, "AA");
		print(list1,list2);
		
		list1.add(0,"1");
		//지정된 객체의 위치(인덱스)를 알려준다.
		System.out.println("index = "+list1.indexOf("1"));
		print(list1,list2);
		
		list1.remove(new Integer(1));
		print(list1,list2);
		
		//list1[5]에 있는 객체 삭제
		list1.remove(5);
		print(list1,list2);
		
		//겹치는 부분만 남기고 나머지는 삭제한다. 
		System.out.println("list1.retainAll(list2): " +list1.retainAll(list2));
		print(list1,list2);
		
		for (int i = list2.size()-1;i>=0;i--) {
			if(true)
				list2.remove(0);
		}
		print(list1,list2);
	
	}

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

 

 

 

4. ArrayList에 저장된 객체 삭제과정

  • 중간에 있는 객체를 삭제하는 과정
    • 삭제하고자 하는 값을 찾아 삭제해준다
    • 삭제한 자리를 한 칸씩 땡겨준 뒤 사이즈에 맞게 빈 자리에 null을 넣어준다.
    • 마지막으로 size를 빠진 값만큼 줄여준다.

 

 

  • 첫 번째 객체부터 삭제하는 경우(배열 복사 발생)
for(int i = 0; i < list.size(); i++)
    list.remove(i);

 

 

  • 마지막 객체부터 삭제하는 경우(배열 복사 발생 안 함)
for(int i = list.size()-1; i >= 0; i--)
    list.remove(i);

위에서부터 지우는 것보다 훨씬 빠르게 지울 수 있고 끝까지 지울 수 있어서 다지울 생각이라면 끝에서부터 지우는 것이 효율적이다.