久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Java基礎(chǔ)之容器Vector詳解

瀏覽:167日期:2022-08-14 10:30:32
一、前言

知識(shí)補(bǔ)充:Arrays.copyOf函數(shù):

public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }

可見copyOf()在內(nèi)部新建一個(gè)數(shù)組,調(diào)用arrayCopy()將original內(nèi)容復(fù)制到copy中去,并且長度為newLength。返回copy;

繼續(xù)看一下System.arraycopy函數(shù):

public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

src - 源數(shù)組。

srcPos - 源數(shù)組中的起始位置。

dest - 目標(biāo)數(shù)組。

destPos - 目標(biāo)數(shù)據(jù)中的起始位置。

length - 要復(fù)制的數(shù)組元素的數(shù)量。

該方法是用了native關(guān)鍵字,調(diào)用的為C++編寫的底層函數(shù),可見其為JDK中的底層函數(shù)。

二、Vector簡介

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector類實(shí)現(xiàn)了一個(gè)可增長的對(duì)象數(shù)組,內(nèi)部是以動(dòng)態(tài)數(shù)組的形式來存儲(chǔ)數(shù)據(jù)的。 Vector具有數(shù)組所具有的特性、通過索引支持隨機(jī)訪問、所以通過隨機(jī)訪問Vector中的元素效率非常高、但是執(zhí)行插入、刪除時(shí)效率比較低下。 繼承了AbstractList,此類提供 List 接口的骨干實(shí)現(xiàn),以最大限度地減少實(shí)現(xiàn)”隨機(jī)訪問”數(shù)據(jù)存儲(chǔ)(如數(shù)組)支持的該接口所需的工作.對(duì)于連續(xù)的訪問數(shù)據(jù)(如鏈表),應(yīng)優(yōu)先使用 AbstractSequentialList,而不是此類. 實(shí)現(xiàn)了List接口,意味著Vector元素是有序的,可以重復(fù)的,可以有null元素的集合. 實(shí)現(xiàn)了RandomAccess接口標(biāo)識(shí)著其支持隨機(jī)快速訪問,實(shí)際上,我們查看RandomAccess源碼可以看到,其實(shí)里面什么都沒有定義.因?yàn)锳rrayList底層是數(shù)組,那么隨機(jī)快速訪問是理所當(dāng)然的,訪問速度O(1). 實(shí)現(xiàn)了Cloneable接口,標(biāo)識(shí)著可以它可以被復(fù)制.注意,ArrayList里面的clone()復(fù)制其實(shí)是淺復(fù)制 實(shí)現(xiàn)了Serializable 標(biāo)識(shí)著集合可被序列化。三、Vector源碼

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ //保存Vector數(shù)據(jù)的數(shù)組 protected Object[] elementData; //實(shí)際數(shù)據(jù)的數(shù)量 protected int elementCount; //容量增長的系數(shù) protected int capacityIncrement; // Vector的序列版本號(hào) private static final long serialVersionUID = -2767605614048989439L; //指定Vector初始大小和增長系數(shù)的構(gòu)造函數(shù) public Vector(int initialCapacity, int capacityIncrement) {super();if (initialCapacity < 0) throw new IllegalArgumentException('Illegal Capacity: '+ initialCapacity);this.elementData = new Object[initialCapacity];this.capacityIncrement = capacityIncrement; } //指定初始容量的構(gòu)造函數(shù) public Vector(int initialCapacity) {this(initialCapacity, 0); } //Vector構(gòu)造函數(shù),默認(rèn)容量為10 public Vector() {this(10); } //初始化一個(gè)指定集合數(shù)據(jù)的構(gòu)造函數(shù) public Vector(Collection<? extends E> c) {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數(shù)組中 public synchronized void copyInto(Object[] anArray) {System.arraycopy(elementData, 0, anArray, 0, elementCount); } //當(dāng)前的數(shù)組中元素個(gè)數(shù)大于記錄的元素個(gè)數(shù)時(shí),重新賦值給當(dāng)前數(shù)組所記錄的元素 public synchronized void trimToSize() {modCount++;int oldCapacity = elementData.length;if (elementCount < oldCapacity) { elementData = Arrays.copyOf(elementData, elementCount);} } //確定Vector的容量 public synchronized void ensureCapacity(int minCapacity) {if (minCapacity > 0) { // 將Vector的改變統(tǒng)計(jì)數(shù)+1 modCount++; ensureCapacityHelper(minCapacity);} } //確定容量的幫助函數(shù),如果所需容量大于當(dāng)前的容量時(shí)則執(zhí)行擴(kuò)容 private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length > 0) grow(minCapacity); } //數(shù)組所允許的最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; //執(zhí)行擴(kuò)容函數(shù) private void grow(int minCapacity) {// overflow-conscious code//記錄當(dāng)前容量int oldCapacity = elementData.length;//如果擴(kuò)容系數(shù)大于0則新容量等于當(dāng)前容量+擴(kuò)容系數(shù),如果擴(kuò)容系數(shù)小于等于0則新容量等于當(dāng)前容量的2倍int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);//如果新容量小于當(dāng)前需要的容量,則把需要的容量賦值給需要擴(kuò)容的新容量if (newCapacity - minCapacity < 0) newCapacity = minCapacity; //如果新擴(kuò)容容量大于最大數(shù)組容量,則執(zhí)行巨大擴(kuò)容if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity); } //巨大擴(kuò)容函數(shù),如果所需容量大于最大數(shù)組容量,則返回int形最大值(2^31 -1),否則返回最大數(shù)組容量 private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflow throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } //設(shè)置容量值為newSize,如果newSize大于當(dāng)前容量,則擴(kuò)容,否則newSize以后的所有元素置null public synchronized void setSize(int newSize) {modCount++;if (newSize > elementCount) { ensureCapacityHelper(newSize);} else { for (int i = newSize ; i < elementCount ; i++) {elementData[i] = null; }}elementCount = newSize; } //返回當(dāng)前Vector的容量 public synchronized int capacity() {return elementData.length; } //返回Vector元素的個(gè)數(shù) public synchronized int size() {return elementCount; } //Vector元素個(gè)數(shù)是否為0 public synchronized boolean isEmpty() {return elementCount == 0; } //返回Vector元素的Enumeration,Enumeration 接口是Iterator迭代器的“古老版本” //Enumeration接口中的方法名稱難以記憶,而且沒有Iterator的remove()方法。如果現(xiàn)在編寫Java程序,應(yīng)該盡量采用 //Iterator迭代器,而不是用Enumeration迭代器。 //之所以保留Enumeration接口的原因,主要為了照顧以前那些“古老”的程序,那些程序里大量使用Enumeration接口,如果新版 //本的Java里直接刪除Enumeration接口,將會(huì)導(dǎo)致那些程序全部出錯(cuò)。 public Enumeration<E> elements() {return new Enumeration<E>() { int count = 0; public boolean hasMoreElements() {return count < elementCount; } public E nextElement() {synchronized (Vector.this) { if (count < elementCount) {return elementData(count++); }}throw new NoSuchElementException('Vector Enumeration'); }}; } //返回Vector中是否包含對(duì)象o public boolean contains(Object o) {return indexOf(o, 0) >= 0; } // 查找并返回元素(o)在Vector中的索引值 public int indexOf(Object o) {return indexOf(o, 0); } // 從index位置開始向后查找元素(o)。 // 若找到,則返回元素的索引值;否則,返回-1 public synchronized int indexOf(Object o, int index) {if (o == null) { for (int i = index ; i < elementCount ; i++)if (elementData[i]==null) return i;} else { for (int i = index ; i < elementCount ; i++)if (o.equals(elementData[i])) return i;}return -1; } // 從后向前查找元素(o)。并返回元素的索引 public synchronized int lastIndexOf(Object o) {return lastIndexOf(o, elementCount-1); } // 從index位置開始向前查找元素(o)。 // 若找到,則返回元素的索引值;否則,返回-1 public synchronized int lastIndexOf(Object o, int index) {if (index >= elementCount) throw new IndexOutOfBoundsException(index + ' >= '+ elementCount);if (o == null) { for (int i = index; i >= 0; i--)if (elementData[i]==null) return i;} else { 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 elementData(index); } // 返回Vector中第0位置的元素。 public synchronized E firstElement() {if (elementCount == 0) { throw new NoSuchElementException();}return elementData(0); } // 返回Vector中最后一個(gè)元素。 public synchronized E lastElement() {if (elementCount == 0) { throw new NoSuchElementException();}return elementData(elementCount - 1); } // 設(shè)置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++; } //在vector后面添加對(duì)象obj 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++;// Let gc do its workfor (int i = 0; i < elementCount; i++) elementData[i] = null;elementCount = 0; } //返回Vector的克隆。 該副本將包含對(duì)內(nèi)部數(shù)據(jù)數(shù)組的克隆的引用,而不是對(duì)此對(duì)象的原始內(nèi)部數(shù)據(jù)數(shù)組的引用。 public synchronized Object clone() {try { @SuppressWarnings('unchecked')Vector<E> v = (Vector<E>) super.clone(); 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(e);} } //返回包含Vector所有元素的數(shù)組 public synchronized Object[] toArray() {return Arrays.copyOf(elementData, elementCount); } // 返回Vector的模板數(shù)組。所謂模板數(shù)組,即可以將T設(shè)為任意的數(shù)據(jù)類型 @SuppressWarnings('unchecked') public synchronized <T> T[] toArray(T[] a) {// 若數(shù)組a的大小 < Vector的元素個(gè)數(shù);// 則新建一個(gè)T[]數(shù)組,數(shù)組大小是“Vector的元素個(gè)數(shù)”,并將“Vector”全部拷貝到新數(shù)組中if (a.length < elementCount) return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());// 若數(shù)組a的大小 >= Vector的元素個(gè)數(shù);// 則將Vector的全部元素都拷貝到數(shù)組a中。System.arraycopy(elementData, 0, a, 0, elementCount);if (a.length > elementCount) a[elementCount] = null;return a; } // Positional Access Operations @SuppressWarnings('unchecked') E elementData(int index) {return (E) elementData[index]; } //獲取index處的元素 public synchronized E get(int index) {if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index);return elementData(index); } //設(shè)置index處的元素為element,并返回被替換掉的元素 public synchronized E set(int index, E element) {if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index);elementData[index] = element;return oldValue; } //Vector末尾添加元素 public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true; } //移除Vector中第一個(gè)出現(xiàn)對(duì)象o的元素 public boolean remove(Object o) {return removeElement(o); } //在index位置添加對(duì)象element public void add(int index, E element) {insertElementAt(element, index); } //移除index位置的元素 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 workreturn oldValue; } // 清空Vector public void clear() {removeAllElements(); } // Bulk Operations // 返回Vector是否包含集合c public synchronized boolean containsAll(Collection<?> c) {return super.containsAll(c); } //在Vector末尾添加集合c public synchronized boolean addAll(Collection<? extends E> c) {modCount++;Object[] a = c.toArray();int numNew = a.length;ensureCapacityHelper(elementCount + numNew);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中的元素 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; } // 返回兩個(gè)對(duì)象是否相等 public synchronized boolean equals(Object o) {return super.equals(o); } // 計(jì)算哈希值 public synchronized int hashCode() {return super.hashCode(); } // 調(diào)用父類的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 workint newElementCount = elementCount - (toIndex-fromIndex);while (elementCount != newElementCount) elementData[--elementCount] = null; } // java.io.Serializable的寫入函數(shù) private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {final java.io.ObjectOutputStream.PutField fields = s.putFields();final Object[] data;synchronized (this) { fields.put('capacityIncrement', capacityIncrement); fields.put('elementCount', elementCount); data = elementData.clone();}fields.put('elementData', data);s.writeFields(); } public synchronized ListIterator<E> listIterator(int index) {if (index < 0 || index > elementCount) throw new IndexOutOfBoundsException('Index: '+index);return new ListItr(index); } public synchronized ListIterator<E> listIterator() {return new ListItr(0); } public synchronized Iterator<E> iterator() {return new Itr(); } private class Itr implements Iterator<E> {int cursor; // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint 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); }}public void remove() { if (lastRet == -1)throw new IllegalStateException(); synchronized (Vector.this) {checkForComodification();Vector.this.remove(lastRet);expectedModCount = modCount; } cursor = lastRet; lastRet = -1;}@Overridepublic void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); synchronized (Vector.this) {final int size = elementCount;int i = cursor;if (i >= size) { return;}@SuppressWarnings('unchecked')final E[] elementData = (E[]) Vector.this.elementData;if (i >= elementData.length) { throw new ConcurrentModificationException();}while (i != size && modCount == expectedModCount) { action.accept(elementData[i++]);}// update once at end of iteration to reduce heap write trafficcursor = i;lastRet = i - 1;checkForComodification(); }}final void checkForComodification() { if (modCount != expectedModCount)throw new ConcurrentModificationException();} } final class ListItr extends Itr implements ListIterator<E> {ListItr(int index) { super(); cursor = index;}public boolean hasPrevious() { return cursor != 0;}public int nextIndex() { return cursor;}public int previousIndex() { return cursor - 1;}public E previous() { synchronized (Vector.this) {checkForComodification();int i = cursor - 1;if (i < 0) throw new NoSuchElementException();cursor = i;return elementData(lastRet = i); }}public void set(E e) { if (lastRet == -1)throw new IllegalStateException(); synchronized (Vector.this) {checkForComodification();Vector.this.set(lastRet, e); }}public void add(E e) { int i = cursor; synchronized (Vector.this) {checkForComodification();Vector.this.add(i, e);expectedModCount = modCount; } cursor = i + 1; lastRet = -1;} } @Override public synchronized void forEach(Consumer<? super E> action) {Objects.requireNonNull(action);final int expectedModCount = modCount;@SuppressWarnings('unchecked')final E[] elementData = (E[]) this.elementData;final int elementCount = this.elementCount;for (int i=0; modCount == expectedModCount && i < elementCount; i++) { action.accept(elementData[i]);}if (modCount != expectedModCount) { throw new ConcurrentModificationException();} } @Override @SuppressWarnings('unchecked') public synchronized boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);// figure out which elements are to be removed// any exception thrown from the filter predicate at this stage// will leave the collection unmodifiedint removeCount = 0;final int size = elementCount;final BitSet removeSet = new BitSet(size);final int expectedModCount = modCount;for (int i=0; modCount == expectedModCount && i < size; i++) { @SuppressWarnings('unchecked') final E element = (E) elementData[i]; if (filter.test(element)) {removeSet.set(i);removeCount++; }}if (modCount != expectedModCount) { throw new ConcurrentModificationException();}// shift surviving elements left over the spaces left by removed elementsfinal boolean anyToRemove = removeCount > 0;if (anyToRemove) { final int newSize = size - removeCount; for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {i = removeSet.nextClearBit(i);elementData[j] = elementData[i]; } for (int k=newSize; k < size; k++) {elementData[k] = null; // Let gc do its work } elementCount = newSize; if (modCount != expectedModCount) {throw new ConcurrentModificationException(); } modCount++;}return anyToRemove; } @Override @SuppressWarnings('unchecked') public synchronized void replaceAll(UnaryOperator<E> operator) {Objects.requireNonNull(operator);final int expectedModCount = modCount;final int size = elementCount;for (int i=0; modCount == expectedModCount && i < size; i++) { elementData[i] = operator.apply((E) elementData[i]);}if (modCount != expectedModCount) { throw new ConcurrentModificationException();}modCount++; } @SuppressWarnings('unchecked') @Override public synchronized void sort(Comparator<? super E> c) {final int expectedModCount = modCount;Arrays.sort((E[]) elementData, 0, elementCount, c);if (modCount != expectedModCount) { throw new ConcurrentModificationException();}modCount++; } @Override public Spliterator<E> spliterator() {return new VectorSpliterator<>(this, null, 0, -1, 0); } /** Similar to ArrayList Spliterator */ static final class VectorSpliterator<E> implements Spliterator<E> {private final Vector<E> list;private Object[] array;private int index; // current index, modified on advance/splitprivate int fence; // -1 until used; then one past last indexprivate int expectedModCount; // initialized when fence set/** Create new spliterator covering the given range */VectorSpliterator(Vector<E> list, Object[] array, int origin, int fence, int expectedModCount) { this.list = list; this.array = array; this.index = origin; this.fence = fence; this.expectedModCount = expectedModCount;}private int getFence() { // initialize on first use int hi; if ((hi = fence) < 0) {synchronized(list) { array = list.elementData; expectedModCount = list.modCount; hi = fence = list.elementCount;} } return hi;}public Spliterator<E> trySplit() { int hi = getFence(), lo = index, mid = (lo + hi) >>> 1; return (lo >= mid) ? null :new VectorSpliterator<E>(list, array, lo, index = mid, expectedModCount);}@SuppressWarnings('unchecked')public boolean tryAdvance(Consumer<? super E> action) { int i; if (action == null)throw new NullPointerException(); if (getFence() > (i = index)) {index = i + 1;action.accept((E)array[i]);if (list.modCount != expectedModCount) throw new ConcurrentModificationException();return true; } return false;}@SuppressWarnings('unchecked')public void forEachRemaining(Consumer<? super E> action) { int i, hi; // hoist accesses and checks from loop Vector<E> lst; Object[] a; if (action == null)throw new NullPointerException(); if ((lst = list) != null) {if ((hi = fence) < 0) { synchronized(lst) {expectedModCount = lst.modCount;a = array = lst.elementData;hi = fence = lst.elementCount; }}else a = array;if (a != null && (i = index) >= 0 && (index = hi) <= a.length) { while (i < hi)action.accept((E) a[i++]); if (lst.modCount == expectedModCount)return;} } throw new ConcurrentModificationException();}public long estimateSize() { return (long) (getFence() - index);}public int characteristics() { return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;} }}四、總結(jié) Vector實(shí)際上是通過一個(gè)數(shù)組去保存數(shù)據(jù)的。當(dāng)我們構(gòu)造Vecotr時(shí);若使用默認(rèn)構(gòu)造函數(shù),則Vector的默認(rèn)容量大小是10。 當(dāng)Vector容量不足以容納全部元素時(shí),Vector的容量會(huì)增加。若容量增加系數(shù) >0,則將容量的值增加“容量增加系數(shù)”;否則,將容量大小增加一倍。 Vector的克隆函數(shù),即是將全部元素克隆到一個(gè)數(shù)組中。五、Vector遍歷方式

