ArrayList 구현

6432 단어
1. ArrayList류의 실질
ArrayList 베이스는 Object 유형의 배열로 이루어지며, 매개변수가 없는 구조 방법을 사용하여 ArrayList 객체를 생성하면 실제로는 베이스에 10 길이의 Object 유형 배열이 생성됩니다.
먼저,ArrayList는 ArrayList의 대상 목록을 저장하기 위한 개인 서열화되지 않은 요소 데이터를 정의했다(초기화되지 않은 것만 정의함):private transient Object[] 요소 데이터;그 다음에 초기 용량(Capacity)을 지정하거나 지정한 콜렉션을 인용형 그룹으로 변환한 후 요소 데이터 그룹을 실례화한다.지정하지 않으면 초기 용량은 10으로 미리 설정
실례화개인 그룹을 미리 실례화한 다음copyOf 방법을 통해 원 그룹을 덮어쓰는 것이 ArrayList의 크기 (size) 를 자동으로 바꾸는 관건이다.어떤 분이 Array List는 복잡한 수조라고 하셨어요.
차라리 ArrayList가 배열에 관한 시스템의 방법 조합이라고 생각하는 것이 낫다.
ArrayList의 구성 방법은 다음과 같습니다.
//지정된 초기 용량으로 빈 목록을 구성합니다.
 1: public ArrayList(int initialCapacity) {
 2:  super();
 3:  if (initialCapacity < 0)
 4:  throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
 5:  this.elementData = new Object[initialCapacity];//                  
 6: }
 1: //       10       
 2: public ArrayList() {
 3:  this(10);
 4: }
 5:  
 6: / *      collection            collection     
 7: * @param c   ,           t
 8: * @throws NullPointerException         null
 9: */
 10: public ArrayList(Collection<? extends E> c) {
 11:  elementData = c.toArray();// Collection     elementData
 12:  size = elementData.length;
 13:  if (elementData.getClass() != Object[].class)
 14:  elementData = Arrays.copyOf(elementData, size, Object[].class);
 15: }

