blog

コレクション - ベクターの一般的なメソッドのソースコードと使用例

VectorはListやCloneableなどのインターフェースを継承し、実装しています。 1.VectorはListインターフェースを継承し、実装しています。 2.Vectorはランダム性を提供する...

Oct 6, 2020 · 7 min. read
シェア

Vector

相続関係

public class Vector<E>
 extends AbstractList<E>
 implements List<E>, RandomAccess, Cloneable, java.io.Serializable

継承関係からわかるように

VectorはAbstractListを継承し、List、RandomAccess、Cloneable、Serializableなどのインターフェースを実装しています。

1.VectorはAbstractListを継承し、Listインターフェースを実装しています。

2.Vectorはランダムアクセスを提供するRandmoAccessインターフェイスを実装しています。

3.VectorはCloneableインターフェイスを実装し、クローン機能を実現します。

4.Vectorは、シリアライズをサポートするためにSerializableインターフェイスを実装しています。

コンストラクタのメソッドと初期化

その下に動的配列の実装があります。

protected Object[] elementData;// 
 protected int elementCount;//配列に入れる要素の数
protected int capacityIncrement;//成長因子

つの構築方法

1.工法の初期規模と成長率のパス

public Vector(int initialCapacity, int capacityIncrement) {
 super();
 if (initialCapacity < 0)
 throw new IllegalArgumentException("Illegal Capacity: "+
 initialCapacity);
 this.elementData = new Object[initialCapacity];
 this.capacityIncrement = capacityIncrement;
 }

2.初期容量とヌルベクトルを成長係数0で指定します。


/**
 * Constructs an empty vector with the specified initial capacity and
 * with its capacity increment equal to zero.
 * 空のベクトルで、容量増分がゼロの初期容量合計を指定する。
 */
 public Vector(int initialCapacity) {
 this(initialCapacity, 0);
 }

3.内部データ配列のサイズが10で、標準的な容量の増分が0になるように、空のベクトルを構築します。

/**
 * Constructs an empty vector so that its internal data array
 * has size {@code 10} and its standard capacity increment is
 * zero.
 *空のベクトルを、その内部データ配列のサイズが{@code 10},標準容量増分は0である。
 */
 public Vector() {
 this(10);
 }

4.コレクションコンストラクタを渡し、シーケンシャルなVectorを返します。

 /**
 * Constructs a vector containing the elements of the specified
 * collection, in the order they are returned by the collections iterator.
 * 指定された要素を含むベクトルのコレクションを構築する。
 */
 public Vector(Collection<? extends E> c) {
 elementData = c.toArray();//まず配列を回す
 elementCount = elementData.length;//タプルの数を変更する
 // c.toArray might (incorrectly) not return Object[] (see 6260652)
 if (elementData.getClass() != Object[].class)// .toArrayそれは物体か?[] 
 elementData = Arrays.copyOf(elementData, elementCount, Object[].class);//重複配列はベクターを形成する
 }

初期設定

public Vector() {
 this(10);
 }

デフォルトの長さが10であることがわかります。

共通アピ

追加

ArrayListと同様に、これは2段階のプロセスです:

1.配列の長さを長くします。

2.配列に要素を追加

スレッドの安全性を確保するためにsynchronizedロックを追加するだけです。

public synchronized void addElement(E obj) {//スレッドの安全のためにロックを追加する
 modCount++;//変化の数を記録する
 ensureCapacityHelper(elementCount + 1);//配列の長さを増やす
 elementData[elementCount++] = obj;//要素を追加する
 }

削除

削除には2種類あります:

1.要素ごとに削除

要素に従った削除の原則:まず対応する要素の添え字を見つけ、次にその添え字に従って削除します。

2.添え字による削除

による要素の削除

//要素で削除する
public synchronized boolean removeElement(Object obj) {//ロックスレッドの安全性
 modCount++;
 int i = indexOf(obj);//対応する要素の添え字を見つけよ
 if (i >= 0) {
 removeElementAt(i);//添え字に従って削除する
 return true;
 }
 return false;
 }

添え字削除の指定

public synchronized void removeElementAt(int index) {
 modCount++;
 if (index >= elementCount) {
 throw new ArrayIndexOutOfBoundsException(index + " >= " +
 elementCount);
 }
 else if (index < 0) {
 throw new ArrayIndexOutOfBoundsException(index);
 }
 int j = elementCount - index - 1;
 if (j > 0) {
 //arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 
		 //指定されたソース配列から配列をコピーし、コピー先の配列の指定された位置から始まり指定された位置で終わる。
		 //最初の要素Data: 
		 //番目の要素Data:ターゲットの配列
		 //ソース配列における位置は srcPos から srcPos までである。+length-1 その間の構成要素は
		 //destPosをターゲット配列のdestPosにそれぞれコピーする。+length-1 場所 
		 //public static void arraycopy(Object src,int srcPos,Object dest,int destPos, int length)
 System.arraycopy(elementData, index + 1, elementData, index, j);
 }
 elementCount--;
 //この時点で、最後の要素は配列の長さから1を引いたnulに設定される。
 elementData[elementCount] = null; /* to let gc do its work */
 }

