"List 인터페이스가 모두 끝났다고 생각한다면 오산입니다. 이제 막 시작했습니다. LinkedListArrayList 컬렉션에 대해 말씀드리겠습니다 ."

"ArrayList 컬렉션부터 시작하겠습니다."

"이 컬렉션의 상속 다이어그램은 다음과 같습니다."

"인터페이스가 녹색입니다."

"추상 클래스는 보라색입니다."

"일반 수업은 빨간색입니다."

"실선은 상속을 나타내고 파선은 인터페이스 구현을 나타냅니다."

"이것은 가장 간단한 컬렉션입니다. ArrayList 안에는 요소가 간단한 배열에 저장됩니다."

"어레이에 비해 이 컬렉션의 주요 이점은 확장 기능, 즉 필요에 따라 길이를 늘릴 수 있는 기능입니다."

"배열의 공간이 부족하면 두 번째 큰 배열이 생성되고 첫 번째 배열의 모든 요소가 여기에 복사됩니다. 그런 다음 두 번째 배열이 첫 번째 배열을 대신하고 첫 번째 배열은 버려집니다. 가비지 컬렉터에 의해 파괴됨)."

"배열이 얼마나 더 커지나요?"

"새 배열의 길이는 (3*n)/2+1로 계산됩니다. 여기서 n은 이전 배열의 길이입니다. 즉, 이전 배열의 길이가 100개 요소인 경우 새 배열은 300/2+1이 됩니다. = 151."

"ArrayList의 중간에 요소를 추가할 때 새 요소가 삽입될 위치의 오른쪽에 있는 모든 요소가 오른쪽으로 1 위치 복사된 다음 새 요소가 빈 셀에 추가됩니다."

"가운데에서 요소를 제거하면 해당 요소의 오른쪽에 있는 모든 요소가 왼쪽으로 1위치 복사됩니다."

"ArrayList는 요소를 추가하면 길어지고 요소를 제거하면 짧아진다는 말씀이십니까?"

"아니요, ArrayList 내부의 배열은 자체적으로 더 짧아지지 않습니다. 그러나 trimToSize() 메서드를 호출하여 ArrayList가 내부 배열을 가능한 가장 작은 크기로 축소하도록 강제할 수 있습니다 . "

"물론 LinkedList에 대해서도 말씀드리겠습니다."

"상속 다이어그램은 다음과 같습니다."

"인터페이스가 녹색입니다."

"추상 클래스는 보라색입니다."

"일반 수업은 빨간색입니다."

"실선은 상속을 나타내고 파선은 인터페이스 구현을 나타냅니다."

"이미 알고 있듯이 LinkedList는 요소를 연결된 목록으로 저장합니다."

"항상 그런 말을 듣는데 그게 뭔지 알려주실 수 있나요?"

"그럼요. 간단해요."

"연결된 목록은 a) 데이터를 저장하고 b) 다음 및 이전 요소에 대한 참조를 저장하는 요소로 구성됩니다 ."

"이것은 이러한 요소 에 대한 클래스가 문자열을 저장한 경우의 모습입니다."

설명
class LinkedListElement
{
String data;
LinkedListElement next;
LinkedListElement previous;
}
데이터 필드 요소의 문자열 값을 저장합니다.
next 필드는 목록의 다음 요소에 대한 참조를 저장합니다 . 이전 필드는 목록의 이전
요소 에 대한 참조를 저장합니다 .

"제네릭 형식 선언을 사용하면 다음과 같이 표시됩니다."

제네릭 형식 선언이 있는 연결 목록 요소의 클래스
class LinkedListElement<T>
{
 T data;
 LinkedListElement<T> next;
 LinkedListElement<T> previous;
}

"말이된다."

"더 잘 이해하기 위해 이중 연결 목록에 10개의 요소를 추가하는 코드를 작성해 보겠습니다."

public static void main(String[] args)
{
 LinkedListElement<Integer> tail; // The tail (very last element) of the list

 for(int i = 0; i < 10; i++)
 {
  LinkedListElement<Integer> element = new LinkedListElement<Integer>();
  element.data = i;

  if (tail == null) // If the tail doesn't exist, then make our element the last element
  {
   tail = element;
  }
  else // if there is a tail, add the element
  {
   tail.next = element; // Set the next field on the tail element
   element.previous = tail; // Add a reference to the tail to the new element
   tail = element; // Make the new element the tail
  }
 }
}

"목록에 10개의 요소가 있다고 상상해 보세요. 중간에 요소를 삽입하는 방법은 다음과 같습니다."

List 인터페이스의 구현 - 3

"변경된 링크는 밝은 빨간색 으로 강조 표시됩니다 . 이제 새 요소를 가리킵니다."

"새 링크는 밝은 보라색으로 강조 표시됩니다 . 이웃에 대한 새 요소의 링크입니다."

"그리고 이제 코드로:"

연결 리스트 중간에 요소 삽입
// This field stores the element that is the head of the list
LinkedListElement<Integer> head = …

// Get the 4th element (counting from zero)
LinkedListElement<Integer> element4 = head.next.next.next.next;
// Get the 5th element
LinkedListElement<Integer> element5 = element4.next;

// Create the new element that we will insert
LinkedListElement<Integer> newElement = new LinkedListElement<Integer>();
newElement.data = -18;

// Replace the references in the element on the left
newElement.previous = element4;
element4.next = newElement;

// Replace the references in the element on the right
newElement.next = element5;
element5.previous = newElement;

"고마워요, Ellie. 확실히 목록에 대해 새로운 것을 많이 배웠어요."