ホームページ  >  記事  >  Java  >  Javaでのベクタークラスの使用例のまとめ

Javaでのベクタークラスの使用例のまとめ

黄舟
黄舟オリジナル
2017-01-20 11:04:561665ブラウズ

Vector と ArrayList の実装は基本的に似ていますが、これらも動的配列に基づいており、拡張する必要があります。 Vector を理解するのに役立つ 3 つの短い例を示します。

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的大小,多余的元素被抛弃  
  } 
}

Operation結果:

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 変数があることがわかります。この変数は、各展開の増分を指定するために使用されます。この変数を指定しない場合は、デフォルトでは、Vector は元の配列の 1 倍のサイズに拡張されることがわかりました

スレッド セーフ

Vertor はスレッド セーフです!

Vertor ソース コードのもう 1 つの注目すべき点は、ほとんどのメソッドに 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 メソッドは、マルチスレッド環境で同期されます。メソッド側で追加の同期手段が講じられていない場合、スレッドがシリアル番号 i の要素を削除する場合、このコードは依然として安全ではありません。 , 別のスレッドがこの i にアクセスすると、例外が直接スローされます。そのため、このコードの安全性を確保するには、実行時に同期変更を追加する必要があります

上記は、vector クラスの使用例の概要です。 Java 関連情報の詳細については、PHP 中国語 Web サイト (www.php.cn) を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。