すべての要素を取り除く

ヌルへのループ

public synchronized void removeAllElements() {
 modCount++;
 // Let gc do its work
 for (int i = 0; i < elementCount; i++)
 elementData[i] = null;
 elementCount = 0;
 }

romove

基礎となるremoveElementメソッドは依然として呼び出されます。

public boolean remove(Object o) { return removeElement(o); }

お照会

添え字に対応するデータを返します。

public synchronized E get(int index) {
 if (index >= elementCount)
 throw new ArrayIndexOutOfBoundsException(index);
 return elementData(index);
 }
 
 
 @SuppressWarnings("unchecked")
 E elementData(int index) {
 return (E) elementData[index];
 }

添え字の下に設定する値を指定します。

public synchronized E set(int index, E element) {
 if (index >= elementCount)
 throw new ArrayIndexOutOfBoundsException(index);
 E oldValue = elementData(index);
 elementData[index] = element;
 return oldValue;
 }

クローン

は、新しい配列を作成し、古い要素を新しい配列にコピーし、そのベクターを返します。

public synchronized Object clone() { try { @SuppressWarnings("unchecked") Vector<E> v = (Vector<E>) super.clone(); v.elementData = Arrays.copyOf(elementData, elementCount);//新しい配列にコピーするだけだ v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(e); } }

拡張

拡張能力

 //容量を拡大する
 public synchronized void ensureCapacity(int minCapacity) {
 if (minCapacity > 0) {
 modCount++;
 ensureCapacityHelper(minCapacity);
 }
 }

容量拡張ヘルパー機能

private void ensureCapacityHelper(int minCapacity) {
 // overflow-conscious code
 if (minCapacity - elementData.length > 0)
 grow(minCapacity);
 }

キャパシティを拡大する本当の方法

 //最大容量
 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
 //能力拡張の実行方法
 private void grow(int minCapacity) {
 // overflow-conscious code
 int oldCapacity = elementData.length;
 // キャパシティ・インクリメントによる判定,capacityIncrement> 0
 //容量を増やす容量を1増やす。そうでない場合は現在の容量の2倍になる!
 int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
 capacityIncrement : oldCapacity);
 if (newCapacity - minCapacity < 0)
 newCapacity = minCapacity;
 if (newCapacity - MAX_ARRAY_SIZE > 0)
 newCapacity = hugeCapacity(minCapacity);
 //新しい "容量を持つ新しい配列を生成し、elementDataのすべての要素を新しい配列にコピーする。,
 //そして、新しく生成された配列をelementDataに代入する。
 elementData = Arrays.copyOf(elementData, newCapacity);
 }

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 の理由

オブジェクトとしての配列は、オブジェクトのヘッダ情報を格納するために一定の量のメモリを必要とし、オブジェクトのヘッダ情報が占有する最大メモリは8バイトを超えてはなりません 最大容量 長さ

 
 private static int hugeCapacity(int minCapacity) {
 if (minCapacity < 0) // overflow
 throw new OutOfMemoryError();
 return (minCapacity > MAX_ARRAY_SIZE) ?
 Integer.MAX_VALUE :
 MAX_ARRAY_SIZE;
 }

概要

1.ベクターはNULLを格納できます;

2.ベクタースレッドセーフ;

3.ベクターは実際にはオブジェクトの配列です;

4.ベクターは1エクスパンションにつき2倍;

5.ベクターは基本的に配列なので、クエリーは非常に高速です;

6。とArrayListはVectorの基礎となる配列のストレージに似て/効率の要素へのアクセスは非常に高いですが、検索、時間の複雑さはO(1)、挿入とO(n)の時間の複雑さの効率の要素の削除です。

Vector ArrayListとの違い

1.ベクターはスレッドセーフ、配列リストはスレッドセーフではありません;

2.動的に拡張されますが、Vectorは2倍、ArrayListは1.5倍に拡張されます;

3.ArrayListはVectorよりパフォーマンスが良いので、同期させる必要はありません。

概要

これは、データを挿入する場合、現在の項目の前後の項目を記録するだけでよいのに対して、他の2つの平均的なケースでは、後方へトラバースする必要があるためです。

フォローする言葉

あなたは守護の砂であり、明るい月の光です。 世界は複雑ですが、あなたの心が四季折々の春のようでありますように!

Read next

ユニアプリ開発アプレットの概要

標準バージョンを選択するHBuilderXのインストール時間は、APPの開発版をダウンロードしないように、ユニアプリのエディタについては、プラグインを介して、または直接プロジェクトを作成するvue-cliのコマンドラインを介して標準バージョンにインストールすることができ、私の個人的な使用に加えて、アプレットのコンパイルのAPP開発版は、時にはアプレットのページのコンパイルにつながる空白(唯一の左&#)。x3C;ページ>&...

Oct 6, 2020 · 6 min read