ArrayList 확장 원리 - 1.8 기반
14130 단어 #자바 기반자바자바 집합 프레임 워 크ArrayList
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 의 차 이 는 넘 치 는 지 확인 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.