ArrayList 소스 학습(2)

2984 단어

두 개의 빈 그룹 상수 속성


Array List 원본 학습(1)에서 Array List의 구조 방법을 상세하게 설명했지만 두 개의 정적 공수조 상량 속성 EMPTY_ELEMENTDATADEFAULTCAPACITY_EMPTY_ELEMENTDATA에 대해 설명하지 않았다. 사실 이 두 속성은 주로 Array List 대상을 호출할 때 현재 대상을 만들 때 어떤 구조 방법을 호출했는지 확인하기 위해서이다.
  • elementDataDEFAULTCAPACITY_EMPTY_ELEMENTDATA이면 매개 변수가 없는 구조 방법을 사용했기 때문에 초기 용량은 DEFAULT_CAPACITY
  • 만약에 elementDataEMPTY_ELEMENTDATA이라면 파라미터가 있는 구조방법을 호출한 것이고 초기 용량은 구조방법의 파라미터에 의해
  • 이 결정된다.

    요소 추가

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  
        elementData[size++] = e;
        return true;
    }
    

    대상을 만든 후에 우리는 메모리에 데이터를 저장할 수 있다는 것을 의미한다. 용기에 데이터를 추가하려면 먼저 순서표에 충분한 공간이 있는지 확인해야 한다. ensureCapacityInternal 방법은 순서표의 용량을 측정하는 것이다. 이때의 매개 변수는 size+1이고 순서표 대상의 요소 개수는 size이다. 만약에 순서표에 요소를 성공적으로 추가하려면elementData의 용량을 size+1보다 적게 확보해야 하며, 이는 순차표의 elementData의 최소 용량입니다.
    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        ensureExplicitCapacity(minCapacity);
     }
    

    먼저 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA을 판단하면 ArrayList 대상을 만들 때 무참구조 방법을 사용하고 이때의 순서표에 데이터가 없기 때문에 DEFAULT_CAPACITY과 파라미터의 최소 용량 minCapacity에서 최대치를 얻어 명확한 최소 용량을 확정한다.
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    
    ensureExplicitCapacity은 순서표의 최소 용량을 명확히 하고 modCount은 순서표 구조가 바뀐 횟수를 나타낸다. 순서표의 최소 용량인 minCapacityelementData의 길이보다 크면 순서표를 확장한다.
    private void grow(int minCapacity) {
        // elementData 
        int oldCapacity = elementData.length;
        // 1.5 
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        // , 
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        // , hugeCapacity 
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // elementData newCapacity , elementData
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    
    hugeCapacity 방법은 int 유형의 길이를 초과하지 않도록 확장하기 위한 것입니다.
        private static int hugeCapacity(int minCapacity) {
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return (minCapacity > MAX_ARRAY_SIZE) ?
                Integer.MAX_VALUE :
                MAX_ARRAY_SIZE;
        }
    
    minCapacity < 0은 확장된 용량이 int 유형의 최대치를 초과했음을 의미하며, 이때 메모리가 넘치는 오류가 발생했습니다.최소 용량이 순차표 최대 용량보다 크면 Integer.MAX_VALUE을 새 용량으로 하고 그렇지 않으면 MAX_ARRAY_SIZE을 새 용량으로 한다

    좋은 웹페이지 즐겨찾기