자바기초

MyLinkedList

lby132 2025. 6. 17. 01:33

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