IT•개발 끄적/Java

[Java] 컬렉션 프레임워크 List: ArrayList, LinkedList 차이

소다맛사탕 2021. 5. 15. 21:38
반응형

이번 포스팅에서는 컬렉션 프레임워크의 List의 구현클래스인 ArrayList와 LinkedList의 차이와 반응성에 대해 간단하게 알아보겠습니다.

 

List 구현클래스...

 

1. ArrayList

컬렉션 프레임워크에서 가장 많이 쓰이고, 데이터의 저장순서가 유지되고 중복을 허용.

 

2. LinkedList

배열의 크기를 변경하고, 비순차적인 데이터의 추가와 삭제에 대해 복사하는 과정이 없으므로 처리속도가 빠름.

ArrayList Vs. LinkedList

 

순차적으로 추가 및 삭제하는 경우에는 ArrayList가 LinkedList 보다 빠름.

  • 배열에 저장할 데이터의 갯수만큼 저장공간을 충분히 확보하는 경우.
  • 마지막 데이터부터 역순으로 순차적으로 삭제해 재배치를 하지않을 경우.

 

비순차적으로 추가 및 삭제하는 경우에는 LinkedList가 ArrayList 보다 빠름.

  • 비순차적인 데이터를 수정하는 경우 요소간의 연결만 변경해 주기 때문.
  • 배열의 빈 공간을 채워할 필요가 없기 때문.

 

// 순차적으로 생성
public static long aryAdd(List list) {
    long start = System.currentTimeMillis();
    for(int i = 0; i < 1000000; i++) {
        list.add(i + "");
    }
    long end = System.currentTimeMillis();
    return end - start;
}

// 비순차적으로 생성
public static long aryMidAdd(List list) {
    long start = System.currentTimeMillis();
    for(int i = 0; i < 10000; i++) {
        list.add(500, "X");
    }
    long end = System.currentTimeMillis();
    return end - start;
}

// 순차적으로 삭제
public static long aryRemove(List list) {
    long start = System.currentTimeMillis();
    for(int i = list.size() -1; i >= 0; i--) {
        list.remove(i);
    }
    long end = System.currentTimeMillis();
    return end - start;
}

// 비순차적으로 삭제
public static long aryMidRemove(List list) {
    long start = System.currentTimeMillis();
    for(int i = 0; i < 10000; i++) {
        list.remove(i);
    }
    long end = System.currentTimeMillis();
    return end - start;
}

public static void main(String[] args) {
    ArrayList aryList = new ArrayList(10000000);
    LinkedList linkList = new LinkedList();

    System.out.println("-- 순차적으로 추가 > ");
    System.out.println("ArrayList : " + aryAdd(aryList) + " :: LinkedList : "+aryAdd(linkList));

    System.out.println("-- 비순차적으로 추가 > ");
    System.out.println("ArrayList : " + aryMidAdd(aryList) + " :: LinkedList : "+aryMidAdd(linkList));

    System.out.println("-- 비순차적으로 삭제 > ");
    System.out.println("ArrayList : " + aryMidRemove(aryList) + " :: LinkedList : "+aryMidRemove(linkList));

    System.out.println("-- 순차적으로 삭제");
    System.out.println("ArrayList : " + aryRemove(aryList) + " :: LinkedList : "+aryRemove(linkList));
}

>> 결과

-- 순차적으로 추가 > 
ArrayList : 1128 :: LinkedList : 1814
-- 비순차적으로 추가 > 
ArrayList : 9102 :: LinkedList : 32
-- 비순차적으로 삭제 > 
ArrayList : 8071 :: LinkedList : 254
-- 순차적으로 삭제
ArrayList : 16 :: LinkedList : 43

 

ArrayList와 LinkedList를 비교하기 위해 데이터의 갯수를 크게 잡고 List add와 remove를 적용하였습니다.

위와 같이 데이터의 갯수를 크게 잡지 않으면 차이가 크게 발생하지 않는다.

 

결론은 순차적으로 추가 및 삭제시 ArrayList

비순차적인 추가 및 삭제는 LinkedList가 속도가 더 빠르다.

 

참조 - 강북쌍용교육센터 교육중..