国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中的vector類使用示例小結

2019-11-26 14:21:24
字體:
來源:轉載
供稿:網友

基本操作示例

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);    //加入為字符串對象    v1.addElement("one");    //加入的為integer的對象    v1.addElement(integer1);    v1.addElement(integer1);    v1.addElement("two");    v1.addElement(new Integer(2));    v1.addElement(integer1);    v1.addElement(integer1);    //轉為字符串并打印    System.out.println("The Vector v1 is:/n/t"+v1);    //向指定位置插入新對象    v1.insertElement("three",2);    v1.insertElement(new Float(3.9),3);    System.out.println("The Vector v1(used method    insertElementAt()is:/n/t)"+v1);    //將指定位置的對象設置為新的對象    //指定位置后的對象依次往后順延    v1.setElementAt("four",2);    System.out.println("The vector v1 cused method setElmentAt()is:/n/t"+v1);    v1.removeElement(integer1);    //從向量對象v1中刪除對象integer1    //由于存在多個integer1,所以從頭開始。     //找刪除找到的第一個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)的方法取得向量對象的每個元素。     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));    //按不同的方向查找對象integer1所處的位置     v1.setSize(4);    System.out.println("The new Vector(resized the vector)is:"+v1);    //重新設置v1的大小,多余的元素被拋棄    } } 

運行結果:

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倍擴容
還記得ArrayList每次擴容為元數組的0.5倍不?Vector在進行擴容操作時與ArrayList略微不同

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

細心的小伙伴可以發現Vector中多了一個capacityIncrement變量,該變量是用于指定每次擴容的增量,如果不指定該變量,在grow中可以發現Vector默認就擴容為原數組的1倍

線程安全
Vertor是線程安全的!
Vertor源碼中另一個比較顯眼的地方就是絕大部分方法都有synchronized關鍵字,大家都知道這個關鍵字是用于線程同步的,所以Vector類是線程安全的!
但是即使它所有的方法都被修飾成同步,也不意味著調用它的時候永遠都不需要同步手段了:

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);  }}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平乐县| 西乌珠穆沁旗| 宁武县| 巫溪县| 江城| 广水市| 嵊州市| 体育| 海原县| 博湖县| 余江县| 陆川县| 吉木萨尔县| 修文县| 类乌齐县| 大港区| 安吉县| 宿迁市| 绍兴县| 田东县| 菏泽市| 兴化市| 永修县| 通榆县| 郴州市| 伊宁市| 吉安县| 福泉市| 阿拉善左旗| 大同市| 襄汾县| 西青区| 来安县| 科尔| 台中县| 田林县| 宜宾市| 汾西县| 稷山县| 永嘉县| 封丘县|