基本的な操作の例
VectorApp.java
java.util.vectorをインポートします。 java.lang。*をインポートします。 java.util.numerationをインポートします。 public class vectorApp {public static void main(string args []){vector v1 = new Vector(); integer integer1 = new Integer(1); //文字列オブジェクトv1.addelement( "one")として追加します。 //整数オブジェクトv1.addelement(integer1)として追加します。 v1.addelement(integer1); v1.addelement( "2"); v1.addelement(new Integer(2)); v1.addelement(integer1); v1.addelement(integer1); //文字列および印刷システムに変換します。 //指定された位置v1.insertelement( "3"、2)に新しいオブジェクトを挿入します。 v1.insertelement(新しいフロート(3.9)、3); System.out.println( "Vector v1(使用Method InsertElementat()is:/n/t)"+v1); //指定された位置にオブジェクトを新しいオブジェクトとして設定します//指定された位置の後にオブジェクトがシーケンスv1.setelementat( "4"、2)に拡張されます。 System.out.println( "Vector v1 cused method setelmentat()is:/n/t"+v1); v1.RemoveElement(integer1); // vectorオブジェクトv1 //からオブジェクトinteger1を削除します。 //見つかった最初のinteger1を削除するために見つけます。列挙enum = v1.elements(); system.out.println( "Vector v1(使用方法method removeElememt()is"); while(enum.hasmoreements())system.out.println(enum.nextelement()+""); out.println(); //列挙クラスのメソッド(列挙)を使用して、各要素を取得するために、enumerationクラス(列挙)を使用します。 Object1(Top-to-botton): "+v1.indexof(integer1)); system.out.println(" object1(tottom-to-top)の位置): "+v1.lastindexof(integer1)):"+v1.lastindexof(integer1)); "+v1.lastindexof(integer1)); vector)is: "+v1); // v1のサイズをリセットし、余分な要素が破棄されます}}実行結果:
e:/java01> java vectorAppベクターv1は次のとおりです。 V1(使用されたメソッドremoveElement())は次のとおりです。1つの4.9 1 2 2 1 1 Object1(上からボトン)の位置:3 Object1(ボトンからトップ)の位置:7新しいベクトル(ベクトルのサイズ変更)は:[1、4、3.9,1]
Vertorの1x拡張
ArrayListが毎回MetaArrayの0.5倍に拡張されているかどうかを覚えていますか?容量拡張操作を実行する場合、ベクトルはアレイリストとはわずかに異なります
保護されたint captumentincrement; //各拡張の容量を指定するために使用しますプライベートボイド成長(int mincapacity){//オーバーフロー - 意識コードint oldcapacity = elementdata.length; int newcapacity = oldcapacity +((capational increment> 0)?caputerincrement:oldcapacity); //容量incrementが指定されていない場合、デフォルトの容量拡張容量は元の配列の容量です。 if(newcapacity -max_array_size> 0)newcapacity = hugecapacity(mincapacity); elementData = arrays.copyof(elementData、NewCapacity);}慎重な友人は、各拡張の増加を指定するために使用されるベクターに追加の容量インクメント変数があることを知ることができます。この変数が指定されていない場合、Growで、ベクトルがデフォルトで容量を元の配列の1倍に拡張することを見つけることができます。
スレッドの安全
Vertorは糸が安全です!
Vertor Sourceコードのもう1つのより顕著なことは、ほとんどの方法がキーワードを同期していることです。誰もがこのキーワードがスレッドの同期に使用されていることを知っているので、ベクトルクラスはスレッドセーフです!
しかし、そのすべての方法が同期するように変更されたとしても、それを呼び出すときに同期する必要がないという意味ではありません。
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); }スレッドremovethread = newスレッド(new runnable(){@Override public void run(){for(int i = 0; i <vector.size(); i ++){vector.remove(i);}}}}); thread printthread = new shood(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); }}このコードを短期間実行した後、ArrayIndexOutofBoundSexcectionの例外が見つかります。ここのベクトルの取得、削除、およびサイズの方法には、マルチスレッド環境での同期変更の変更がありますが、メソッド側で追加の同期測定が行われない場合、このコードはまだ安全ではありません。 1つのスレッドがシリアル番号Iで要素を削除し、別のスレッドがこのIにアクセスすると、例外が直接スローされます。したがって、このコードの安全性を確保するには、実行するために同期された変更を追加する必要もあります。