それらのリストコレクションについて学びましたか?
ArrayList、LinkedList、Vector
ArrayListについて話す
ArrayListの最下層は配列です。
コンストラクターには次の3つのタイプが
あります。①パラメーターなしの構築、デフォルトサイズの10で配列を初期化します。
②容量をこのサイズに初期化します。
③別の既存のセットAが与えられた場合、AのtoArrayメソッドを呼び出します。Aが0の場合、パラメーターなしの構造として処理されます
。Aに要素がある場合は、Array.copyOf関数を呼び出してコピーします。
Addは通常の配列と同じですが、拡張のための判断と操作が多くなります。
実際の追加の前に拡張を判断します
//1.5倍扩容 jdk 1.8
int newCapacity = oldCapacity + (oldCapacity >> 1);
index addを使用する場合、ネイティブモバイル配列メソッドが呼び出されます
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
特徴は、ランダムアクセスが高速で、途中での挿入が非効率的であるということです。
LinkedListは、最下層がどのように実装されているかも話します
LinkedListは二重リンクリストであり
、次の2つの方法で初期化されます。①
空の構造
②既存のコレクションを使用します。addAllメソッドを呼び出して最初にtoArrayをオブジェクト配列に入れてからテール補間を実行します。挿入する前に、LinkedListで指定されたジェネリック型を強制的に変換します。
テールプラグ方式
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
get要素の先頭と末尾で、存在しない場合は削除すると、例外がスローされます。
インデックスを取得する場合は、最初に判定方法を入力し、範囲内にない場合は例外をスローします。
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
/**
* Returns the last element in this list.
*
* @return the last element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return l.item;
}
/**
* Removes and returns the first element from this list.
*
* @return the first element from this list
* @throws NoSuchElementException if this list is empty
*/
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
/**
* Removes and returns the last element from this list.
*
* @return the last element from this list
* @throws NoSuchElementException if this list is empty
*/
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
4つの追加メソッド:
①要素の追加:テール補間メソッドの
呼び出し②addfirstメソッド:ヘッド補間メソッドの
呼び出し③addlastメソッド:テール補間メソッドの
呼び出し④インデックスの追加、キー:最初に範囲を判断し、範囲を超えた場合は例外をスローします。それが最後の位置であるかどうかを確認します。ある場合は、テール補間メソッドを直接呼び出します。そうでない場合は、それを探します。
オファーの場合、addメソッドが呼び出され、endが挿入され、最後にtrueが返されます。
プッシュはaddFirstを呼び出すことであり、ポップはremoveFirstを呼び出すことであり、どちらもヘッドで動作します
Vectorはどうですか、スレッドセーフですか?
はい、ほとんどすべてのメソッドが同期キーワードを使用します
ベクターはどのように拡張しますか?
拡張は2倍になります。指定しない場合、アレイは移行されます