ArrayListに、LinkedListはとベクトルは、Listインタフェースから継承されます。ArrayListのとベクトルは、下にあるダイナミックアレイ、根底にあるLinkedListのは、二重にリンクされたリストです。
ArrayListのArrayListのとベクトルは、スレッドセーフであること違いは、ベクターは、効率がベクトルのArrayListよりも高くなるように、それはまた、最も広く使用され、ベクター内のスレッドセーフな方法は方法(同期)同期さですコレクション。
私たちは、ArrayListのとLinkedListの間の差は、実際の配列と二重リンクリストの間の差である比較のArrayListとLinkedListの違いに焦点を当てています。
これは、配列を特徴:配列は連続したメモリ領域を割り当てているため、非常に高速である要素を見つけるためにインデックスを使用します。しかし、挿入、削除データのパフォーマンスは比較的低いです。
テレサはワング・ズヒウェンが上書きテレサに、1によって前方に移動1からあなたが最初のスタートに必要な要素を削除する必要があります。
そして、双方向リンクリストの構造を見てみましょう。
コンテンツ自体に加えて保存されているリスト内の各要素にポインタの要素とポイントの前の記憶エレメントへのポインタでもある、二重リンクリストは3つの要素が含まれている図に示すように、各リンクされたリストは、ヘッダを有します部分は、最初の要素へのヘッド・ポインタは、後部要素は、ヘッドを指します。
クエリのクエリ要素はあなたが必要な要素、挿入、削除、高効率のインスタンスを見つけるまで、頭から各要素を1つずつを開始する必要があるため、二重の機能、低クエリ効率、のリストをリンクされ、我々は前の要素の要素に直接それを削除しますそれができるようになります後の要素へのポインタ:
私たちは、データ構造の二組のパリティ特性にソースコードを見て
コレクションの末尾に1を追加要素:Listインタフェースは、ブールの追加(E電子)のセットの最後に要素を追加するための方法を提供し、ArrayListのとLinkedListのは、このメソッドを実装します。
ArrayListには実装されているかを見てください:
public boolean add(E e) { ensureCapacityInternal(size + 1); //判断当前数组的容量是否够大如果不够大则扩容 elementData[size++] = e;//将元素添加到数组尾部 return true; }
这里的执行效率取决于:ensureCapacityInternal(size+ 1)方法的执行,在该方法中会判断数组容量是否足够,如果不够则进行扩容到原来的1.5倍。在扩容的过程中会生成一个新的数组,将原数组中的元素复制到新数组中。所以在这种情况下如果数组容量足够大ArrayList的效率是非常高的,我们也可以根据实际情况给它一个合适的初始值。
再来看一下LinkedList集合:
public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }
我们可以看到每新增一个元素就要创建一个Node对象,进行频繁的赋值操作 “final Node<E> newNode = new Node<>(l, e, null);”对效率有一定的影响。
我们再来看一下在特定的位置插入元素:
List接口中提供的方式是这样的:void add(int index,E element)
在ArrayList中是这样实现的:
public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
从代码中我们可以看出,每插入一个元素就要进行大量元素复制操作:“System.arraycopy(elementData, index, elementData, index + 1,size - index);”
从插入点往后的元素依次后移将新元素插入到空出来的位置上。效率非常低下。
而在LinkedList中开销和在集合最后插入元素开销差不多,只需要把它前一个元素的指针指向自己,自己的指针指向下一个元素就可以了。
总结一下:
1. ArrayList和Vector结构一样都是动态数组,区别是ArrayList是线程不安全的,Vector是线程安全的,ArrayList性能好于Vector,ArrayList是应用最多的集合。
2. ArrayList和LinkedList的区别是他们的数据结构不同,ArrayList是动态数组,LinkedList是双向链表,在查询操作较多,在特定位置插入数据和删除数据较少的情况下一般选用ArrayList,在特定位置插入数据,删除数据操作较多,查询较少的情况下一般选用LinkedList,但是在大多数应用中都是对查询效率要求较高,所以ArrayList集合应用更广泛一些。