โ List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋์ ๋ฐฐ์ด(Resizable array)
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializale {
...
protected Object[] elementData; // ๊ฐ์ฒด๋ฅผ ๋ด๊ธฐ ์ํ ๋ฐฐ์ด
...
}
List<String> list = new ArrayList<>();
list.add("A"); // ๋งจ ๋ค์ ์ถ๊ฐ
list.add(0, "B"); // index 0์ ์ฝ์
(์ค๊ฐ ์ฝ์
)
String s = list.get(1); // ์ธ๋ฑ์ค๋ก ์กฐํ
list.remove(0); // ์ธ๋ฑ์ค๋ ๊ฐ์ฒด๋ก ์ญ์
int size = list.size(); // ํ์ฌ ์์ ๊ฐ์
add()
ํด์ ์ฑ์ ๋ฃ๋๋ค.โ ์ฅ์
โ ๋จ์
โ๏ธ String class / Collection_List์ ์์ฑ์, ๋ฉ์๋์ ๊ธฐ๋ฅ์ด ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จ์์ฝํจ.
โ๏ธ initialCapacity: ๋ฐฐ์ด์ ์ฉ๋
โ๏ธ int index: ์ ์ฅ์์น
โ๏ธ void clear(): ๋ชจ๋ ๊ฐ์ฒด ์ญ์
โ๏ธ ๋ชป์ฐพ์ผ๋ฉด -1 ๋ฐํ
โ๏ธ Object set(int index, Object element): ๋ณ๊ฒฝ
โ๏ธ int size(): ์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐฏ์
โ LinkedList๋ ๋ ธ๋(Node)๋ค์ ํฌ์ธํฐ(์ฐธ์กฐ)๋ก ์ฐ๊ฒฐํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ List ๊ตฌํ์ฒด
๊ฐ ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง:
[prev] <- [data] -> [next]
์ฆ,
์๋ฐ LinkedList
๋ ์ฒซ ๋ฒ์งธ ๋
ธ๋(head
)์ ๋ง์ง๋ง ๋
ธ๋(tail
) ์ฐธ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("์ ๋"); // ๋งจ ๋ค์ ์ถ๊ฐ
list.addFirst("์ฒ ์"); // ๋งจ ์์ ์ถ๊ฐ
list.addLast("์ํฌ"); // ๋งจ ๋ค์ ์ถ๊ฐ
System.out.println(list.get(1)); // index 1 ํ์ (๋๋ฆผ)
list.remove("์ฒ ์"); // ๊ฐ์ผ๋ก ์ญ์
list.removeFirst(); // ์ฒซ ์์ ์ญ์
list.removeLast(); // ๋ง์ง๋ง ์์ ์ญ์
}
}
๐ ์กฐํ ์ฑ๋ฅ์ ArrayList๋ณด๋ค ํจ์ฌ ๋๋ฆฌ์ง๋ง, ์ฝ์ /์ญ์ ๋ ํน์ ์ํฉ์์ ๋ ๋น ๋ฆ.
โ ์ฅ์
โ ๋จ์
prev
, next
์ฐธ์กฐ๋ฅผ ์ ์ฅํด์ผ ํด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ง์๐ ๊ทธ๋์ ์ค๋ฌด์์๋ LinkedList๋ฅผ ํน์ํ ์ํฉ์์๋ง ์ฐ๊ณ , ์ผ๋ฐ์ ์ผ๋ก๋ ArrayList๊ฐ ๋ ๋ง์ด ์ฐ์ธ๋ค.
class Node { // ์์ ํ๋ํ๋๊ฐ Node๋ฅผ ์๋ฏธํ๋ค.
Node next; // ๋ค์๋
ธ๋๊ฐ ์ด๋์ง ์ฐธ์กฐ๋
ธ๋๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋๋ค.
Object obj; // ๋ฐ์ดํฐ
}
class SinglyLinkedNode {
int val;
SinglyLinkedNode next = null;
SinglyLinkedNode(int v) {
val = v;
}
}
โ๏ธ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(singly linkedList)
: ๋ค์ ์์๋ฅผ ๊ฐ๋ฅดํค๋ ์ฐธ์กฐ๋ง์ ๊ฐ์ง๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
class Node {
Node next; // ๋ค์์์
Node previous; // ์ด์ ์์
Object obj; // ๋ฐ์ดํฐ
}
class DoublyListNode {
int val;
DoublyListNode next;
DoublyListNode prev;
DoublyListNode(int x) {
val = x;
}
}
โ๏ธ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(doubly linked list)
: ์ด์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ ๊ฐ์ง๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ, ์ ๊ทผ์ฑ ํฅ์
: ์ฐ๊ฒฐ์ด 2๊ฐ โก๏ธ ๋ค์์์์ ์ด์ ์์ ์ด ์ฐธ์กฐ๋ฅผ 2๊ฐ ๊ฐ์ง๊ณ ์๋ค.
์ถ๊ฐ ์ญ์ ํ ๋์๋ 2๊ฐ์ ์ฐ๊ฒฐ์ ๋์ด์ค์ผํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ข ๋ ๊ฑธ๋ฆฐ๋ค.
ํ์ง๋ง ์ฌ์ ํ ํ๋ฒ์ 2๊ฐ 3๊ฐ ๊ฑด๋๋ฐ๋๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
โ๏ธ ์ด์ค ์ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ(doubly circular linkedList)
๋ง์ง๋ง ์์๋ฅผ ๋งจ ์ฒ์ ์์์, ๋งจ ์ฒ์ ์์๋ฅผ ๋งจ ๋์ ์์๋ก ์ฐ๊ฒฐํ ์ ์๋ค.
๋งจ ์ฒ์์์์์ ๋งจ ๋์ ์์๋ฅผ ์ด๋ํ ๋ ํ๋ํ๋ ๋ค์ ๋ ธ๋๋ก ์ด๋ํด์ผ ํ๋ ๊ฒ์ ์์์ ๋ฐ๋ก ๋งจ ๋์ผ๋ก ์ด๋ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์ฑ๋ 1์์ ๋ฆฌ๋ชจ์ปจ์ผ๋ก ์ฑ๋์ ๊ฐ์์ํฌ ๋, ์ฑ๋0์ด ๋๋ ๊ฒ์ด ์๋๋ผ ์ฑ๋ 999์ธ ์ ค ๋ง์ง๋ง ์ฑ๋๋ก ํฅํ๋ค. ์ด๋ฐ ์๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
ํญ๋ชฉ | ArrayList | LinkedList |
---|---|---|
๋ด๋ถ ๊ตฌ์กฐ | ๋ฐฐ์ด ๊ธฐ๋ฐ | ๋ ธ๋ ๊ธฐ๋ฐ (์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ) |
์ ๊ทผ ์๋ | ์ธ๋ฑ์ค O(1) (๋น ๋ฆ) | ์ธ๋ฑ์ค O(n) (๋๋ฆผ) |
์ฝ์ /์ญ์ (์ค๊ฐ) | O(n) (๋ค ์์ ์ด๋ ํ์) | O(n) (๋ ธ๋ ํ์ ํ O(1) ์ฐ๊ฒฐ ๋ณ๊ฒฝ) |
์ฝ์ /์ญ์ (์/๋ค) | ์: O(n), ๋ค: amortized O(1) | ์/๋ค: O(1) |
๋ฉ๋ชจ๋ฆฌ ํจ์จ | ๋ฎ์(์ถ๊ฐ ์ฐธ์กฐ ์์) | ๋์(๋ ธ๋๋ง๋ค prev/next ์ ์ฅ) |
์บ์ ์นํ๋ | ์ข์ | ๋์จ |
1. ์์ฐจ์ ์ผ๋ก ์ถ๊ฐํ๊ธฐ
LinkedList๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ๋ํ๋๋ค ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๋ณด๋ค๋ ์ถ๊ฐ๊ฐ ๋๋ฆฌ๋ค.
2. ์์ฐจ์ ์ผ๋ก ์ญ์ ํ๊ธฐ
3. ์ค๊ฐ์ ์ถ๊ฐํ๊ธฐ
4. ์ค๊ฐ์์ ์ญ์ ํ๊ธฐ
5. ์ ๊ทผ์๊ฐํ ์คํธ
- ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ / ์ญ์ : ArryaList๊ฐ ๋น ๋ฆ
- ๋น์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ / ์ญ์ : LinkedList๊ฐ ๋น ๋ฆ
- ์ ๊ทผ์๊ฐ(access time): ArrayList๊ฐ ๋น ๋ฆ
index๊ฐ n์ธ ๋ฐ์ดํฐ์ ์ฃผ์ = ๋ฐฐ์ด์ ์ฃผ์ + n * ๋ฐ์ดํฐ ํ์ ์ ํฌ๊ธฐ
References
: https://cafe.naver.com/javachobostudy