이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. ArrayList
- ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적을 동일
ArrayList와 달리 Vector는 자체적으로 동기화처리가 되어 있다.
- List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다.
- 데이터의 저장공간으로 배열을 사용한다. (배열 기반)
Vector를 자세히 살펴보면 객체 배열이 있다. Object(객체) 배열에는 모든 종류의 객체를 저장할 수 있음
2. ArrayList의 메서드
⚝ 생성자
- ArrayList() : 기본 생성자
- ArrayList(Collection c) : 매개변수로 컬렉션을 주면, 컬렉션에 저장된 것을 ArrayList로 만들어줌.
- ArrayList(int initialCapacity) : 배열의 길이를 넣어줌. (한 번 만들면 길이를 못 바꾼다)
⚝ 추가 메서드
- boolean add(Object o)
- void add(int index, Object element) : 특정 위치
- boolean addAll(Collection c)
- boolean addAll(int index, Collection c) : 특정 위치
⚝ 삭제 메서드
- boolean remove(Object o)
- void remove(int index, Object element) : 특정 위치
- boolean removeAll(Collection c) : 특정 c
- void clear() : 모두
⚝ 그 외
- int indexOf(Object o) : 못 찾으면 -1
- int lastIndexOf(Object o)
- boolean contains(Object o) : 객체 존재?
- Object get(int index) : 객체 읽기
- Object set(int index, Object element)
- List subList(int fromIndex, int toIndex)
- Object[] toArray() : ArrayList의 객체배열을 반환
- Object[] toArray(Object[] a)
- boolean isEmpty()
- void trimToSize()
- int size()
⍟ 실습
package etc;
import java.util.ArrayList;
import java.util.Collections;
public class Ex11_1 {
public static void main(String[] args) {
//기본 길이(용량, capacity)가 10인 ArrayList를 생성
ArrayList list1 = new ArrayList(10);
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)); //ArrayList의 일부를 뽑아서 만들어줌
// 1 <= x < 4이기 때문에 index가 1,2,3인 것을 가지고 subList를 만든다.
//subList는 읽기 전용이라 사용할려면 새로운 리스트를 만들어주어야 한다.
print(list1, list2);
//Collection은 인터페이스, Collections는 유틸 클래스
Collections.sort(list1); //list1과 list2를 정렬한다.
Collections.sort(list2); //Collections.sort(List l)
print(list1, list2);
//list1이 list2의 모든 요소를 포함하고 있는가?
System.out.println("list1.containsAll(list2):"+list1.containsAll(list2));//true
list2.add("B");
list2.add("C"); //list2:[0, 2, 4, B, C]
list2.add(3, "A"); //list2:[0, 2, 4, A, B, C]
print(list1,list2);
list2.set(3, "AA");
print(list1, list2); //list1:[0, 1, 2, 3, 4, 5] list2:[0, 2, 4, AA, B, C]
list1.add(0,"1");
//indexOf()는 지정된 객체의 위치(인덱스)를 알려준다.
//출력은 같지만 Integer 1과 String 1이 있다.
System.out.println("index="+list1.indexOf("1")); //index=0
System.out.println("index="+list1.indexOf(1)); //index=2
// list1.remove(new Integer(1)); //숫자 1을 지움
// list1.remove(0); //인덱스 0번 지움
// list1.remove(1); //인덱스가 1인 객체를 삭제. boolean remove(Object obj)를 호출하는 것이 아닌, Object remove(int index)를 호출한다.
//list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다
System.out.println("list1.retainAll(list2):"+list1.retainAll(list2)); //true
print(list1, list2); //list1:[0, 2, 4] list2:[0, 2, 4, AA, B, C]
//list2에서 list에 포함된 객체들을 삭제한다.
for(int i = list2.size()-1; i >= 0; i--){
if(list1.contains(list2.get(i)))
list2.remove(i);
}
/*
1. get(i)으로 list2에서 하나씩 꺼낸다
2. contains()로 꺼낸 객체가 list1에 있는지 확인
3. remove(i)로 해당 객체를 list2에서 삭제
*/
print(list1, list2); //list1:[0, 2, 4] list2:[AA, B, C]
} //main의 끝
private static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1:"+list1);
System.out.println("list2:"+list2);
System.out.println();
}
} //class
- `list.add(5);`도 가능하긴 하지만, 기본적으로 ArrayList에는 객체만 저장이 가능하다.
따라서 `list.add(new Integer(5));`와 같은 형식으로 값을 추가해야 한다. 그렇다면 `list.add(5);`는 어떻게 가능한 것인가? 그것은 컴파일러가 autoboxing해주면서 기본형을 참조형으로 자동 변환을 해주기 때문이다.
3. ArrayList에 저장된 객체의 삭제 과정
- ArrayList에 저장된 세 번째 데이터(data[2])를 삭제하는 과정. `list.remove(2);`를 호출
① 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다.
② 데이터가 모두 한 칸씩 이동했으므로 마지막 데이터는 null로 변경한다.
③ 데이터가 삭제되어 데이터의 개수가 줄었으므로 size의 값을 감소시킨다.
※ 마지막 데이터를 삭제하는 경우, ①의 과정(배열의 복사)은 필요없다.
ArrayList를 전부 삭제해보자!!
⚝ ArrayList에 저장된 첫 번째 객체부터 삭제하는 경우 (배열 복사 발생)
for문 다 돌았는데도 다 안 지워지고 남아있다.
왜? 남아있는 얘들이 위로 올라가기 때문이다.
그래서 아래와 같은 방식으로 해결이 가능하다.
⚝ ArrayList에 저장된 마지막 개체부터 삭제하는 경우 (배열 복사 발생 안 함)
4. Java API 소스 보기 - /jdk설치경로/src.zip
⚝ Eclipse에서 보는 방법
- 소스를 보고 싶은 클래스나 메서드에서 `우클릭` -> `Open Declaration` 클릭!
- 만약 Source not found라는 글을 보면 그 아래의 `Attach Source...`를 클릭 -> `External Location` 클릭 -> `External File...`을 클릭하고 jdk가 설치된 경로(/jdk/src.zip)를 지정
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]Iterator, Enumeration, Map과 Iterator (0) | 2024.01.16 |
---|---|
[JAVA의 정석]Stack과 Queue의 활용 (0) | 2024.01.16 |
[JAVA의 정석]Stack과 Queue (0) | 2024.01.16 |
[JAVA의 정석]LinkedList (0) | 2024.01.16 |
[JAVA의 정석]컬렉션프레임웍과 핵심 인터페이스 (0) | 2024.01.13 |