リスト面接の準備

それらのリストコレクションについて学びましたか?

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倍になります。指定しない場合、アレイは移行されます

おすすめ

転載: blog.csdn.net/BOWWOB/article/details/113663591