2. ArrayList는 자동으로 크기 메커니즘을 변경합니다.
이 메커니즘을 실현하기 위해 자바는Capacity와size 개념을 도입하여 수조의length를 구별했다.사용자가 새로운 목록 대상을 추가할 수 있도록 자바에서 최소 용량(minCapacity)을 설정합니다.
, 통상적으로 목록 대상의 수보다 크기 때문에Capactiy는 밑바닥 그룹의 길이(length)이지만 최종 사용자에게 무의미하다.크기는 목록을 저장합니다
대상의 수량이야말로 최종 사용자가 필요로 하는 것이다.사용자의 오류 수정을 방지하기 위해서, 이 속성은privae로 설정되었지만, 크기 () 를 통해 얻을 수 있습니다.
다음은 ArrayList의 초기와 목록 대상의 증가와 삭제 등 세 가지 상황에서 사이즈 자동 변경 메커니즘을 분석한다.
1, 초기 용량 및 크기 값
위에서 제시한 ArrayList 구조 방법의 원본에서Capacity 초기값(initial Capacity)은 사용자가 직접 지정하거나 사용자가 지정한 Collection 집합으로 저장할 수 있음을 알 수 있다
저장된 객체 수가 결정되며 지정되지 않은 경우 시스템은 기본적으로 10입니다.그리고 size는 int형 변수로 성명되며 기본값은 0입니다. 사용자가 Collection을 지정하여 ArrayList를 만들 때 size 값은
initialCapacity.
2,dd() 방법
이 메서드의 소스는 다음과 같습니다.
public boolean add(E) {ensure Capacity Internal(size + 1), element Data [size++] = e;//개체를 추가할 때 size return true;
방법에서 호출된 ensureCapacity 인터넷은 용량을 조정하고 요소 데이터 그룹의 지향을 수정하는 데 사용됩니다.그 중에서 세 가지 방법의 호출이 언급되었는데 그 핵심은grow 방법:private void ensure Capacity Internal(int min Capacity) {modcount+;//Array List에 정의된 부류 AbstractList, 저장 구조 수정 횟수//overflow-conscious code if(minCapacity - element.Datalength > 0)grow(min Capacity)}에 사용된다. 
private void grow(int min Capacity) {/오버플로w-conscious code int old Capacity = element Data.length, int new Capacity = old Capacity > 1)/새 용량이 원용량의 1.5배로 확대돼 원수치를 2로 나누는 것을 오른쪽으로 옮겼다.if(new Capacity - Capacity < 0) new Capacity = minacity = Capacity, inif(new Capacity Capacity: Capacity, if(new Capacacity Capacity - Capacity - MAXAXASIARASISI;//minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
private static int hugeCapacity(int min Capacity) {if(min Capacity < 0)/overflow throw new Out Out Memory Error(), return(min Capacity > MAX ARRRRAY SIZE)? Integer. MAX ARRRRAY SIZE(Internacity << << 0) Inter//Overrrrrrrrrrrrrrrrrrrrrrrrrrquity << << 0 overtitity << a a a titic <<객체를 추가할 때원래 객체 수에 1을 더하면 원래 하위 배열 길이보다 크면 새 길이가 됩니다.
새 그룹을 가리키는 원수 그룹의 복사본을 만들고 원수 그룹을 수정합니다.원수 그룹 자동 폐기 (자바 쓰레기 회수 메커니즘 자동 회수).size는 그룹에 대상을 추가하여 1을 증가시킵니다.
주석:
//이 클래스의 상수에 정의되어 있으며, 그룹의 크기 최대 값을 분배합니다.일부 VMs는 배열에 헤더를 저장하여 더 큰 배열을 지정하려고 하면 OutOfMemoryError: 배열이 요청될 수 있음
크기가 VM 한계를 초과합니다.private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//java에서.lang.Integer 클래스의 상수 MINVALUE、MAX_VALUE: public static final int MINVALUE = 0x80000000;//정수 값 구간 하계: - 2147483648 public static final int MAXVALUE = 0x7fffffff;//정형 수치 구간 상계: 2147483647
//java에서.util.AbstractList에서modCount의 정의는 다음과 같습니다:protected transient int modCount = 0;
3. remove() 방법
이 재구성 방법의 원본 코드는 다음과 같다(다른 것은 설명하지 않는다):public E remove(int index) {range Check(index);
modCount++; E oldValue = elementData(index);
int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved);//다음 목록 객체를 elementData[--size] = null;//앞으로 이동합니다.배열이 앞으로 이동하면 크기가 자동으로 줄고 비어 있는 위치는null로 설정되며 구체적인 대상의 소각은 Junk 컬렉터가 return oldValue를 책임집니다.
private void range Check(int index) {//경계 검사if(index < 0 | | index> = this.size) throw new Index Out Of Bounds Exception(out Of Bounds Msg(index)));
EelementData(int index) {//지정한 index가 있는 위치의 대상return(E)elementData[index]를 가져옵니다}
remove () 원본 코드를 학습함으로써 ArrayList 크기를 바꾸는 핵심은dd () 방법과 비슷하고 모두 같은 그룹의 복사라는 것을 알 수 있습니다.
또한 필요할 경우 ArrayList 인스턴스의 용량을 지정하여 시간 비용을 효과적으로 낮출 수 있습니다.이것은 ensureCapacity 인터넷을 호출하여 이루어진 원본 코드입니다
다음과 같습니다:public void ensure Capacity(int min Capacity) {if(min Capacity > 0) ensure Capacity Internal(min Capacity)
size가private이기 때문에 자바에서 접근할 방법을 제시합니다:public int size () {checkForComodification ();return this.size;
위에서 말한 바와 같이, 사용자가 Array List에 대상을 추가할 때, 자바는 항상 용량 (Capacity) 이 적당한지 계산하고, 용량이 부족하면 원래의 그룹을 지정한 용량을 길이로 해서 만든 것으로 복사한다.
새 수조에 원래 수조 변수를 다시 부여하고 새 수조를 가리킨다.이 동시에 사이즈 1은 자체 증가합니다.대상을 삭제할 때, 지정한 index 뒤에 있는 대상을 복사하는 방법을 사용합니다. (만약
있으면) 비어 있는 위치를null로 설정하고 Junk 컬렉터에 맡겨 제거하면 크기가 1씩 줄어들어 완성됩니다.

좋은 웹페이지 즐겨찾기