CF_03_ArrayList 클래스

charl hi·2021년 9월 14일
0

JAVA_CF

목록 보기
3/12

ArrayList

  • 기존의 Vector와의 차이 : 동기화X(ArrayList), 동기화O(Vector)
  • List인터페이스를 구현하므로, 저장순서가 유지되고, 중복을 허용한다.
  • 배열기반
  • 모든 종류의 객체 저장 가능
  • ✨✨객체만 저장가능하나, 오토박싱으로 기본형도 넣을 수 있다.

생성자

  1. ArrayList()

  2. ArrayList(Collectoin c)

  • 컬렉션 c에 있는 객체들 저장
  1. ArrayList(int initialCapacity)
  • initialCapacity : 배열의 길이. 초기용량

메소드

추가

  1. boolean add(Object o)
  • 컬렉션에 객체 o 추가, 변화가 있으면 true
list1.add(new Integer(1));	//원칙
list1.add(1);			//오토박싱
  1. void add(int index, Object element)
  • 컬렉션에, 컬렉션의 지정된 위치(index)에 객체 element 추가
  • 뒤 index의 객체들은 뒤로 밀려남
  1. boolean addAll(Collection c)
  • 컬렉션에, 컬렉션 c에 포함된 객체들을 추가, 변화가 있으면 true
  1. boolean addAll(int index, Collection c)
  • 컬렉션에, 지정된 위치(index)에 컬렉션 c에 포함된 객체들을 추가.
  • 변화가 있으면 true


삭제

  1. boolean remove(Object o)
  • 컬렉션에서 저장한 객체 o를 삭제, 빈공간은 뒤에서 땡겨와서 채움.

  • 변화가 있으면 true

  • 👀👀👀 new Integer(1)는 객체 생성한 것이 아닌가?? 해서 찾아본 남궁성님의 답변
    -> 같은걸 삭제하는 것이다. Integer는 equals가 오버라이딩 되어 있어서 같은 값이면 같은 객체로 보기 때문에 삭제 되는 것이다.

  1. Object remove(int index)
  • 지정된 위치(index)에 있는 객체 삭제, 빈공간은 뒤에서 땡겨와서 채움
  • 👀👀Object를 왜 반환하지???? : 삭제된 요소 반환
list1.remove(new Integer(1));	//boolean remove(Object o)
...
list1.remove(1);		//Object remove(int index)
//오토박싱된 인티저요소 1이 아니라 인덱스 1이다!!!
  1. boolean removeAll(Collection c)
  • 컬렉션에서, 컬렉션 c에 포함된 모든 객체와 동일한 것들을 삭제
  • 변화가 있으면 true
  1. void clear()
  • 모든 객체 삭제
  1. boolean retainAll(Collectoin c)
  • 컬렉션에서, 컬렉션 c에 포함된 객체들을 제외한 나머지 객체들을 삭제
  • 변화가 있으면 true
list1.retainAll(list2);
list2.removeAll(list1);

6. ✨내가 직접 삭제할 때



검색

  1. int indexOf(Object o)
  • 컬렉션에서 저장된 객체 o를 찾아 index 반환. 못찾으면 -1 반환
list1.indexOf(new Integer(1));	//원칙
list1.indexOf(1);			//오토박싱
list1.indexOf("1");
  • 👀👀👀 new Integer(1)는 객체 생성한 것이 아닌가?? 해서 찾아본 남궁성님의 답변
    -> 같은걸 삭제하는 것이다. Integer는 equals가 오버라이딩 되어 있어서 같은 값이면 같은 객체로 보기 때문에 삭제 되는 것이다.
  1. int lastIndexOf(Object o)
  • 오른쪽 끝에서 왼쪽으로 찾기
  1. boolean contains(Object o)
  • 컬렉션이 객체 o를 포함하는지 묻기. 참이면 true, 아니면 false
  1. boolean containsAll(Collection c)
  • 컬렉션이 컬렉션 c가 포함한 객체 전체를 포함하는지 묻기. 참이면 true, 아니면 false
list1.containsAll(list2);


읽기

  1. Object get(int index)
  • 특정 위치index에 저장된 객체 읽기(반환)


변경

  1. Object set(int index, Object element)

특정 위치index에 있는 객체를 객체 element로 변경하기



추출

  1. List subList(int fromIndex, int toIndex)
  • fromIndex부터 toIndex - 1 까지 뽑아서 새 배열 만들기
  • 👀👀읽기전용이라 내용을 변경하는 등 활용하려면 ✨새 객체로 받아야 한다.???
List sub = list1.subList(1, 4);	
ArrayList list2 = new ArrayList(sub);
//-> 를 한줄로 줄이면
ArrayList list2 = new ArrayList(list1.subList(1, 4));


