■ ArrayList
ArrayList는 List 인터페이스를 구현한 구체적인 클래스 중 하나로서 크기가 가변적으로 변하는 선형리스트이다. 기존의 배열으로는 자료를 담고 관리하는데 불편한점이 있어 나온 것이 ArrayList이다.
● 특징
- 연속적인 데이터의 리스트
- ArrayList 클래스는 내부적으로 Object 배열을 이용하여 요소를 저장한다
- 배열을 이용하기 때문에 인덱스를 이용해 요소에 빠르게 접근 할 수 있다
- 배열은 크기가 고정되어 있어 불편함이 있지만 ArrayList는 데이터 적재량에 따라 가변적으로 공간을 늘리거나 줄일 수 있어 동적 할당에 해당된다
- 데이터를 리스트 중간에 삽입&삭제 할 경우 , 중간에 빈 공간이 발생하지 않도록 요소의 위치를 앞뒤로 자동으로 이동시키므로 삽입&삭제의 동작은 느려 조회를 하는 경우에 사용하는 것이 좋다
● 배열과 ArrayList 차이
구분 | 배열 | ArrayList |
정적 할당 | 동적 할당 | |
길이가 정해져 있으며 길이를 변경할 수 없다 | 공간이 꽉차면 자동으로 크기를 늘린다 | |
index의 데이터를 삭제하면 해당 index는 빈공간으로 남는다 | index의 데이터를 삭제하면 자동으로 요소의 위치를 이동시킨다 | |
length | size() |
● 사용방법
<> 제네릭에 타입명 지정
ArrayList<E> list = new ArrayList<>();
// Integer 타입 객체
ArrayList<Integer> list = new ArrayList<>();
// 초기 크기 지정
ArrayList<Integer> list = new ArrayList<>(10);
// 배열을 넣어 생성
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10,20,30));
● 요소 추가
ArrayList에 요소를 추가할 때 제네릭 타입 파라미터로 명시된 타입의 데이터만 추가 가능하다
addAll() 메소드를 통해 컬렉션 자체를 그대로 받아와 list에 추가 할 수도 있다
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list2.add(40);
list2.add(50);
list.addAll(list2);
System.out.println(list);
}
}
● 요소 삭제
요소의 삭제를 하게 될 경우 나머지 요소들이 삭제된 빈 공간을 채우기 위해 이동하게된다
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list2.add(40);
list2.add(50);
list.addAll(list2);
System.out.println(list);
// 해당 인덱스 자리의 요소를 삭제한다
list.remove(4);
// list.clear 모든 값 제거
System.out.println(list);
}
}
● 요소 변경
자리에 있는 기존의 데이터는 삭제되고 set()에서 변경된 새로운 데이터가 대체되어 들어간다
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.set(2, 80);
System.out.println(list);
}
}
● 배열 반환
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("손흥민");
list.add("김민재");
list.add("황희찬");
// 배열로 변환하고 반환
String[] arr1 = list.toArray();
// 매개변수로 지정된 배열에 담아 반환
String[] str2 = new String[list.size()]; // list의 사이즈에 맞게 배열을 생성
list.toArray(str2);
}
}
● 정렬
sort() 메소드는 정렬된 값을 반환하는 것이 아닌 리스트 자체를 내림차순 혹은 오름차순으로 변경 시킨다
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(30);
list.add(50);
list.add(60);
list.add(25);
// 오름차순 정렬
list.sort(Comparator.naturalOrder());
System.out.println(list);
// 내림차순 정렬
list.sort(Comparator.reverseOrder());
System.out.println(list);
}
}
● 요소 검색
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("김민재");
list.add("손흥민");
list.add("황희찬");
list.add("이강인");
// list에 contains()가 있는지 검색하고 있다면 true 없으면 false
System.out.println(list.contains("황희찬"));
System.out.println(list.contains("조규성"));
System.out.println("");
// list에 indexOf()가 있는지 검색하고 해당 index를 반환, 없으면 -1
System.out.println(list.indexOf("이강인"));
System.out.println(list.indexOf("박지성"));
}
}
● 요소 얻기
단일 요소를 얻고자 한다면 get() 메소드를 사용하고, 범위 요소를 얻고자 하면 subList(firstIndex ,lastIndex) 메소드를 활용하여 가져올 수 있다 다만 firstIndex 부터 lastIndex -1 사이에 저장된 객체를 반환한다
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("김민재");
list.add("손흥민");
list.add("황희찬");
list.add("이강인");
list.add("박지성");
list.add("홀란드");
list.add("로드리");
System.out.println(list.get(4));
System.out.println(list.subList(2, 5));
}
}
● Iterator
Iterator는 Java에서 컬렉션을 반복하고 그 안의 요소에 접근하는 데 사용되는 인터페이스이며 컬렉션 내부 구조와 관계없이 요소를 순회할 수 있다
hasNext() : 다음 요소를 가지고 있는 동안 반복한다
next() : Iterator의 다음 요소를 가져온다
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("김민재");
list.add("손흥민");
list.add("황희찬");
list.add("이강인");
list.add("박지성");
list.add("홀란드");
list.add("로드리");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
}
}
Today short review
ArrayList에 대해 알아보았다 ArryList를 활용해보는것과 이후에 LinkedList도 추가적으로 알아볼 예정이며
틀린 부분이 있다면 알려주시면 감사하겠습니다.
'자료구조' 카테고리의 다른 글
LinkedList 구조 (0) | 2023.11.12 |
---|---|
스택 (Stack) (0) | 2023.10.16 |