1. パフォーマンスを考慮すると、アレイが推奨されます
プロジェクト開発、特にビジネス指向の開発では、配列はますます使用頻度が低くなります。まず、配列には List や Set などのコレクションが提供するメソッドがあまりありません。つまり、検索アルゴリズムや追加アルゴリズムを自分で記述する必要があります。ただし、List や Set などのコレクションは汎用サポートを使用するため、すべてラッパー クラスに格納され、基本データ型の実行速度はラッパー型よりもはるかに高速です。コレクション クラスの最下層も配列を通じて実装されます。
2. 必要に応じて、可変長配列を使用します
コレクション クラスを学習するとき、多くの人は配列の固定長とコレクション型の可変長を比較したがりますが、実際には、この比較は適切ではないことが ArrayList などのコレクション クラスの実装を観察するとわかります。いわゆるコレクションは長くなりますが、実際には元の配列を巧みに拡張しているだけです。
次のようにコードをコピーします。
public static T[] ExpandCapacity(T[] data, int newLength) {
// 負の値かどうかを判定する
新しい長さ = 新しい長さ < 0 : 新しい長さ;
// 新しい配列を生成し、元の値をコピーして長さを指定します
Arrays.copyOf(data, newLength) を返します。
}
パフォーマンス要件が高い場合は、配列のカプセル化を検討できます。配列の長さが一定だからといって、配列を使用しない理由にはなりません。
3. 配列の浅いコピーには注意してください
配列の浅いコピーは、Java プログラミングの基礎でもあります。浅いコピーとは、配列をコピーするときに、基本型は値をコピーし、参照型は参照アドレスをコピーすることを意味します。上記の例では、Arrays.copyOf を使用して配列がコピーされます。浅いコピーなので使用する際は注意が必要です。
4. 明確なシナリオの下で、コレクションの初期容量を指定します。
日常的な使用では、コレクション型の長さが自動的に変更されるため、オブジェクトの作成時に初期値がコレクション クラスに付加されないことを最初に理解する必要があります。最も一般的に使用される ArrayList を例に挙げます。容量に達しました 臨界点では、基礎となるアレイがcopyOf 操作により新しい配列が生成され、新しい配列の容量は古い配列の 1.5 倍で、デフォルトの配列の長さは 10 です。コンテナーに配置されるデータの量が多いことが明確にわかっている場合、 copyOf 回の使用によって引き起こされる過剰なパフォーマンスのオーバーヘッドを避けるために、初期値を指定する必要があります。
5. 適切な最適なアルゴリズムを選択する
データの最大値または最小値の検索は、データ構造の最も基本的な知識です。これを Java で実装する方法も数多くあります。以下に 2 つのアルゴリズムを示します。
次のようにコードをコピーします。
public static int getMaxByArray(int[] data) {
// 最も単純な自己実装の検索メソッド
int max = データ[0];
for (int i = 1, size = data.length; i < size; i++) {
最大 = 最大 < i ? i : 最大;
}
最大値を返します。
}
次のようにコードをコピーします。
public static int getMaxByArray(int[] data) {
// 最初にソートしてから最後のビットを取得します
Arrays.sort(データ);
データを返します[data.length - 1];
}
6. 基本型配列変換トラップ!
次のコードを観察してください
次のようにコードをコピーします。
public static void main(String[] args) {
int[] nums = new int[] { 1, 2, 3, 4, 5 };
リスト list = Arrays.asList(nums);
System.out.println(list.size());
//この時の出力サイズは1です
}
期待した結果は Arrays.asList を通じて配列内の要素をコレクション クラスに変換することだったのですが、予想に反してこの時は配列自体を追加しただけで、配列内の値を分離していませんでした。コレクションの場合、リストにジェネリックスを追加するとコンパイル中にエラー メッセージが表示されるか、配列自体を Integer に変更すると問題を解決できます。
7. asList メソッドで生成された List オブジェクトは変更できません。
上記の例から、Arrays.asList メソッドを使用すると配列を List に変換できることがわかります。では、asList メソッドによって返される List は、変更をサポートしないことに注意してください。 java.util.ArrayListではなく、Array s ツール クラスの静的プライベート内部クラス。ArrayList と同じ親クラス AbstractList を持ちますが、add メソッドやその他のメソッドをオーバーライドすると、UnsupportedOperationException がスローされます。この静的プライベート内部クラスには、size、toArray、Get のみが実装されており、これらが含まれます。メソッド
8. 異なるデータ構造に対して異なるトラバーサル方法を使用する
次のコードを見てください
次のようにコードをコピーします。
public static void main(String[] args) {
// 以下は ArrayList コレクションのトラバーサル メソッドです
int num = 80 * 10000;
リスト arrayList = 新しい ArrayList(num);
for (int i = 0, size = arrayList.size(); i < size; i++) {
arrayList.get(i);
}
// 以下は LinkedList コレクションのトラバーサル メソッドです
リスト linkedList = new LinkedList();
for (整数 integer : linkedList) {
}
}
LinkedList と ArrayList に異なる走査方法を選択するのはなぜですか?
1. ArrayList は RamdomAccess インターフェイス (ランダム アクセス インターフェイス) を実装しているため、RamdomAccess インターフェイスは Java における Serializable インターフェイスや Cloneable インターフェイスと同じマーキング インターフェイスであり、ArrayList の場合、このクラスがランダムにアクセスできることを意味します。相関関係はありません。つまり、2 つの隣接する位置には相互依存関係がなく、ランダムにアクセスできます。
2. Java の foreach 構文はイテレータ (イテレータ) の変形使用法です。イテレータは 23 の設計パターンの 1 つであることはわかっていますが、イテレータは 2 つの要素間の時間関係を知る必要があります。そうでない場合、hasNext サポートを提供するにはどうすればよいでしょうか。これは、前の要素が次の要素が存在するかどうかを判断する必要があり、この関係が強制的に確立され、ArrayList ランダム アクセスの特性に違反するためです。
3. LinkedList では、二重リンク リストの形式で格納されるため、反復子のサポートが非常に優れています。LinkedList 内の 2 つの隣接する要素間には固有の関係があるため、LinkedList と ArrayList には異なるトラバーサル メソッドを採用する必要があります。興味のある読者は、添字の形式で LinkedList にアクセスしてみると、この 2 つの間に効率に大きな差があることがわかるでしょう。
8. 必要に応じて ArrayList または LinkedList を選択します
ArrayList と LinkedList の主な違いは次のとおりです。
1. ArrayList の基礎となるデータ構造は配列ですが、LinkedList の基礎となる構造は二重リンク リストです。
2. データを挿入するとき、ArrayList は挿入のたびに配列要素を後方に移動する必要があるため、LinkedList は先頭ノードと末尾ノードを変更するだけで挿入操作を完了できるため、挿入操作が頻繁に行われる場合は LinkedList が優先されます。
3. データを削除する場合、ArrayList は配列の順序を維持する必要があるため、削除後に要素を前後にシフトする必要もありますが、LinkedList は依然として先頭ノードと末尾ノードを変更します。
4. 更新する場合、LinkedList はハーフトラバーサル方式を使用して位置決めされた要素を見つけて更新するため、ArrayList による位置決めされた添字要素の直接置換と比較して、ArrayList の方が更新効率が高くなります。
5.LinkedList は、LinkedList の addFirst や addLast などの操作を通じてキューをシミュレートできます。
9. リストが等しい場合、考慮する必要があるのは要素データのみです
List、Set、Map などのインターフェイスを安心してプログラミングできるように、Java ではコレクション クラスの equlas がオーバーライドされています。これにより、2 つのコレクションが等しいかどうかを比較するときに、要素データが等しいかどうかだけを比較する必要があります。これにより、コレクション実装クラスの置き換えによって引き起こされる誤った Java コードが修正されました。
次のようにコードをコピーします。
public static void main(String[] args) {
リスト arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(2);
リスト linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
System.out.println(arrayList.equals(linkedList));
// 特定の実装は気にしないでください。出力は true です
}