ArrayList のいくつかの一般的なメソッドのソース コードを共有する

零下一度
リリース: 2017-06-28 09:41:47
オリジナル
1798 人が閲覧しました

jdk1.7.0_79

上記の記事では、ArrayListのいくつかの一般的なメソッドのソースコードを分析しました - 「ArrayListの一般的なメソッドのソースコード分析」、この記事では、 LinkedListの一般的なメソッドの簡単な分析

LinkedListはリンクリストに基づいて実装されているため、ランダムアクセスが遅い、挿入や削除の速度が速いなど、リンクリストの長所と短所を併せ持っています。リンクリストなのでノードのデータ構造になっており、最後に1つ追加するだけで容量の問題はありません。

//LinkedList$Nodeprivate static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;
    }
}
ログイン後にコピー

パラメータのない最初のコンストラクタは、デフォルトで空のリンクリストを構築します。

//1.LinkedList,默认构造方法public LinkedList() {
}
ログイン後にコピー

2番目のコンストラクターはパラメーターとしてコレクションを渡すことができ、コレクション内の要素はLinkedListのサブクラスである必要があります。

//2.LinkedList,能将一个集合作为参数的构造方法public LinkedList(Collection<? extends E> c) {this();
    addAll(c);
}
ログイン後にコピー

どちらの構築方法も比較的簡単です。 次に、要素の挿入と削除を見てみましょう。

public boolean add(E e) {
    linkLast(e);    //将元素添加到链表尾部return true;
}
ログイン後にコピー
//LinkedList#linkLastvoid linkLast(E e) {final Node<E> l = last;    //链表尾指针引用暂存final Node<E> newNode = new Node<>(l, e, null);    //构造新节点last = newNode;    //将链表的尾指针指向新节点if (l == null)    //此时为第一次插入元素first = newNode;elsel.next = newNode;    
    size++;    //链表数据总数+1modCount++;    //modCount变量在《有关ArrayList常用方法的源码解析》提到过,增删都会+1,防止一个线程在用迭代器遍历的时候,另一个线程在对其进行修改。}
ログイン後にコピー

「データ構造」を学んだ学生なら、リンクリストの操作に慣れないと思います。指定された位置の要素を削除するremove(int)メソッドを見てみましょう。 。

//LinkedList#removepublic E remove(int index) {
    checkElementIndex(index);    //检查是否越界 index >= 0 && index <= sizereturn unlink(node(index));    //调用node方法查找并返回指定索引位置的Node节点}
ログイン後にコピー

//LinkedList#node,根据索引位置返回Node节点Node<E> node(int index) {if (index < (size >> 1)) {    //size >> 1 = size / 2,如果索引位于链表前半部分,则移动fisrt头指针进行查找Node<E> x = first;for (int i = 0; i < index; i++)
            x = x.next;return x;
    } else {    //如果索引位于链表后半部分,则移动last尾指针进行查找Node<E> x = last;for (int i = size - 1; i > index; i--)
            x = x.prev;return x;
    }
}
ログイン後にコピー

indexの位置でNodeを見つけたら、unlinkメソッドを呼び出してノードを削除します。

//LinkedList#unlink,一看即懂E unlink(Node<E> x) {// assert x != null;final E element = x.item;final Node<E> next = x.next;final Node<E> prev = x.prev;if (prev == null) {
        first = next;
    } else {
        prev.next = next;
        x.prev = null;
    }if (next == null) {
        last = prev;
    } else {
        next.prev = prev;
        x.next = null;
    }

    x.item = null;
    size--;
    modCount++;return element;
}
ログイン後にコピー

LinkedListArrayList の長所と短所をコードから確認できます。関係するのは単純なリンク リスト データ構造のみであるため、他のメソッドは解析されません。

以上がArrayList のいくつかの一般的なメソッドのソース コードを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート