ArrayList 확장 원리 - 1.8 기반

글 목록
  • ArrayList 확장 원리 - 1.8 기반
  • ArrayList 의 속성 필드
  • 구조 방법
  • 무 참
  • 는 인삼 initial Capacity
  • 가 있 습 니 다.
  • 인삼 Collection extends E > c
  • 확장
  • ArrayList 확장 원리 - 1.8 기반
    ArrayList 의 속성 필드
    이것 은 기본 용량 으로 무 참 구 조 를 겨냥 한 것 이다
    private static final int DEFAULT_CAPACITY = 10;
    

    빈 배열
    private static final Object[] EMPTY_ELEMENTDATA = {};
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    

    array List 는 요소 의 위 치 를 저장 합 니 다. element Data 의 실제 길이 와 list 의 길이 가 다 를 수 있 기 때문에 직렬 화 할 때 공간 을 절약 하기 위해 transient 를 사 용 했 습 니 다. 구체 적 으로 writeObject readObject 를 볼 수 있 습 니 다.
    transient Object[] elementData;
    

    list 에서 요소 의 수량 (element Data 의 길 이 를 구분 합 니 다)
    private int size;
    

    구조 방법
    무참
    public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }
    

    여 기 는 element Data 를 초기 화 했 을 뿐 빈 배열 을 부 여 했 습 니 다.확장 작업 을 하지 않 았 다.
    참조 initial Capacity 가 있 습 니 다.
    public ArrayList(int initialCapacity) {
            if (initialCapacity > 0) {
                this.elementData = new Object[initialCapacity];
            } else if (initialCapacity == 0) {
                this.elementData = EMPTY_ELEMENTDATA;
            } else {
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            }
        }
    

    이곳 의 매개 변 수 는 초기 용량 이다.0 보다 작 으 면 이상 을 던 져 0 효과 와 무 삼 구조 가 같다.
    Collection extends E > c 가 있 습 니 다.
    public ArrayList(Collection<? extends E> c) {
            elementData = c.toArray();
            if ((size = elementData.length) != 0) {
                // c.toArray might (incorrectly) not return Object[] (see 6260652)
                if (elementData.getClass() != Object[].class)
                    elementData = Arrays.copyOf(elementData, size, Object[].class);
            } else {
                // replace with empty array.
                this.elementData = EMPTY_ELEMENTDATA;
            }
        }
    

    이 매개 변 수 는 집합 입 니 다. 집합 크기 는 0 과 인삼 이 다 르 지 않 고 집합 크기 가 0 이 아 닐 때 size 에 값 을 부여 합 니 다.그리고 클 라 스 를 판단 하고 복사 합 니 다.
    용량 을 늘리다
    Array List 의 확장 은 모두 새로운 요 소 를 추가 하 는 과정 에서 발생 합 니 다.우 리 는 * * add (E e) * * 방법 을 예 로 들 면:
    	public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
        private static int calculateCapacity(Object[] elementData, int minCapacity) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            }
            return minCapacity;
        }
    
        private void ensureCapacityInternal(int minCapacity) {
            ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
        }
    
        private void ensureExplicitCapacity(int minCapacity) {
            modCount++;
    
            // overflow-conscious code
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
    

    add 방법 을 호출 하면 최소 용량 (size + 1) 의 계산 을 먼저 진행 합 니 다. element Data 가 빈 배열 이면 계산 결 과 는 DEFAULT 입 니 다.CAPACITY, 그렇지 않 으 면 Math. max (size + 1, DEFAULT CAPACITY) 로 돌아 갑 니 다. 그 다음 에 계 산 된 minCapacity 와 element Data. size () 크기 를 비교 하여 확장 이 필요 한 지 판단 합 니 다.
    	private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    

    grow 야 말로 진정 으로 확장 하 는 과정 이다.용량 을 늘 리 는 과정 은 elementData. size > > 1 입 니 다.그리고 판단 과 Integer. MAXVALUE 의 차 이 는 넘 치 는 지 확인 합 니 다.
  • addAll 을 사용 하면 element Data. size > > 1 이후 에 도 최소 용량 의 조건 을 만족 시 키 지 못 할 수 있 습 니 다 *
  • 확장: System 원본 에 있 는 arraycopy () 표 지 는 native 로 JDK 의 로 컬 라 이브 러 리 를 의미 합 니 다. IO 작업 이 불가피 합 니 다. ArrayList 를 자주 확장 하면 ArrayList 의 사용 성능 이 떨 어 질 수 있 습 니 다. 따라서 요소 의 개 수 를 확인 할 때 ArrayList 의 저장 가능 한 요소 의 개 수 를 미리 알 고 지정 할 수 있 습 니 다.이렇게 하면 우리 가 Array List 에 요 소 를 추가 할 때 Array List 의 자동 확장 을 피하 고 Array List 의 성능 을 향상 시 킬 수 있다.

    좋은 웹페이지 즐겨찾기