1. 隨機(jī)訪問遍歷,通過索引值去遍歷

由于Vector實(shí)現(xiàn)了RandomAccess接口,它支持通過索引值去隨機(jī)訪問元素。

Integer value = null;int size = vec.size();for (int i=0; i<size; i++) { value = (Integer)vec.get(i);}

2. 通過迭代器遍歷。即通過Iterator去遍歷

Integer value = null;Iterator<Integer> iterator = vec.iterator(); while (iterator.hasNext()) { value = iterator.next(); }

3. 通過增強(qiáng)for循環(huán)去遍歷

Integer value = null;for (Integer integ:vec) { value = integ;}

4. 通過Enumeration遍歷

Integer value = null;Enumeration enu = vec.elements();while (enu.hasMoreElements()) { value = (Integer)enu.nextElement();}

測(cè)試這些遍歷方式效率的代碼如下:

public class Test { public static void main(String[] args) {Vector<Integer> vector = new Vector<>();for (int i = 0; i < 100000; i++) vector.add(i);iteratorThroughRandomAccess(vector);iteratorThroughIterator(vector);iteratorThroughFor2(vector);iteratorThroughEnumeration(vector); } public static void iteratorThroughRandomAccess(List list) {long startTime, endTime;startTime = System.currentTimeMillis();for (int i = 0; i < list.size(); i++) {}endTime = System.currentTimeMillis();long time = endTime - startTime;System.out.println('iteratorThroughRandomAccess:' + time + ' ms'); } public static void iteratorThroughIterator(List list) {long startTime, endTime;startTime = System.currentTimeMillis();Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) { iterator.next();}endTime = System.currentTimeMillis();long time = endTime - startTime;System.out.println('iteratorThroughIterator:' + time + ' ms'); } public static void iteratorThroughFor2(List list) {long startTime, endTime;startTime = System.currentTimeMillis();for (Object o : list) {}endTime = System.currentTimeMillis();long time = endTime - startTime;System.out.println('iteratorThroughFor2:' + time + ' ms'); } public static void iteratorThroughEnumeration(Vector vec) {long startTime, endTime;startTime = System.currentTimeMillis();for (Enumeration enu = vec.elements(); enu.hasMoreElements(); ) { enu.nextElement();}endTime = System.currentTimeMillis();long time = endTime - startTime;System.out.println('iteratorThroughEnumeration:' + time + ' ms'); }}

