LinkedList 와 기능이 거의 비슷하게 만들어진 코드
package collection.list;
public class MyLinkedList<E> implements MyList<E> {
private Node<E> first;
private int size = 0;
@Override
public void add(E o) {
Node<E> newNode = new Node<>(o);
if (first == null) {
first = newNode;
} else {
Node<E> lastNode = getLastNode();
lastNode.next = newNode;
}
size++;
}
private Node<E> getLastNode() {
Node<E> x = first;
while (x.next != null) {
x = x.next;
}
return x;
}
@Override
public void add(int index, E o) {
Node<E> newNode = new Node<>(o);
if (index == 0) {
newNode.next = first;
first = newNode;
} else {
// 1. 직전 노드를 찾는다.
Node<E> prev = getNode(index - 1);
// 2. 직전 노드의 next 를 신규 노드의 next 에 넣어준다.
newNode.next = prev.next;
// 3. 직전 노드의 next 에 신규 노드를 연결한다.
prev.next = newNode;
}
size++;
}
@Override
public E set(int index, E element) {
Node<E> x = getNode(index);
E oldValue = x.item;
x.item = element;
return oldValue;
}
@Override
public E remove(int index) {
Node<E> removeNode = getNode(index);
E removeItem = removeNode.item;
if (index == 0) {
first = removeNode.next;
} else {
Node<E> node = getNode(index - 1);
node.next = removeNode.next;
}
removeNode.item = null;
removeNode.next = null;
size--;
return removeItem;
}
@Override
public E get(int index) {
Node<E> node = getNode(index);
return node.item;
}
private Node<E> getNode(int index) {
Node<E> x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
@Override
public int indexOf(E o) {
int index = 0;
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item)) {
return index;
}
index++;
}
return -1;
}
public int size() {
return size;
}
@Override
public String toString() {
return "MyLinkedListV1{" +
"first=" + first +
", size=" + size +
'}';
}
private static class Node<E> {
E item;
Node<E> next;
public Node(E item) {
this.item = item;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Node<E> x = this;
sb.append("[");
while (x != null) {
sb.append(x.item);
if (x.next != null) {
sb.append("->");
}
x = x.next;
}
sb.append("]");
return sb.toString();
}
}
}
LinkedList 와 ArrayList 맨 앞쪽에 데이터 넣고 성능 테스트
package collection.list;
public class BatchProcessor {
private final MyList<Integer> list;
public BatchProcessor(MyList<Integer> myList) {
this.list = myList;
}
public void logic(int size) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
list.add(0, i);
}
long endTime = System.currentTimeMillis();
System.out.println("크기: " + size + ", 계산 시간: " + (endTime - startTime) + "ms");
}
}
ArrayList 로 100만건을 돌리면 너무 올래걸려서 안나와서 중지 시킴 데이터가 5만건이면 1138ms 가 나옴
package collection.list;
import collection.link.MyLinkedListV1;
public class BatchProcessorMain {
public static void main(String[] args) {
MyArrayList<Integer> list = new MyArrayList<>();
// MyLinkedList<Integer> list = new MyLinkedList<>();
BatchProcessor processor = new BatchProcessor(list);
processor.logic(1_000_000);
}
}
LinkedList 로 100만건을 돌리면 결과 값: 크기: 1000000, 계산 시간: 58ms 이 나옴 5만건 돌리면 1ms 가 나옴
package collection.list;
import collection.link.MyLinkedListV1;
public class BatchProcessorMain {
public static void main(String[] args) {
// MyArrayList<Integer> list = new MyArrayList<>();
MyLinkedList<Integer> list = new MyLinkedList<>();
BatchProcessor processor = new BatchProcessor(list);
processor.logic(1_000_000);
}
}
맨 앞에 데이터를 넣을땐 LinkedList 속도가 현저히 빠른걸 체감했다.
'자바기초' 카테고리의 다른 글
해시테이블 구현 (0) | 2025.06.24 |
---|---|
MyArrayList vs MyLinkedList (0) | 2025.06.17 |
MyArrayList (1) | 2025.06.16 |
배열 (0) | 2025.06.16 |
타입 이레이저 (0) | 2025.06.15 |