[JAVA] | ArrayList vs LinkedList

0

ArrayList와 LinkedList는 List 인터페이스를 상속받았다.

  • List : 인터페이스
  • ArrayList LinkedList : List 인터페이스를 상속받음

자바코드

List array = new ArrayList( );
List linked = new LinkedList( );






ArrayList는 데이터를 "읽기"가 편하다.

  • 데이터들을 배열에서 관리한다.
  • 그래서 각각의 데이터들은 인덱스를 가지고 있다.
  • 데이터를 인덱스로 불러올 수 있기 때문에 읽기 편하다.

  • 그러나 삭제, 추가할 때마다 새로운 배열을 만들고 그 곳에 기존의 데이터들을 복사해야 해줘야 한다.
  • 이렇게 수정할 때마다 배열을 처음부터 다시 만들어야 하기 때문에 수정하기에는 불편하다.
  • 그래서 수정할 때마다 객체 주소가 바뀐다.

  • 수정할 땐 느리고, 찾을 땐 빠르다.

자바코드

import java.util.ArrayList;
import java.util.List;

public class ArrayListExam {

	public static void main(String[] args) {
		
		List<Integer> arrList = new ArrayList();
		
		arrList.add(10); 
		arrList.add(20); 
		arrList.add(30);
		
		for (int i=0; i<arrList.size(); i++) {
			System.out.printf("%d : %d\n", i, arrList.get(i));
		}
	}
}

콘솔(CTRL+F11)

0 : 10
1 : 20
2 : 30









LinkedList는 데이터를 "수정"이 편하다.

  • 각각의 데이터들이 자신의 데이터next 데이터의 객체주소를 가지고 있는채로.
  • 노드로 이어져있다.
  • 그래서 인덱스가 없다.

  • 추가, 삭제할 때마다 노드를 새로운 데이터의 객체와 이으면 된다.
  • 기존의 데이터를 새로운 곳에 복사해줄 필요가 없기 때문에 수정할 때 빠르고 편하다.
  • 하지만 인덱스가 없어서, 데이터를 찾을 때마다 첫 부분부터 찾아야 한다.

  • 수정할 땐 빠르고, 찾을 땐 느리다.

자바코드

import java.util.LinkedList;
import java.util.List;

public class LinkedListExam {
	public static void main(String[] args) {
		
		List<Integer> lnkList = new LinkedList<Integer>();
		
		lnkList.add(10); 
		lnkList.add(20); 
		
		for (int i=0; i<lnkList.size(); i++) {
			System.out.printf("%d : %d\n", i, lnkList.get(i));
		}
		
		System.out.println();
		
		lnkList.add(1,30);
		
		for (int i=0; i<lnkList.size(); i++) {
			System.out.printf("%d : %d\n", i, lnkList.get(i));
		}
	}
}

콘솔(CTRL+F11)

0 : 10
1 : 20

0 : 10
1 : 30
2 : 20








LinkedList는 어떻게 next 데이터의 객체주소를 알까?

  • 객체는 리터럴값과 객체의 주소값도 동시에 가질 수 있어서

자바코드

public class BoxExam {
  class Box {
      int val;
      Box nextBox;
  }
  
  Box box1 = new Box();
  box1.val = 10;
  
  Box box2 = new Box();
  box1.nextBox = box2;
}







LinkedList 설명 사진

profile
몇 번을 넘어져도 앞으로 계속 나아가자

0개의 댓글