자바 용기 소스 코드 LinkedList 원리 분석
4077 단어 Java용기.LinkedList
LinkedList 는 양 방향 링크 구 조 를 사용 하여 이 루어 진 용기 로 Array List 와 마찬가지 로 길 이 를 동적 으로 확장 할 수 있 습 니 다.LinkedList 는 Array List 에 비해 임의의 위치 삽입 속도 가 Array List 보다 빠 르 지만 조회 속 도 는 Array List 보다 느 립 니 다.LinkedList 는 AbstractSequential List 를 계승 하여 List,Deque,Cloneable,Serializable 인 터 페 이 스 를 실현 했다.
LinkedList UML 그림 은 다음 과 같 습 니 다.
ArrayList 와 마찬가지 로 LinkedList 도 스 레 드 가 안전 한 용기 가 아 닙 니 다.
LinkedList 소스 코드 분석
구조 방법
LinkedList 는 두 가지 구조 방법 이 있 습 니 다.
public LinkedList() {
}
// LinkedList
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
addAll()방법:
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}
public boolean addAll(int index, Collection<? extends E> c) {
// index
checkPositionIndex(index);
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
// index node node
//succ: index node
//pred:index node
Node<E> pred, succ;
if (index == size) {
succ = null;
pred = last;
} else {
succ = node(index);
pred = succ.prev;
}
// ,
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
if (succ == null) {
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
}
size += numNew;
modCount++;
return true;
}
add 방법링크 드 리스트 에 도 두 가지 add 방법 이 있 습 니 다.다음 과 같 습 니 다.
public boolean add(E e) {
//
linkLast(e);
return true;
}
public void add(int index, E element) {
// index
checkPositionIndex(index);
if (index == size)
//index == size,
linkLast(element);
else
//index != size, index
linkBefore(element, node(index));
}
linkLast 방법:
void linkLast(E e) {
final Node<E> l = last;
// node,
final Node<E> newNode = new Node<>(l, e, null);
//
last = newNode;
if (l == null)
// last==null
first = newNode;
else
//
l.next = newNode;
size++;
modCount++;
}
linkBefore 방법:
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
// node pred
final Node<E> pred = succ.prev;
// node, pred
final Node<E> newNode = new Node<>(pred, e, succ);
// node ,
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
지정 한 위치 node 포인터 가 져 오 는 방법 node:
Node<E> node(int index) {
// assert isElementIndex(index);
//index > size/2 , ,
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
//index < size/2 ,
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
get 방법 도 간단 합 니 다.먼저 index 가 넘 치 는 지 확인 한 다음 index 위치 에 있 는 요 소 를 직접 찾 아 item 을 되 돌려 줍 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.