기타

  1. Object[] toArray()
  • 저장된 객체들을 객체배열의 형태로 반환
  1. Object[] toArray(Object[] a)
  • 저장된 객체들을 주어진 객체배열a 에 저장
  1. boolean isEmpty()
  • 비어있는지 확인. 비어있으면 true, 차있으면 false
  1. void trim ToSize()
  • 빈공간 제거
  1. int size()
  • 저장된 객체의 개수 반환



예제

ex11_01

import java.util.ArrayList;
import java.util.*;

public class Ex11_01 {

	public static void main(String[] args) {
		//capacity=10인 ArrayList
		ArrayList list1 = new ArrayList(10);
		//원래 객체만 받는다!! 그런데 현재 java9부턴 deprecated
		list1.add(new Integer(5));
		list1.add(4);
		list1.add(new Integer(2));
		list1.add(new Integer(0));
		list1.add(new Integer(1));
		list1.add(new Integer(3));
		
		//ArrayList(Collection c) 
		//subList는 읽기전용이라 활용하려면 새 객체로 받아줘야 한다!
		/*List sub = list1.subList(1, 4);
		ArrayList list2 = new ArrayList(sub);
		를 줄인 것이다.*/		//index 1~3
		ArrayList list2 = new ArrayList(list1.subList(1, 4));
		print(list1, list2);
		
		//**Collection은 인터페이스, Collections는 유틸 클래스!!!
		Collections.sort(list1);	//(오름차순)정렬
		Collections.sort(list2);	//**sort(List<T> list)
		print(list1, list2);
		
		//**컬렉션타입 list1이, 컬렉션타입 list2에 포함된 모든 객체들을 포함하는지
		System.out.println("list1.containsAll(list2) : "+list1.containsAll(list2));
		
		list2.add("B");
		list2.add("C");
		list2.add(3, "A");	//index3에 "A"추가, 뒤는 밀려난다.
		print(list1, list2);
		
		//변경
		list2.set(3, "AA");
		print(list1, list2);
		
		//검색
		list1.add(0, "1");
		print(list1, list2);
		System.out.println("indexOf(String \"1\") = "+list1.indexOf("1"));
		System.out.println("indexOf(Integer 1) = "+list1.indexOf(1));
		//**원래는 : list1.indexOf(new Integer(1)); 이다!!!
		System.out.println("=====");
		
		//삭제
		list1.remove(new Integer(1));	//boolean remove(Object o)
		print(list1, list2);
		//**list1.remove(1) 오토박싱 1인 요소를 제거한다 가 안됨!!!
		list1.remove(1);		//Object remove(int index)
		//***index 1 이 해당된다.
		//따라서 위의 객체 방식으로 해야함!!
		print(list1, list2);
		
		//포함된 것 제외하고 삭제
		System.out.println("list1.retainAll(list2) : "+list1.retainAll(list2));
		print(list1, list2);
		
		//포함된 것 삭제
		list2.removeAll(list1);
		print(list1, list2);
		//위를 contains 와 반복문을 통해 삭제
		System.out.println("list2.size() : "+list2.size());
		for(int i=list2.size()-1; i>=0; i--) {
			//(6-1=)5~0 총 6번 실행
			if(list1.contains(list2.get(i)))	//[5]부터
				//***list1과 list2의 순서를 바꾸면 안된다!!
				//contains(Object o): 컬렉션이 아닌 객체를 받기에 get()을 통해 하나하나 비교해야 함
				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("=====");
	}

}

list1 : [5, 4, 2, 0, 1, 3]
list2 : [4, 2, 0]
=====
list1 : [0, 1, 2, 3, 4, 5]
list2 : [0, 2, 4]
=====
list1.containsAll(list2) : true
list1 : [0, 1, 2, 3, 4, 5]
list2 : [0, 2, 4, A, B, C]
=====
list1 : [0, 1, 2, 3, 4, 5]
list2 : [0, 2, 4, AA, B, C]
=====
list1 : [1, 0, 1, 2, 3, 4, 5]
list2 : [0, 2, 4, AA, B, C]
=====
indexOf(String "1") = 0
indexOf(Integer 1) = 2
=====
list1 : [1, 0, 2, 3, 4, 5]
list2 : [0, 2, 4, AA, B, C]
=====
list1 : [1, 2, 3, 4, 5]
list2 : [0, 2, 4, AA, B, C]
=====
list1.retainAll(list2) : true
list1 : [2, 4]
list2 : [0, 2, 4, AA, B, C]
=====
list2.size() : 6
list1 : [2, 4]
list2 : [0, AA, B, C]
=====


ArrayListEx2




Ref

0개의 댓글