一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中的vector類使用示例小結

Java中的vector類使用示例小結

2020-04-27 12:35yyl8781697 JAVA教程

Vector與ArrayList的實現基本相似,同樣是基于動態數組,同樣是需要擴容,下面舉了三個簡短的例子來幫助大家理解vertor:

基本操作示例

VectorApp.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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的大小,多余的元素被拋棄 
  }
}

運行結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
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略微不同

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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類是線程安全的!
但是即使它所有的方法都被修飾成同步,也不意味著調用它的時候永遠都不需要同步手段了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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修飾。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 变形金刚第一部 | 吉川爱美与黑人解禁 | 精品一区二区三区在线成人 | 亚洲欧美一区二区三区不卡 | 日本不卡免免费观看 | 亚洲AV无码偷拍在线观看 | 91麻豆精品国产片在线观看 | 天天曰| 国产日本免费 | 香蕉97超级碰碰碰免费公 | 好姑娘在线完整版视频 | 美女被狂揉下部羞羞动漫 | 草草草草视频 | 娇妻与公陈峰姚瑶小说在线阅读 | 久久久精品国产免费A片胖妇女 | 韩国女主播一区二区视频 | 精品福利一区二区免费视频 | a毛片免费全部在线播放毛 a级在线看 | 国产欧美日韩成人 | 国产一区二区视频在线观看 | 99久久99热久久精品免费看 | 婷婷日日夜夜 | 男女男精品视频 | 亚欧洲乱码专区视频 | 亚洲欧美日韩综合一区久久 | 丝袜捆绑调教丨vk | 98色花堂永久地址国产精品 | 亚洲男gay同性同志 亚洲免费在线看 | 亚洲视频中文 | 国产精品久久久天天影视香蕉 | chinese男同志同性twink | 亚洲欧美7777 | 色依依视频视频在线观看 | 激情小说欧美图片 | 古装一级无遮挡毛片免费观看 | 欧美国产日本精品一区二区三区 | 91系列在线观看免费 | 日韩毛片网 | 色噜噜狠狠狠综合曰曰曰88av | 国产精品亚洲午夜不卡 | 韩国办公室激情 |