자바의 정석 - ArrayList

Yohan·2024년 2월 8일
0

ArrayList

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

ArrayList의 메서드

  • 생성자
    • ArrayList() , 기본 생성자
    • ArrayList(Collection c)
    • ArrayList(int initialCapacity), (initialCapacity : 배열의 길이)
  • 추가 메서드
    • boolean add(Object o) - 성공 : true, 실패 : false 반환
    • void add(int index, Object element) - index : 저장위치
    • boolean addAll(Collection c) - 컬렉션이 가진 요소 그대로 저장
    • boolean addAll(int index, Collection c)
  • 삭제 메서드
    • boolean remove(Object o) - 성공 : true, 실패 : false 반환
    • Object remove(int index) - 특정위치 삭제
    • boolean removeAll(Collection c) - 컬렉션이 가진 요소 삭제
    • void clear() - 모든 객체 삭제
  • 검색 메서드
    • int indexOf(Object o) - 객체의 인덱스 반환, 못 찾으면 -1 반환
    • int lastIndexOf(Object o) - 역방향, 객체의 인덱스 반환, 못 찾으면 -1 반환
    • boolean contains(Object o) - 객체가 존재하는지
    • Object get(int index) - 객체 읽기, 특정 위치에 있는 객체 반환
    • Object set(int index, Object element) - 특정 위치에 있는 객체 변경
  • List subList(int fromIndex, int toIndex) - from ~ to까지 뽑아서 새로운 List 반환
  • Object[ ] toArray() - ArrayList의 객체 배열을 반환
  • boolean isEmpty() - 비어있는지
  • void trimToSize() - 빈 공간 제거
  • int size() - 저장된 객체의 갯수

실습

class Ex1 {
	public static void main(String[] args) {
		// 기본 길이(용량, capacity)가 10인 ArrayList를 생성
		ArrayList list1 = new ArrayList(10);
		
		// ArrayList에는 객체만 저장가능
		// 오토박싱에 의해 기본형이 참조형으로 자동 변환
		list1.add(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(Collection c)
		ArrayList list2 = new ArrayList(list1.subList(1,4));
		print(list1, list2);
		
		// Collection은 인터페이스, Collections는 util 클래스
		Collections.sort(list1); // list1과 list2 정렬
		Collections.sort(list2); // Collections.sort(List l)
		print(list1, list2);
		
		System.out.println("list1.containsAll(list2):"+list1.containsAll(list2));
		
		list2.add("B");
		list2.add("C");
		list2.add(3, "A"); // 3은 index 위치
		print(list1, list2);
		
		list2.set(3, "AA");
		print(list1, list2);
		
		list1.add(0, "1"); // 문자열 1을 추가
		// indexOf()는 지정된 객체의 위치(인덱스)를 알려준다.
		System.out.println("index=" + list1.indexOf("1"));
		print(list1, list2);
		
//		list1.remove(1); // 인덱스가 1인 객체를 삭제
//		print(list1, list2);
		
		list1.remove(new Integer(1)); // 1을 삭제 (숫자 1)
		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);
		}
		print(list1, list2);
	}
	
	static void print(ArrayList list1, ArrayList list2) {
		System.out.println("list1 :"+list1);
		System.out.println("list2 :"+list2);
		System.out.println();
	}
}

ArrayList에 저장된 객체의 삭제과정

  • ArrayList에 저장된 세 번째 데이터(data[2])를 삭제하는 과정
    -> list.remove(2) 호출
  • ArrayList에 저장된 첫 번째 객체부터 삭제하는 경우 (배열 복사 발생)
    • 배열이 [0, 1, 2, 3, 4], 처음에 remove(0)이 실행, 0이 사라짐 -> 뒤에 있는 것들이 앞으로 당겨지고 remove[1] 실행, 2 사라짐 -> 뒤에 있는 것들이 앞으로 당겨지고 remove[2] 실행, 4사라짐 -> 1, 3이 남게됨
      -> 앞으로 당겨지기 때문에 제대로 실행 X
for(int = 0; i < list.size(); i++)
	list.remove(i);
  • ArrayList에 저장된 마지막 객체부터 삭제하는 경우 (배열 복사 발생안함)
for(int = list.size()-1 ; i >= 0; i++)
	list.remove(i);

정리

  • ArrayList : 기존 Vector개선, 구현원리와 기능적 동일, Vector는 자체 동기화 처리 되어 있음 (Javadoc참고), 저장 공간으로 배열 사용
  • list.add() <- autoboxing에 의해 자동으로 참조형 형변환
  • subList()로 만들어진 List는 읽기 전용
  • 뒤에서 부터 삭제하면 배열 복사 발생하지 않는다.
    위에서 부터 지우면 성능상에서도 안좋고, 자잘한 문제 발생
profile
백엔드 개발자

0개의 댓글