LinkedList
이다.class Node {
Node next; // 다음 요소의 주소를 저장
Object data; // 내 데이터를 저장
}
그림과 코드에서 알 수 있듯이 각 요소들은 자신과 연결된 다음 요소의 값(next)와 본인 데이터(data)를 가지고있다.LinkedList에서 삭제는 매우 쉽다.
삽입도 쉽다.
LinkedList는 단뱡향이기 때문에 이전요소로의 접근은 어렵다.
그리하여 이를 보완한 것이 DoubleLinkedList
이중 연결리스트이다.
참조 변수를 하나 더 추가해서 이전 노드를 가리키는 정보까지 담아두었다.
class Node {
Node prev;
Node next; // 다음 요소의 주소를 저장
Object data; // 내 데이터를 저장
}
그래서 실제로 LinkedList클래스는 이름과 달리 더블 링크드 리스트로 구현이 되어있다고 한다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ArrayList_VS_LinkedListTest {
public static void main(String[] args) {
// 단순히 저장하는 시간만 비교할 수 있도록 초기용량을 충분히 설정
List<Integer> al = new ArrayList<>(2_000_000);
List<Integer> ll = new LinkedList<>();
System.out.println("== 순차적으로 추가하기 ==");
System.out.println("ArrayList : " + add1(al));
System.out.println("LinkedList : " + add1(ll));
System.out.println("== 중간에 추가하기 ==");
System.out.println("ArrayList : " + add2(al));
System.out.println("LinkedList : " + add2(ll));
System.out.println("== 중간에서 삭제하기 ==");
System.out.println("ArrayList : " + remove2(al));
System.out.println("LinkedList : " + remove2(ll));
System.out.println("== 순차적으로 삭제하기 ==");
System.out.println("ArrayList : " + remove1(al));
System.out.println("LinkedList : " + remove1(ll));
}
private static long add1(List<Integer> list) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10_000_000; i++) list.add(i);
long end = System.currentTimeMillis();
return end - start;
}
private static long add2(List<Integer> list) {
long start = System.currentTimeMillis();
for (int i = 0; i < 1_000; i++) list.add(500, -1);
long end = System.currentTimeMillis();
return end - start;
}
private static long remove1(List<Integer> list) {
long start = System.currentTimeMillis();
for (int i = list.size() - 1; i >= 0; i--) list.remove(i);
long end = System.currentTimeMillis();
return end - start;
}
private static long remove2(List<Integer> list) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10_000; i++) list.remove(i);
long end = System.currentTimeMillis();
return end - start;
}
}
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ArrayList_VS_LinkedListTest2 {
public static void main(String[] args) {
List<Integer> al = new ArrayList<>(1_000_000);
List<Integer> ll = new LinkedList<>();
add(al);
add(ll);
System.out.println("== 접근 시간 테스트 ==");
System.out.println("ArrayList : " + access(al));
System.out.println("LinkedList : " + access(ll));
}
private static void add(List<Integer> list) {
for (int i = 0; i < 100_000; i++) {
list.add(i);
}
}
private static long access(List<Integer> list) {
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
list.get(i);
}
long end = System.currentTimeMillis();
return end - start;
}
}
컬렉션 | 읽기(접근 시간) | 추가 / 삭제 | 비고 |
---|---|---|---|
ArrayList | 빠르다 | 느리다 | 순차적인 추가/삭제는 얘가 더 빠름 |
LinkedList | 느리다 | 빠르다 |