반응형
ArrayList
ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 가집니다.
Object배열을 이용해 데이터를 순차적으로 index는 0부터 시작하고 그 다음은 1,2,3 ~ 순으로 저장됩니다.
만약 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장됩니다.
또한 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있습니다.
ArrayList 선언
import java.util.ArrayList;
ArrayList<타입> arraylist1 = new ArrayList<>();
ArrayList<타입> arraylist2 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
ArrayList<타입> arraylist3 = new ArrayList<>(arraylist2); // 다른 Collection값으로 초기화
ArrayList<Integer> arraylist4 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // 기본값 생성
선언은 위처럼 하지만 위처럼 ArrayList 클래스 타입을 이용해 선언하게 되면
나중에 데이터의 용도가 바껴 삽입과 삭제가 유리한 LinkedList 클래스로 변경을 해야할 때 ArrayList로 선언된 모든부분을 LinkedList로 바꿔야한다는 불편함이 있습니다.
그렇기 때문에 ArrayList와 LinkedList는 List 인터페이스로 구현한 구현체로,
List 클래스 타입으로 업캐스팅해 선언한다면
List에서 제공하는 메소드까지 사용할 수 있으며 좀더 유연한 구조로 미리 설계할 수 있습니다.
선언 방식은 클래스 타입만 List로 바꾸면 됩니다.
import java.util.List;
import java.util.ArrayList;
List<타입> arraylist1 = new ArrayList<>();
List<타입> arraylist2 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
List<타입> arraylist3 = new ArrayList<>(arraylist2); // 다른 Collection값으로 초기화
List<Integer> arraylist4 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // 기본값 생성
ArrayList 메서드
메서드 | 반환 타입 | 설 명 |
add() | boolean | ArrayList의 마지막에 객체를 추가. |
add(int i, Object element) | void | 지정된 위치(i)에 객체를 추가. |
addAll(Collection c) | boolean | 주어진 컬렉션의 모든 객체를 저장 |
addAll(int i, Collection c) | boolean | 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장 |
clear() | void | ArrayList를 완전히 비운다. |
clone() | Object | ArrayList를 복제 |
contains(Object o) | boolean | 지정된 객체(o)가 ArrayList에 포함되어 있는지 확인 |
containsAll(Collection c) |
boolean | ArrayList가 주어진 c의 모든 객체를 가지고 있는지 확인 |
ensureCapacity(int minCapacity) | void | ArrayList의 용량이 최소한 minCapacity가 되도록 한다. |
get(int i) | Object | 지정된 위치(i)에 저장된 객체를 반환 |
indexOf(Object o) | int | 지정된 객체가 저장된 위치를 반환 |
isEmpty() | boolean | ArrayList가 비어있는지 확인 |
iterator() | lterator | ArrayList의 lterator 객체를 반환 |
lastIndexOf(Object o) | int | 객체(o)가 저장된 위치를 끝부터 역방향으로 검색해서 반환 |
listlterator() | Listlterator | ArrayList의 Listlterator를 반환 |
listlterator(int i) | Listlterator | ArrayList의 지정된 위치부터 시작하는 Listlterator를 반환 |
remove(int i) | Object | 지정된 위치(i)에 있는 객체를 제거 |
remove(Object o) | boolean | 지정된 객체를 제거 |
removeAll(Collection c) | boolean | 지정된 컬렉션에 저장된 것과 동일한 객체들을 ArrayList에서 제거 |
retainAll(Collection c) | boolean | ArrayList에 저장된 객체 중 주어진 컬렉션과 공통된 것만을 남기고 남머지 삭제 |
set(int i, Object element) | Object | 주어진 객체(element)를 지정된 위치(i)에 저장 또는 변경 |
size() | int | ArrayList에 저장된 객체의 개수를반환 |
sort(Collection c) | void | 지정된 정렬기준(c)로 ArrayList 정렬 |
subList(int start, int end) | List | start부터 end사이에 저장된 객체를 반환 |
toArray() | Object[] | ArrayList에 저장된 모든 객체들을 객체배열로 반환 |
toArray(Object[] a) | Object[] | ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환 |
trimToSize() | void | 용량을 크기에 맞게 줄인다 (빈 공간을 없앤다) |
예제
값 추가, 정렬, 변경, 삭제
import java.util.*;
class ArrayListEx1{
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
list1.add(new Integer(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 list2 = new ArrayList(list1.subList(1,4));
print(list1, list2);
System.out.println(" 정렬 후 ");
// Collections 클래스를 이용해 정렬
Collections.sort(list1); // list1과 list2를 정렬한다.
Collections.sort(list2);
print(list1, list2);
System.out.println("list1.containsAll(list2):" + list1.containsAll(list2));
System.out.println(" .add() 로 추가 ");
list2.add("B");
list2.add("C");
list2.add(3, "A");
print(list1, list2);
System.out.println(" .set() 으로 변경 ");
list2.set(3, "AA");
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);
// }
// list1과 겹치는 모든 값들을 list2에서 제거
System.out.println("list2.removeAll(list1):" + list2.removeAll(list1));
list2.removeAll(list1);
print(list1, list2);
}
static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1:"+list1);
System.out.println("list2:"+list2);
System.out.println();
}
}
지정된 문자를 원하는 길이만큼 잘라 list 배열에 추가
import java.util.*;
class ArrayListEx2 {
public static void main(String[] args) {
final int LIMIT = 10; // 자르고자 하는 글자의 개수를 지정.
String source = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
int length = source.length();
List list = new ArrayList(length/LIMIT + 10); // 크기를 약간 여유 있게 잡는다.
for(int i=0; i < length; i+=LIMIT) {
if(i+LIMIT < length ) {
// 10개씩 자른다.
list.add(source.substring(i, i+LIMIT));
} else
list.add(source.substring(i));
}
for(int i=0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
참고자료
자바의 정석3
'◼ JAVA' 카테고리의 다른 글
[Java/자바] Iterator, Listlterator 클래스 사용법 (0) | 2022.10.30 |
---|---|
[Java/자바] LinkedList 클래스 사용법 (0) | 2022.10.30 |
[Java/자바] 컬렉션 프레임워크(Collections Framework) (2) | 2022.10.28 |
[Java/자바] 스택(Stack)과 큐(Queue) (0) | 2022.10.28 |
[Java/자바] Math 클래스 정리 (feat.삼각함수) (0) | 2022.10.26 |