JAVA Vector 소스 코드 분석 및 예제 코드
Vector 4
//
Vector()
// capacity Vector 。 , 。
Vector(int capacity)
// capacity Vector ,capacityIncrement Vector 。
Vector(int capacity, int capacityIncrement)
// collection Vector
Vector(Collection<? extends E> collection)
벡터 API
synchronized boolean add(E object)
void add(int location, E object)
synchronized boolean addAll(Collection<? extends E> collection)
synchronized boolean addAll(int location, Collection<? extends E> collection)
synchronized void addElement(E object)
synchronized int capacity()
void clear()
synchronized Object clone()
boolean contains(Object object)
synchronized boolean containsAll(Collection<?> collection)
synchronized void copyInto(Object[] elements)
synchronized E elementAt(int location)
Enumeration<E> elements()
synchronized void ensureCapacity(int minimumCapacity)
synchronized boolean equals(Object object)
synchronized E firstElement()
E get(int location)
synchronized int hashCode()
synchronized int indexOf(Object object, int location)
int indexOf(Object object)
synchronized void insertElementAt(E object, int location)
synchronized boolean isEmpty()
synchronized E lastElement()
synchronized int lastIndexOf(Object object, int location)
synchronized int lastIndexOf(Object object)
synchronized E remove(int location)
boolean remove(Object object)
synchronized boolean removeAll(Collection<?> collection)
synchronized void removeAllElements()
synchronized boolean removeElement(Object object)
synchronized void removeElementAt(int location)
synchronized boolean retainAll(Collection<?> collection)
synchronized E set(int location, E object)
synchronized void setElementAt(E object, int location)
synchronized void setSize(int length)
synchronized int size()
synchronized List<E> subList(int start, int end)
synchronized <T> T[] toArray(T[] contents)
synchronized Object[] toArray()
synchronized String toString()
synchronized void trimToSize()
제2 부분 Vector 소스 코드 분석 은 Vector 의 원 리 를 더욱 잘 이해 하기 위해 Vector 소스 코드 를 분석 합 니 다
package java.util;
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
// Vector
protected Object[] elementData;
//
protected int elementCount;
//
protected int capacityIncrement;
// Vector
private static final long serialVersionUID = -2767605614048989439L;
// Vector 。 10。
public Vector() {
this(10);
}
// Vector
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
// Vector" " " "
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
// , initialCapacity
this.elementData = new Object[initialCapacity];
//
this.capacityIncrement = capacityIncrement;
}
// Vector 。
public Vector(Collection<? extends E> c) {
// “ (c)” , elementData
elementData = c.toArray();
//
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
// Vector anArray
public synchronized void copyInto(Object[] anArray) {
System.arraycopy(elementData, 0, anArray, 0, elementCount);
}
// =
public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
// “Vector ”
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
// Vector , 。
// >0( capacityIncrement>0), capacityIncrement
// , 。
if (minCapacity > oldCapacity) {
Object[] oldData = elementData;
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
// Vector 。
public synchronized void ensureCapacity(int minCapacity) {
// Vector +1
modCount++;
ensureCapacityHelper(minCapacity);
}
// newSize
public synchronized void setSize(int newSize) {
modCount++;
if (newSize > elementCount) {
// "newSize Vector ", Vector 。
ensureCapacityHelper(newSize);
} else {
// "newSize / Vector ", newSize null
for (int i = newSize ; i < elementCount ; i++) {
elementData[i] = null;
}
}
elementCount = newSize;
}
// “Vector ”
public synchronized int capacity() {
return elementData.length;
}
// “Vector ”, Vector
public synchronized int size() {
return elementCount;
}
// Vector
public synchronized boolean isEmpty() {
return elementCount == 0;
}
// “Vector Enumeration”
public Enumeration<E> elements() {
// Enumeration
return new Enumeration<E>() {
int count = 0;
//
public boolean hasMoreElements() {
return count < elementCount;
}
//
public E nextElement() {
synchronized (Vector.this) {
if (count < elementCount) {
return (E)elementData[count++];
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
// Vector (o)
public boolean contains(Object o) {
return indexOf(o, 0) >= 0;
}
// index (o)。
// , ; , -1
public synchronized int indexOf(Object o, int index) {
if (o == null) {
// null, null ,
for (int i = index ; i < elementCount ; i++)
if (elementData[i]==null)
return i;
} else {
// null, ,
for (int i = index ; i < elementCount ; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
// (o) Vector
public int indexOf(Object o) {
return indexOf(o, 0);
}
// (o)。
public synchronized int lastIndexOf(Object o) {
return lastIndexOf(o, elementCount-1);
}
// (o)。 index ;
// , “ ”; , -1。
public synchronized int lastIndexOf(Object o, int index) {
if (index >= elementCount)
throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
if (o == null) {
// null, null ,
for (int i = index; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
// null, ,
for (int i = index; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
// Vector index 。
// index ,
public synchronized E elementAt(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
return (E)elementData[index];
}
// Vector 。
// , !
public synchronized E firstElement() {
if (elementCount == 0) {
throw new NoSuchElementException();
}
return (E)elementData[0];
}
// Vector 。
// , !
public synchronized E lastElement() {
if (elementCount == 0) {
throw new NoSuchElementException();
}
return (E)elementData[elementCount - 1];
}
// index obj
public synchronized void setElementAt(E obj, int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
elementData[index] = obj;
}
// index
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
} else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */
}
// index (obj)
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
// “ obj” Vector
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
// Vector obj。
// , true; , false。
public synchronized boolean removeElement(Object obj) {
modCount++;
int i = indexOf(obj);
if (i >= 0) {
removeElementAt(i);
return true;
}
return false;
}
// Vector
public synchronized void removeAllElements() {
modCount++;
// Vector null
for (int i = 0; i < elementCount; i++)
elementData[i] = null;
elementCount = 0;
}
//
public synchronized Object clone() {
try {
Vector<E> v = (Vector<E>) super.clone();
// Vector v
v.elementData = Arrays.copyOf(elementData, elementCount);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
// Object
public synchronized Object[] toArray() {
return Arrays.copyOf(elementData, elementCount);
}
// Vector 。 , T
public synchronized <T> T[] toArray(T[] a) {
// a < Vector ;
// T[] , “Vector ”, “Vector”
if (a.length < elementCount)
return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());
// a >= Vector ;
// Vector a 。
System.arraycopy(elementData, 0, a, 0, elementCount);
if (a.length > elementCount)
a[elementCount] = null;
return a;
}
// index
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return (E)elementData[index];
}
// index element。 index
public synchronized E set(int index, E element) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
Object oldValue = elementData[index];
elementData[index] = element;
return (E)oldValue;
}
// “ e” Vector 。
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
// Vector o
public boolean remove(Object o) {
return removeElement(o);
}
// index element
public void add(int index, E element) {
insertElementAt(element, index);
}
// index , index
public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
Object 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 (E)oldValue;
}
// Vector
public void clear() {
removeAllElements();
}
// Vector c
public synchronized boolean containsAll(Collection<?> c) {
return super.containsAll(c);
}
// c Vector
public synchronized boolean addAll(Collection<? extends E> c) {
modCount++;
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityHelper(elementCount + numNew);
// c elementData
System.arraycopy(a, 0, elementData, elementCount, numNew);
elementCount += numNew;
return numNew != 0;
}
// c
public synchronized boolean removeAll(Collection<?> c) {
return super.removeAll(c);
}
// “ c ”
public synchronized boolean retainAll(Collection<?> c) {
return super.retainAll(c);
}
// index , c Vector
public synchronized boolean addAll(int index, Collection<? extends E> c) {
modCount++;
if (index < 0 || index > elementCount)
throw new ArrayIndexOutOfBoundsException(index);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityHelper(elementCount + numNew);
int numMoved = elementCount - index;
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
System.arraycopy(a, 0, elementData, index, numNew);
elementCount += numNew;
return numNew != 0;
}
//
public synchronized boolean equals(Object o) {
return super.equals(o);
}
//
public synchronized int hashCode() {
return super.hashCode();
}
// toString()
public synchronized String toString() {
return super.toString();
}
// Vector fromIndex( ) toIndex( )
public synchronized List<E> subList(int fromIndex, int toIndex) {
return Collections.synchronizedList(super.subList(fromIndex, toIndex), this);
}
// Vector fromIndex toIndex
protected synchronized void removeRange(int fromIndex, int toIndex) {
modCount++;
int numMoved = elementCount - toIndex;
System.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
// Let gc do its work
int newElementCount = elementCount - (toIndex-fromIndex);
while (elementCount != newElementCount)
elementData[--elementCount] = null;
}
// java.io.Serializable
private synchronized void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.defaultWriteObject();
}
}
요약:(01)Vector 는 실제 적 으로 하나의 배열 을 통 해 데 이 터 를 저장 합 니 다.우리 가 Vecotr 를 구성 할 때;기본 구조 함 수 를 사용 하면 Vector 의 기본 용량 크기 는 10 입 니 다.(02)벡터 의 용량 이 모든 요 소 를 수용 할 수 없 을 때 벡터 의 용량 이 증가한다.용량 증가 계수>0 이면 용량 의 값 을'용량 증가 계수'로 증가 합 니 다.그렇지 않 으 면 용량 크기 를 배로 늘 립 니 다.03)Vector 의 클론 함수,즉 모든 요 소 를 하나의 배열 에 복제 하 는 것 입 니 다. 세 번 째 부분 Vector 스 트 리밍 방식 Vector 는 4 가지 스 트 리밍 방식 을 지원 합 니 다.효율 문제 때문에 아래 의 두 번 째 종 류 를 사용 하여 Vector 를 옮 겨 다 니 는 것 을 권장 합 니 다
(01) , 。 Iterator 。
Integer value = null;
int size = vec.size();
for (int i=0; i<size; i++) {
value = (Integer)vec.get(i);
}
(02) , , 。
Vector RandomAccess , 。
Integer value = null;
int size = vec.size();
for (int i=0; i<size; i++) {
value = (Integer)vec.get(i);
}
(03) , for 。 :
Integer value = null;
for (Integer integ:vec) {
value = integ;
}
(04) ,Enumeration 。 :
Integer value = null;
Enumeration enu = vec.elements();
while (enu.hasMoreElements()) {
value = (Integer)enu.nextElement();
}
이러한 스 트 리밍 방식 의 효율 을 테스트 하 는 코드 는 다음 과 같다.제4 부분 벡터 예시 아래 예 시 를 통 해 벡터 를 어떻게 사용 하 는 지 배 웁 니 다
import java.util.*;
/*
* @desc Vector 。
*
* @author skywang
*/
public class VectorRandomAccessTest {
public static void main(String[] args) {
Vector vec= new Vector();
for (int i=0; i<100000; i++)
vec.add(i);
iteratorThroughRandomAccess(vec) ;
iteratorThroughIterator(vec) ;
iteratorThroughFor2(vec) ;
iteratorThroughEnumeration(vec) ;
}
private static void isRandomAccessSupported(List list) {
if (list instanceof RandomAccess) {
System.out.println("RandomAccess implemented!");
} else {
System.out.println("RandomAccess not implemented!");
}
}
public static void iteratorThroughRandomAccess(List list) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for (int i=0; i<list.size(); i++) {
list.get(i);
}
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughRandomAccess:" + interval+" ms");
}
public static void iteratorThroughIterator(List list) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
iter.next();
}
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughIterator:" + interval+" ms");
}
public static void iteratorThroughFor2(List list) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for(Object obj:list)
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughFor2:" + interval+" ms");
}
public static void iteratorThroughEnumeration(Vector vec) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for(Enumeration enu = vec.elements(); enu.hasMoreElements(); ) {
enu.nextElement();
}
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughEnumeration:" + interval+" ms");
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.