电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:127日期: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中去,并且長(zhǎng)度為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簡(jiǎn)介

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector類實(shí)現(xiàn)了一個(gè)可增長(zhǎng)的對(duì)象數(shù)組,內(nèi)部是以動(dòng)態(tài)數(shù)組的形式來(lái)存儲(chǔ)數(shù)據(jù)的。 Vector具有數(shù)組所具有的特性、通過(guò)索引支持隨機(jī)訪問(wèn)、所以通過(guò)隨機(jī)訪問(wèn)Vector中的元素效率非常高、但是執(zhí)行插入、刪除時(shí)效率比較低下。 繼承了AbstractList,此類提供 List 接口的骨干實(shí)現(xiàn),以最大限度地減少實(shí)現(xiàn)”隨機(jī)訪問(wèn)”數(shù)據(jù)存儲(chǔ)(如數(shù)組)支持的該接口所需的工作.對(duì)于連續(xù)的訪問(wèn)數(shù)據(jù)(如鏈表),應(yīng)優(yōu)先使用 AbstractSequentialList,而不是此類. 實(shí)現(xiàn)了List接口,意味著Vector元素是有序的,可以重復(fù)的,可以有null元素的集合. 實(shí)現(xiàn)了RandomAccess接口標(biāo)識(shí)著其支持隨機(jī)快速訪問(wèn),實(shí)際上,我們查看RandomAccess源碼可以看到,其實(shí)里面什么都沒有定義.因?yàn)锳rrayList底層是數(shù)組,那么隨機(jī)快速訪問(wèn)是理所當(dāng)然的,訪問(wèn)速度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; //容量增長(zhǎng)的系數(shù) protected int capacityIncrement; // Vector的序列版本號(hào) private static final long serialVersionUID = -2767605614048989439L; //指定Vector初始大小和增長(zhǎng)系數(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í)際上是通過(guò)一個(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ī)訪問(wèn)遍歷,通過(guò)索引值去遍歷

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

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

2. 通過(guò)迭代器遍歷。即通過(guò)Iterator去遍歷

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

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

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

4. 通過(guò)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ī)訪問(wèn)方式最快,使用迭代器最慢。

到此這篇關(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)文章:
主站蜘蛛池模板: 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 微动开关厂家-东莞市德沃电子科技有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 | 天津次氯酸钠酸钙溶液-天津氢氧化钠厂家-天津市辅仁化工有限公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 云杂志网-学术期刊-首页 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 |