Java中的vector類使用方法示例詳解
基本操作示例
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,所以從頭開始。
//找刪除找到的第一個(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è)線程去訪問這個(gè)i的話就直接回拋異常,所以保證這段代碼安全還需要再run里面再添加synchronized修飾。
希望本篇vector類使用示例文章對(duì)您有所幫助
相關(guān)文章
Spring Security基于散列加密方案實(shí)現(xiàn)自動(dòng)登錄功能
為了提高項(xiàng)目的用戶體驗(yàn),我們可以在項(xiàng)目中添加自動(dòng)登錄功能,當(dāng)然也要給用戶提供退出登錄的功能。接下來學(xué)習(xí)下Spring Security基于散列加密方案實(shí)現(xiàn)自動(dòng)登錄功能,一起看看吧2021-09-09
Java的作業(yè)調(diào)度類庫Quartz基本使用指南
這篇文章主要介紹了Java的作業(yè)調(diào)度類庫Quartz基本使用指南,Quartz能夠讓類按照指定的計(jì)劃順序執(zhí)行,需要的朋友可以參考下2016-03-03
Java RSA加密解密實(shí)現(xiàn)方法分析【附BASE64 jar包下載】
這篇文章主要介紹了Java RSA加密解密實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java基于第三方類庫javabase64-1.3.1.jar實(shí)現(xiàn)RSA加密解密功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Mybatis-plus的selectPage()分頁查詢不生效問題解決
本文主要介紹了Mybatis-plus的selectPage()分頁查詢不生效問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
java使用FFmpeg提取音頻的實(shí)現(xiàn)示例
在Java開發(fā)中,我們經(jīng)常會(huì)遇到需要使用FFmpeg來處理音視頻文件的情況,本文主要介紹了java使用FFmpeg提取音頻的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法
這篇文章主要介紹了超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java實(shí)現(xiàn)經(jīng)典拳皇誤闖冒險(xiǎn)島游戲的示例代碼
《拳皇誤闖冒險(xiǎn)島》是拳皇和冒險(xiǎn)島素材的基于JavaSwing的動(dòng)作類游戲。本文將用Java語言實(shí)現(xiàn)這一游戲,需要的小伙伴可以參考一下2022-02-02

