배열 리스트는 내부에 배열을 사용해서 필요한 배열의 크기를 미리 확보해야 한다. 데이터가 얼마나 추가될지 예측 할 수 없는 경우 나머지 공간은 사용되지 않고 낭비된다.
배열의 앞이나 중간에 데이터를 추가하는 경우 추가할 데이터의 공간을 확보하기 위해 기존 데이터들을 오른쪽으로 이동해야 한다. 이처럼 앞이나 중간에 데이터를 추가 또는 삭제하는 경우 많은 데이터를 이동시켜야 해 성능이 좋지 않다.
낭비되는 메모리 없이 딱 필요한 만큼만 메모리를 확보해서 사용하고, 또 앞이나 ㅈ우간에 데이터를 추가하거나 삭제할 때 노드를 사용해 각 노드를 연결하면 문제가 해결된다.
Node
인스턴스를 생성하고 item
에 A를 넣는다.Node
인스턴스를 생성하고 item
에 B를 넣는다.Node next
필드에 새로 만든 노드의 참조값을 넣어준다.node.next
를 호출하면 두번째 노드를 구할 수 있다.Node
인스턴스를 생성하고 item
에 "C"를 넣어준다.Node next
필드에 새로 만든 노드의 참조값을 넣어준다. public void add(Object e) {
Node newNode = new Node(e);
if (first == null) {
first = newNode;
} else {
Node lastNode = getLastNode();
lastNode.next = newNode;
}
size++;
}
private Node getLastNode() {
Node x = first;
while (x.next != null) {
x = x.next;
}
return x;
}
first
값이 null
이면 new Node
를 first
값으로 지정first
값이 not null
이면 노드의 마지막 값을 가지고와 그 노드의 next
값을 new node
값으로 지정public Object get(int index) {
Node node = getNode(index);
return node.item;
}
private Node getNode(int index) {
Node x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
getNode(int index)
메서드로 입력받은 인덱스 위치의 노드값 반환get(int index)
메서드로 입력받은 인덱스 위치의 노드 객체 item
값 반환 public int indexOf(Object o) {
int index = 0;
for (Node x = first; x != null; x = x.next) {
if (o.equals(x.item))
return index;
index++;
}
return -1;
}
index
값 반환후 for
문 종료Object get(int index)
void add(Object o)
int indexOf(Object o)
equals()
를 사용해서 같은 데이터가 있는지 찾는다.void add(int index,Object e)
Object remove(int index)
public void add(int index, Object e) {
Node newNode = new Node(e);
if (index == 0) {
newNode.next = first;
first = newNode;
} else {
Node prev = getNode(index - 1);
newNode.next = prev.next;
prev.next = newNode;
}
size++;
}
index==0
이면 새롭게 생성한 노드 값의 다음을 first
로 변경index!=0
이면 index-1
위치의 노드값 파악index-1
값 다음의 노드를 새로 생성한 노드의 next
값으로, 새로 생성한 노드의 prev
값을 index-1
노드의 값으로 설정public Object remove(int index) {
Node removeNode = getNode(index);
Object removedItem = removeNode.item;
if (index == 0) {
first = removeNode.next;
} else {
Node prev = getNode(index - 1);
prev.next = removeNode.next;
}
removeNode.item = null;
removeNode.next = null;
size--;
return removedItem;
}
index==0
이면 첫번째 값을 제거하겠다는 의미이므로 first
값을 removeNode.next
값으로 함index!=0
이먄 입력받은 인덱스 이전의 노드값을 구한 후 인덱스 이전의 노드 next
를 removeNode.next
값으로 설정removeNode
값을 모두 초기화데이터를 조회할 일이 많고 뒷 부분에 데이터를 추가한다면 배열리스트가 더 좋은 성능을 제공한다.
앞쪽의 데이터를 추가하거나 삭제할 일이 많다면 연결리스트를 사용하는 게 보통 더 좋은 성능을 제공한다.
출처: https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-2/dashboard