溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的vector類使用方法示例詳解

發(fā)布時(shí)間:2020-09-09 09:09:02 來(lái)源:腳本之家 閱讀:150 作者:wbb 欄目:編程語(yǔ)言

 基本操作示例

VectorApp.java

import java.util.Vector; 
import java.lang.*; 
import java.util.Enumeration; 
public class VectorApp 
{ 
 public static void main(String args[]) 
 { 
 Vector v1 = new Vector(); 
 Integer integer1= new Integer(1); 
 //加入為字符串對(duì)象 
 v1.addElement("one"); 
 //加入的為integer的對(duì)象 
 v1.addElement(integer1); 
 v1.addElement(integer1); 
 v1.addElement("two"); 
 v1.addElement(new Integer(2)); 
 v1.addElement(integer1); 
 v1.addElement(integer1); 
 //轉(zhuǎn)為字符串并打印 
 System.out.println("The Vector v1 is:\n\t"+v1); 
 //向指定位置插入新對(duì)象 
 v1.insertElement("three",2); 
 v1.insertElement(new Float(3.9),3); 
 System.out.println("The Vector v1(used method 
 insertElementAt()is:\n\t)"+v1); 
 //將指定位置的對(duì)象設(shè)置為新的對(duì)象 
 //指定位置后的對(duì)象依次往后順延 
 v1.setElementAt("four",2); 
 System.out.println("The vector v1 cused method setElmentAt()is:\n\t"+v1); 
 v1.removeElement(integer1); 
 //從向量對(duì)象v1中刪除對(duì)象integer1 
 //由于存在多個(gè)integer1,所以從頭開(kāi)始。 
 //找刪除找到的第一個(gè)integer1. 
 Enumeration enum = v1.elements(); 
 System.out.println("The vector v1 (used method removeElememt()is"); 
 while(enum.hasMoreElements()) 
 System.out.println(enum.nextElement()+""); 
 System.out.println(); 
 //使用枚舉類(Enumeration)的方法取得向量對(duì)象的每個(gè)元素。 
 System.out.println("The position of Object1(top-to-botton):"+v1.indexOf(integer1)); 
 System.out.println("The position of Object1(tottom-to-top):"+v1.lastIndexOf(integer1)); 
 //按不同的方向查找對(duì)象integer1所處的位置 
 v1.setSize(4); 
 System.out.println("The new Vector(resized the vector)is:"+v1); 
 //重新設(shè)置v1的大小,多余的元素被拋棄 
 } 
} 

運(yùn)行結(jié)果:

E:\java01>java VectorApp 
The vector v1 is:[one,1,1,two,2,1,1] 
The vector v1(used method insetElementAt()) is: 
[one,1,three,3.9,1,two,2,1,1] 
The vector v1(used method setElementAt()) is: 
[one,1,four,3.9,1,two,2,1,1] 
The vector v1(useed method removeElement()) is: 
one four 3.9 1 two 2 1 1 
The position of object1(top-to-botton):3 
The position of object1(botton-to-top):7 
The new Vector(resized the vector) is: 
[one,four,3.9,1] 

Vertor的1倍擴(kuò)容

還記得ArrayList每次擴(kuò)容為元數(shù)組的0.5倍不?Vector在進(jìn)行擴(kuò)容操作時(shí)與ArrayList略微不同

protected int capacityIncrement;//用于指定每次擴(kuò)容的容量
private void grow(int minCapacity) {
 // overflow-conscious code
 int oldCapacity = elementData.length;
 int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
   capacityIncrement : oldCapacity);//如不指定capacityIncrement,默認(rèn)擴(kuò)容的容量為原數(shù)組的容量
 if (newCapacity - minCapacity < 0)
 newCapacity = minCapacity;
 if (newCapacity - MAX_ARRAY_SIZE > 0)
 newCapacity = hugeCapacity(minCapacity);
 elementData = Arrays.copyOf(elementData, newCapacity);
}

細(xì)心的小伙伴可以發(fā)現(xiàn)Vector中多了一個(gè)capacityIncrement變量,該變量是用于指定每次擴(kuò)容的增量,如果不指定該變量,在grow中可以發(fā)現(xiàn)Vector默認(rèn)就擴(kuò)容為原數(shù)組的1倍

線程安全

Vertor是線程安全的!

Vertor源碼中另一個(gè)比較顯眼的地方就是絕大部分方法都有synchronized關(guān)鍵字,大家都知道這個(gè)關(guān)鍵字是用于線程同步的,所以Vector類是線程安全的!

但是即使它所有的方法都被修飾成同步,也不意味著調(diào)用它的時(shí)候永遠(yuǎn)都不需要同步手段了:

private static Vector<Integer> vector=new Vector<Integer>();
public static void main(String[] args) { 
 while(true)
 {
 for(int i=0;i<10;i++)
 {
 vector.add(i);
 }
 Thread removeThread=new Thread(new Runnable(){
 @Override
 public void run()
 {
 for(int i=0;i<vector.size();i++)
 {
 vector.remove(i);
 }
 }
 });
 Thread printThread=new Thread(new Runnable(){
 @Override
 public void run()
 {
 for(int i=0;i<vector.size();i++)
 {
 System.out.println(vector.get(i));
 }
 }
 }); 
 removeThread.start();
 printThread.start();
 while(Thread.activeCount()>20); 
 }
}

大家運(yùn)行此段代碼時(shí) 跑了一小段時(shí)間之后會(huì)發(fā)現(xiàn)有ArrayIndexOutOfBoundsException異常,這里Vector的get,remove,size方法盡管有synchronized修飾,但是在多線程環(huán)境中,如果不在方法端額外做同步措施的話,這段代碼仍然是不安全的,如果一個(gè)線程刪除了序號(hào)i的元素之后,另一個(gè)線程去訪問(wèn)這個(gè)i的話就直接回拋異常,所以保證這段代碼安全還需要再run里面再添加synchronized修飾。

希望本篇vector類使用示例文章對(duì)您有所幫助

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI