さっそく、次の図に直接進みましょう。
Java コレクション (コンテナーとも呼ばれます) , 主に2 つの主要なインターフェイス (インターフェイス)
から派生します:Collection と Map
名前が示すように、コンテナーはデータを保存するために使用されます。
これら 2 つのインターフェイスの違いは次のとおりです:
つまり、シングルはコレクションに配置され、カップルはマップに配置されます。 (それで、あなたはどこに属しますか?
これらのコレクション フレームワークを学習すると、次の 4 つの目標があると思います:
Map については、以前の HashMap の記事が非常に徹底的かつ詳細に説明されています。なので、この記事では詳しくは書きませんが、まだ記事を読んでいない方は、公式アカウントにアクセスして「HashMap」とリプライして記事を読んでみてください~
まずトップレベルのコレクションを見てみましょう。
コレクションには多くのメソッドも定義されており、これらのメソッドは各サブインターフェイスや実装クラスにも継承されます。これらの API の使用は、日常業務や面接でもよく行われるテストです。まずはこれらのメソッドを見てください。
操作のコレクションは、「追加、削除、変更、確認」の 4 つのカテゴリにすぎず、CRUD
:
Create、Read とも呼ばれます。
次に、これらの API を次の 4 つのカテゴリに分類します:
以下で詳しく見てみましょう:
boolean add(E e);
add()
データ型メソッドによって渡されます。オブジェクトである必要があるため、基本的なデータ型を記述するときに、自動ボックス化とアンボックス化が実行されます。
別のメソッドaddAll()
があり、別のコレクションからこのコレクションに要素を追加できます。
boolean addAll(Collection extends E> c);
boolean remove(Object o);
remove()
は、削除する指定された要素です。
これはaddAll()
に対応します。
には当然、セット B 内のすべての要素を削除するremoveAll()
があります。
boolean removeAll(Collection> c);
コレクション インターフェイスの要素を変更する直接操作はありませんが、削除と追加で変更を完了できます。
boolean contains(Object o);
boolean containsAll(Collection> c);
boolean isEmpty();
int size();
Object[] toArray();
以上就是 Collection 中常用的 API 了。
在接口里都定义好了,子类不要也得要。
当然子类也会做一些自己的实现,这样就有了不同的数据结构。
那我们一个个来看。
List 最大的特点就是:有序
,可重复
。
看官网说的:
An ordered collection (also known as a sequence).
Unlike sets, lists typically allow duplicate elements.
今回はSetの特徴についても触れましたが、Listとは真逆で、Setはunorder
であり、が繰り返されません。
最初は、データ構造が
必要な機能を完了できるかどうかを検討することです;両方を完了できる場合、2 つ目は、どちらの
がより効率的であるかを検討してください。(すべてはこのようなものです。
これら 2 つのクラスの API とその時間計算量を具体的に見てみましょう:
関数 | メソッド |
---|---|
Add | add()/addAll() |
削除 | delete()/removeAll( ) |
コレクション インターフェイスに | |
contains()/ containsAll() | |
isEmpty()/size()/toArray() |
メソッド | ArrayList | LinkedList | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
add(E e) | O(1) | O(1) | ||||||||||||||||||||||
add(int インデックス, E e) | O(n) | O(n) | ||||||||||||||||||||||
削除(int インデックス) | O(n) | O(n) | ||||||||||||||||||||||
remove(E e) | O(n) | #O(n)#Change | ||||||||||||||||||||||
O(1) | O(n) | Check | ||||||||||||||||||||||
O(1) ######の上)############ いくつかの説明:
回答 :
「追加と削除」についてはどうでしょうか? この要素を見つける時間を考慮しない場合、 配列は物理的に連続しているため、要素を追加したり削除したりする場合は末尾でも大丈夫ですが、他の場所に移動すると後続の要素が削除されるため、効率が低下しますが、リンク リストでは次の要素との接続が簡単に切断されるため、新しい要素を直接挿入したり、古い要素を削除したりすることができます。 しかし、実際には、要素を見つけるまでの時間を考慮する必要があります。 。 。また、データ量が多い場合はArrayListを最後尾で動作させると高速になります。 ##つまり:
Vector も ArrayList と同様に java.util.AbstractListから継承し、最下層も配列を使用して実装されます。
よくある面接の質問: Vector と ArrayList の違いは何ですか? これに答えるだけでは、あまり包括的ではありません。 スタック オーバーフローに関する投票の多かった回答を見てみましょう: 2 つ目は、拡張時に必要な拡張量の違いです。演算は、この数値の 2 進数を 1 ビット右に移動し、左端の が符号ビットを補いますが、容量には負の数がないため、やはり 0 を加算します。1 ビットを右にシフトすると、 2 で除算され、定義される新しい容量は元の容量の1.5 倍 になります。Vector をもう一度見てみましょう: 通常、capacityIncrement を定義しないため、デフォルトでは2 回拡張されます。 この2点に答えていただければ、間違いなく問題ありません。 Queue と DequeQueue は、一方の端が入力でもう一方の端が出力である線形データ構造であり、Deque両端ですので全て出入り可能です。 QueueJava の Queue インターフェイスは少しわかりにくいです。一般的に、セマンティクスは次のとおりです。キューの数 これらはすべて先入れ先出し(FIFO) です。 しかし、ここには例外があります。つまり、PriorityQueue (ヒープとも呼ばれます) は、入力された時間順に出力されるのではなく、指定された優先順位に従って出力され、その操作は O ではありません。 (1)、時間 複雑さの計算は少し複雑なので、後ほど別の記事で説明します。 Queue メソッド公式ウェブサイト[1]すべてをまとめました。2 つの API セットがあり、基本的な機能は同じですが、次のとおりです。
|