輸出如下:

iteratorThroughRandomAccess:3 msiteratorThroughIterator:6 msiteratorThroughFor2:5 msiteratorThroughEnumeration:5 ms

所以:遍歷Vector,使用索引的隨機(jī)訪問方式最快,使用迭代器最慢。

到此這篇關(guān)于Java基礎(chǔ)之容器Vector詳解的文章就介紹到這了,更多相關(guān)java容器Vector內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产黄色大片 | 婷婷av网站 | 久久精品久久久 | 久久久成人精品 | 国产高清自拍 | 视频一区二区三区免费观看 | 欧美一区二区三区视频 | 欧美日韩在线免费 | 亚洲精品在线免费观看视频 | 在线一级电影 | 一区二区影视 | 欧美精品国产精品 | 欧美不卡 | 久久久久国产精品一区二区 | 国产一区 | 色爽女人免费 | 精品欧美一区二区三区久久久小说 | 蜜桃视频一区二区三区 | 日干夜操| 日韩色区| 亚洲精品不卡 | 日韩久久精品电影 | 亚洲啊v| 伦理自拍 | 日本在线黄色 | av激情在线 | 一卡二卡久久 | 免费观看一级毛片 | 久久久精品影院 | 久久99精品久久久久久园产越南 | 极品白嫩少妇无套内谢 | 精品91久久久 | 精品久久久久久久久久久久久久 | 亚洲高清一区二区三区 | 亚洲www啪成人一区二区 | 福利二区视频 | av一级在线观看 | jav成人av免费播放 | 国产精品久久久久久久一区探花 | 亚洲欧美日韩另类精品一区二区三区 | 日韩成人在线网 | 成年免费观看 | 色接久久| 欧美a v在线播放 | 中文字幕日韩av | 黄a一级 | 久久久99国产精品免费 | 国产91综合一区在线观看 | 成人精品一区二区三区 | 日韩欧美国产一区二区三区 | 夜夜草天天干 | 欧洲精品在线观看 | 欧美日韩一区二区三区不卡视频 | 国产96精品久久久 | 亚洲视频区 | 国产成人高清 | 久久九九精品久久 | 国产精品久久久久久久久免费桃花 | 日韩精品一区二区三区在线观看 | 日韩欧美精品在线 | 中字幕视频在线永久在线观看免费 | 久久国产精品一区二区三区 | 欧美一区三区 | 色综合国产 | 欧美视频综合 | 国产一区二区三区色淫影院 | 天天夜操| 欧美xxxxxx视频 | 中文成人无字幕乱码精品 | 国产精品免费看 | 综合网日韩| 国产a免费 | 在线成人www免费观看视频 | av在线精品 | 国精产品一区二区三区 | 精品国产欧美一区二区 | sis001亚洲原创区 | 日韩成人在线看 | 亚洲a网| 夜夜av| 九九re | 久久免费精品视频 | 免费观看毛片 | 国产一级黄色大片 | 午夜爱爱毛片xxxx视频免费看 | 国产91精品在线 | 日韩草比 | 精品国产一区二区三区久久久 | 免费黄色片一区二区 | 欧美成人精品一区二区 | 麻豆精品久久久 | 91精品国产91久久久久久吃药 | 欧美国产精品一区二区 | 亚洲免费观看 | 国产精品精品 | 九九精品免费视频 | 激情久久久久 | 午夜社区| 精品一区二区三区在线观看 | 成人在线视频一区二区 | 国产高清在线精品一区二区三区 | 国产成人精品一区二区三区视频 | 看亚洲a级一级毛片 | 欧美久久久久久 | 中文字字幕一区二区三区四区五区 | segui88久久综合9999 | 欧美人牲| 三区视频| 精品国产31久久久久久 | 国产成人99久久亚洲综合精品 | 亚洲a视频 | 国内精品视频一区国产 | 国产欧美精品一区二区色综合 | 精品国产区 | 久久国产精彩视频 | 欧美亚洲日本 | 99精品欧美一区二区蜜桃免费 | 五月激情婷婷六月 | 91网站在线看 | 中文字幕在线电影 | 久久久久久亚洲 | 五月天婷婷综合 | 日韩免费高清视频 | 久久久久久亚洲精品视频 | 日本不卡免费新一二三区 | 伊人网站 | 国产伦精品一区二区三区四区视频 | 免费成人在线网站 | 日韩精品一区二区在线观看 | 91麻豆精品一二三区在线 | 欧美 日韩| 久久精品伊人 | 亚洲激情在线播放 | 亚洲国产精品久久久久久 | 操人在线观看 | 亚洲成人精品在线观看 | av一道本 | 中文字幕av一区二区三区 | 精品国产一区二区三区在线观看 | 久久久久久亚洲精品 | 毛片网站大全 | 久久另类 | 国产精品久久久久久久久久三级 | 久久久高清| 亚洲天堂久久 | 国产精品久久久久影院色老大 | 国产精品伦理一区 | 国产黄色免费小视频 | 国产在线h| 国产精品久久久久久久久久99 | 黄色大片在线播放 | 在线第一页 | 成人欧美一区二区三区白人 | 亚洲成人精品在线观看 | 久久九九国产精品 | 久在线视频 | 天天艹久久 | 国产97人人超碰caoprom | 国产精品日日 | 亚洲三级在线 | 91在线入口 | 午夜精品久久久久久久星辰影院 | 成人小视频在线播放 | 91精品欧美久久久久久动漫 | 中文字幕天天操 | 91九色在线| 午夜小视频在线观看 | 欧美精品v国产精品v日韩精品 | 免费av在线网站 | 三级成人在线 | 色999精品 | 涩涩视频在线免费看 | 国产精品成人3p一区二区三区 | 亚洲h视频在线观看 | 日日操操 | av中文字幕网 | 在线观看免费的av | 亚洲天堂一区 | 精品久久久久久久久久久久久久 | 伊人网网站 | 欧美成人精品一区 | 国产一区二区久久 | 国精产品一区二区三区 | 高清一区二区 | 欧美精品综合 | 在线播放91| 米奇成人网 | 精品国产三级 | 亚洲欧美国产一区二区 | 精品一区二区三区久久久 | www.99re| av片在线观看网站 | 日本久久久久久久久久久久 | 男人天堂视频在线观看 | 成年人毛片视频 | 麻豆高清免费国产一区 | 久久青 | 一级一级一级一级毛片 | 国产亚洲精品精品国产亚洲综合 | 久久青 | 九九免费在线观看 | 久久99国产精品久久99大师 | 最新国产精品 | 亚洲专区在线播放 | 成人亚洲精品 | 久久99精品久久久久久琪琪 | 国产日韩精品在线 | 毛片免费观看视频 | 日中文字幕在线 | 97影院在线午夜 | 成人免费福利视频 | 福利视频一 | 91.成人天堂一区 | 精品久久电影 | 在线视频成人 | 国产九九av | 国产福利一区二区 | 欧美99 | 久久国产精品免费一区二区三区 | 黄色a视频 | 国产精品久久久久久一区二区三区 | 亚洲福利在线播放 | 国产视频一区二区 | 国产v日产∨综合v精品视频 | 综合久久网| 国产a久久精品一区二区三区 | 国产精品96久久久久久久 | 国产日韩在线视频 | 午夜精品久久久久久久久久久久 | 久久亚洲一区二区 | 久久精品免费一区二区 | 亚洲国产精品免费 | 亚洲激情第一页 | 少妇久久久 | 国产午夜久久 | 国产91精品在线 | 偷拍呻吟高潮91 | 欧美a区 | 欧美日韩一区二区在线 | 91免费在线播放 | 欧美视频在线免费 | 一区免费看 | 成人午夜性a一级毛片免费看 | 国产高潮好爽受不了了夜色 | 超碰一区 | 香港黄色录像片 | 欧美a级成人淫片免费看 | 免费看毛片的网站 | 亚洲人免费 | 免费久久99精品国产婷婷六月 | 久久a视频| 91亚洲国产成人久久精品网站 | 欧美一区免费 | 国产精品久久久久aaaa九色 | 中文字幕精品三区 | 亚洲欧美电影 | 成人不卡| 亚洲日本欧美 | 成人免费淫片aa视频免费 | 欧美久久久久久久久久伊人 | 国产第一亚洲 | 超级碰在线视频 | 亚洲一区中文字幕 | www在线视频 | 日本一区二区不卡 | 成人欧美一区二区三区在线播放 | 黄色一级毛片免费 | 国产欧美一区二区精品婷 | 一区二区三区在线播放 | 超碰日韩在线 | 一区二区中文字幕 | av中文字幕在线播放 | 岛国av免费看 | 亚洲日韩中文字幕一区 | 欧美久久综合 | 国产91在线播放精品91 | 亚洲一区二区三区四区五区中文 | 久久久www成人免费精品 | 国产在线观看欧美 | 国产中文一区 | 中文字幕日韩在线 | 久久精品亚洲精品国产欧美 | 久在线视频 | 亚洲乱码一区二区三区在线观看 | 久久成人在线 | 国产大学生情侣呻吟视频 | 亚洲国产精品一区二区三区 | 成人av免费看 | 午夜影院在线观看 | 国产成人激情 | 亚洲va中文字幕 | 性做久久久久久久免费看 | 嫩草懂你 | 日韩av视屏 | 国产中文在线播放 | 韩日视频在线观看 | 欧美福利在线观看 | 国产中文在线 | 中文字幕最新在线 | 偷拍做爰吃奶视频免费看 | 国产一区不卡 | 天天噜天天干 | 国产黄色av| 国产精品久久久爽爽爽麻豆色哟哟 | 91精品国产综合久久久久久软件 | av黄色在线观看 | 91免费在线视频 | 成人毛片在线视频 | 精品久久久久久久久久久久 | 在线日韩一区 | 91精品久久 | 国产成人精品亚洲日本在线观看 | 中文字幕一区二区三区不卡 | 日韩中文字幕在线视频 | 91视频在线网址 | av影片在线 | 中文字幕一区日韩精品欧美 | 成人国产精品色哟哟 | 欧美日韩a v | 亚洲1级片| 中文字幕在线网址 | 老熟女毛片 | 1000部精品久久久久久久久 | 亚洲一区av在线 | 日韩中文在线 | 欧美精品二区中文乱码字幕高清 | 自拍偷拍视频网站 | 国产高潮失禁喷水爽网站 | 欧美日韩一区二区在线 | 国产成人精品免费视频大全最热 | 欧美激情一区二区三级高清视频 | 日韩免费| 国产精品96久久久久久久 | 99精品一区二区三区 | 国产一级毛片国语一级 | 国产免费黄色 | 国产精品综合 | 在线观看成人 | 禁果av一区二区三区 | 国产色视频网站 | www.99热.com | 国产精品成人3p一区二区三区 | 亚洲97| 成人水多啪啪片 | 国产精品免费观看 | 精品久| 国产精品一区av | 国产精品成人国产乱一区 | 艹逼网| 日本二区视频 | 国产成人免费视频网站高清观看视频 | 国产乱码久久久久久一区二区 | 亚洲成人中文字幕 | 国产精品久久久久久久久免费桃花 | 久久99视频 | 日韩中文字幕一区二区 | 国产在线一区二区三区 | 毛片综合 | 国产高清在线看 | 精品国产不卡一区二区三区 | 国产真实乱全部视频 | 超碰在线国产 | 久久久精品网 | 欧美视频一区二区三区在线观看 | 9l蝌蚪porny中文自拍 | 欧美日韩精品免费观看视频 | 成人av高清在线观看 | 天天影视网色香欲综合网无拦截 | 天堂久久一区 | 日本免费久久 | 91九色porny首页最多播放 | 日韩毛片免费视频一级特黄 | 黄瓜av | 国产精品乱码一区二区三区 | 国产视频第一页 | 伊人激情网 | 成年人精品视频 | 亚洲久草 | 久久久国产精品 | 欧美日韩高清在线一区 | 久久精品综合 | 99精品国产高清一区二区麻豆 | 久久九九国产精品 | 神马午夜| 永久精品 | a久久| a级在线| 亚洲视频一区二区三区 | 亚洲风情在线观看 | 涩涩999| 欧美一区二区免费 | 美女一级a毛片免费观看97 | 成人精品免费视频 | 免费毛片网| 99久久视频| 国产欧美精品一区二区 | 国产成人午夜精品5599 | 红色av社区 | 偷拍自拍第一页 | 欧美成人h版在线观看 | 中文字幕在线综合 | 互换娇妻呻吟hd中文字幕 | 久久夜夜 | 国产中文一区 | 久久99视频精品 | 日本黄色大片免费 | 亚洲视频在线观看视频 | 天天干天天插天天 | 亚洲午夜视频在线观看 | 午夜伦理影院 | av在线免费看片 | 99热日本 | 国产不卡视频 | 国产欧美在线播放 | 狠狠亚洲 | 精品www| 精品免费国产 | 国产日韩欧美视频 | 日本黄色大片免费观看 | 久久永久视频 | 一区二区在线视频免费观看 | √8天堂资源地址中文在线 成人欧美一区二区三区白人 | 一区二区免费看 | 久久久久久久久久穴 | 午夜视频网址 | 亚洲 欧美 日韩 精品 | 美国特级a毛片免费网站 | 日韩电影中文字幕 | 国产亚洲精品v | 国产精品久久久久久久一区探花 | 免费无遮挡www小视频 | 日韩欧美一级二级 | 婷婷综合一区 | 国产麻豆一区二区三区 | 不卡视频一区二区三区 | 爱啪导航一精品导航站 | 成人av视 | 五月天婷婷社区 | 国产精品99久久 | 国产精品久久久久久福利一牛影视 | 亚洲一区二区三区国产 | 国产一级在线观看 | 免费99精品国产自在在线 | 久在线| 免费在线看a | 国产欧美在线观看 | 欧美成人精品激情在线观看 | 成人免费久久 | 啪一啪| 91av免费在线观看 | 可以免费在线观看av的网站 | 亚洲成年片 | 日韩精品一区二区三区四区五区 | 日韩国产一区二区三区 | 日本久久精品电影 | 亚洲一区二区精品在线观看 | 黄色成人在线网站 | 国产91在线免费观看 | 91精品一区二区三区久久久久久 | 百性阁综合另类 | 久久男人天堂 | 亚洲成人综合网站 | 国产一区二区久久 | 色接久久 | 国产一区二区三区免费视频 | 国产欧美日韩综合精品一区二区 | 久久精品免费一区二区三区 | 美女主播精品视频一二三四 | 亚洲性视频网站 | 欧美激情在线狂野欧美精品 | 中文字幕一区二区三区乱码图片 | 精国产品一区二区三区四季综 | 毛片免费视频 | 91久久久久久久久久久久久 | 毛片免费看 | 日本三级在线观看中文字 | 中文字幕高清 | 久久久精品网站 | 久久午夜影院 | 久久高清 | 国产精品欧美一区二区三区 | 国产在线不卡 | 人干人人| 电家庭影院午夜 | 国产高清一区二区 | 欧美一级播放 | 日韩中文字幕国产 | 黄色永久网站 | 视频一区免费观看 | 亚洲精品一区二三区不卡 | 国产精品美女www爽爽爽动态图 | 米奇狠狠狠狠8877 | 在线日韩中文字幕 | 久草视频在线播放 | 97在线播放| 精品一区二区三区国产 | 国产精品99久久免费观看 | av黄色在线| 亚洲无吗视频 | 久久久99久久久国产自输拍 | 国内自拍偷拍视频 | 97久久精品| 久久久精品久久久久久 | 欧美啊v| 国产乱码精品一区二区三区中文 | 亚洲精品亚洲人成人网 | 蜜月久综合久久综合国产 | 亚洲网在线 | 精品国产91乱码一区二区三区 | 欧美一级裸体视频 | 久久精品一区二区三区四区毛片 | 亚洲精品久久久久久久久久久 | 欧美一级网站 | 精品一区二区在线观看 | 亚洲视频在线观看视频 | 日韩国产一区二区三区 | 精品无码久久久久国产 | 成人av免费观看 | 久久国产亚洲 | 精品久久久久久亚洲精品 | 欧美在线播放一区 | 亚洲成人看片 | 最新av中文字幕 | 亚洲人成在线观看 | 国产中文字幕在线观看 | 国产成人精品免费视频 | 欧美精品第一页 | 日韩在线视频免费看 | 成人免费在线网址 | 亚洲视频免费观看 | 精品视频在线免费观看 | 天天干人人 | 国产精品中文字幕在线观看 | 中文字幕在线一区二区三区 | 欧美一区二区三区男人的天堂 | 亚洲精品午夜视频 | www.亚洲 | 欧美一级毛片免费看 | 欧美精产国品一二三区 | 2019亚洲日韩新视频 | 日韩av不卡在线 | www.日韩视频 | 国产欧美日韩精品一区 | 91精品中文字幕一区二区三区 | 国产精品久久久久久久久久久久 | 亚洲资源站 | 亚洲精品视频导航 | 国内精品久久久久 | 一级毛片,一级毛片 | 国产区精品| 国产精品久久久久久吹潮 | 国产精品久久精品 | 国产区精品 | 日韩在线国产 | 羞羞视频免费观看入口 | 日韩精品一区二区在线观看视频 | www久久精品 | 99成人 | 国产第一页在线播放 | 日韩中文字幕国产 | 国产日韩精品一区二区 | 国产一区二区三区av在线 | 欧美成人一区二区三区片免费 | 国产精品毛片久久久久久久 | 久久伊人免费视频 | 亚洲成av人片在线观看无码 | 国产一级毛片在线视频 | 国产精品网站在线看 | 亚洲一区免费视频 | 国产1页 | 午夜不卡福利视频 | 成人国产电影 | 在线观看第一页 | 久久久精品国产 | 日日操夜夜操免费视频 | 午夜视频 | 国产成年人小视频 | av色资源| 亚洲免费视频一区二区 | 精品美女在线 | 国产99精品视频 | 日韩国产二区 | 日韩超级毛片 | 久久青青| 91福利视频导航 | 91精品久久久久久久久 | 91精品国产91久久久久久吃药 | 一级毛片aaaaaa免费看 | 成人午夜毛片 | 一区二区久久 | 成人免费在线视频 | 2018啪一啪 | 日韩精品一区二区三区在线观看 | 六月丁香啪啪 | 精品国产髙清在线看国产毛片 | 人人澡人人射 | 欧美亚洲综合久久 | 久草成人| 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | bxbx成人精品一区二区三区 | 久久黄色| 国产一区在线看 | 蜜桃视频一区二区 | 中文在线一区 | 久久综合九色综合欧美狠狠 | 国产福利视频在线观看 | 香蕉成人啪国产精品视频综合网 | 欧美日韩亚洲国产 | 色婷婷综合在线 | www.亚洲| 一区二区三区影院 | 日韩精品中文字幕在线观看 | 欧美精品国产精品 | 91一区| 成人国产精品一级毛片视频 |