자바 벡터 소스 학습
public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
1. 자동 확장 메커니즘
The Vector class implements a growable array of objects. Like an array, it contains components that can be accessed using an integer index. However, the size of a Vector can grow or shrink as needed to accommodate adding and removing items after the Vector has been created.
protected Object[] elementData;
proctected int element Count 로 초기 화 합 니 다.원소 개수 protected int capacity Increment;증가 개수 public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
분배 여 부 를 판단 하 는 관건: capacity Increment 0 시, 매번 capacity Increment 개 요 소 를 증가 합 니 다.capacity Increment & lt; = 0 시, 2 배 증폭; private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
clear 실현 public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
int numMoved = elementCount - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--elementCount] = null; // Let gc do its work
return oldValue;
}
바 텀 배열 의 용량 public synchronized void removeAllElements() {
modCount++;
// Let gc do its work
for (int i = 0; i < elementCount; i++)
elementData[i] = null;
elementCount = 0;
}
2. 스 레 드 안전
jdk1.0 Vector ,jdk1.2 ArrayList
Vector 는 가 변 상 태 를 대상 내부 에 밀봉 하고 대상 잠 금 을 통 해 가 변 상태 에 접근 하 는 모든 코드 를 동기 화하 여 이 대상 에 동시 접근 하지 않도록 합 니 다.
Array List 를 비교 해 보면 모든 방법 에 키 워드 를 추가
synchronized
한 것 을 발견 할 수 있다.public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
3. Fail - Fast 메커니즘
Vector 가 돌아 온 Iterator 도 fail - fast 입 니 다.
public synchronized int size() {
return elementCount;
}
Vector 가 Iterator 를 만 든 후, 추가 삭제 작업 을 진행 합 니 다. modCount 변화. - ConcurrentModificationException
총화
public synchronized Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
// Racy but within spec, since modifications are checked
// within or after synchronization in next/previous
return cursor != elementCount;
}
public E next() {
synchronized (Vector.this) {
checkForComodification();
int i = cursor;
if (i >= elementCount)
throw new NoSuchElementException();
cursor = i + 1;
return elementData(lastRet = i);
}
}
}
this
대상 으로 잠 긴 대상 을 제어 할 수 없습니다.SynchronizedList
의 동기 화 는 synchronized
코드 블록 이 mutex
대상 에 자 물 쇠 를 추가 하 는 것 을 사용 합 니 다. 이 mutex
대상 은 구조 함 수 를 통 해 전 달 될 수 있 습 니 다. 즉, 우 리 는 잠 금 대상 을 지정 할 수 있 습 니 다.(2) 교체 에 대해 자 물 쇠 를 늘 려 야 합 니 다. Iterator. reove () 의 작은 자 물 쇠 는 필요 하지 않 고 추가 비용 이 필요 합 니 다.synchronizedList. iterator () 는 동기 화 된 키 가 없 으 며 스스로 자 물 쇠 를 늘 렸 습 니 다. Iterator. remove () 는 자물쇠 가 없습니다.if(!vector.contains(e)){
vector.add(e);
}
@ 드 림 웍 스 2018.3.7
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.