1. 概要

このチュートリアルでは、配列の最初の要素を削除する方法を見ていきます。

さらに、Javaコレクションフレームワークのデータ構造を使用するとさらに簡単になることもわかります。

2. Arrays.copyOfRange()の使用

まず第一に、配列の要素を削除することは、Javaでは技術的に不可能です。 公式ドキュメントを引用するには:

「配列は、単一タイプの値を固定数保持するコンテナオブジェクトです。 配列の長さは、配列の作成時に確立されます。 作成後、その長さは固定されます。」

つまり、配列を直接操作している限り、最初の要素を含まない、より小さなサイズの新しい配列を作成するだけです。

幸い、JDKには、 Arrays.copyOfRange()と呼ばれる便利な静的ヘルパー関数が用意されています。

String[] stringArray = {"foo", "bar", "baz"};
String[] modifiedArray = Arrays.copyOfRange(stringArray, 1, stringArray.length);

この操作は毎回新しい配列を作成するため、 O(n)のコストがかかることに注意してください。

もちろん、これは配列から要素を削除する面倒な方法であり、そのような操作を定期的に実行している場合は、代わりにJavaコレクションフレームワークを使用する方が賢明かもしれません。

3. リスト実装の使用

データ構造(インデックスによってアクセス可能な要素の順序付けられたシーケンス)とほぼ同じセマンティクスを維持するには、Listインターフェイスの実装を使用するのが理にかなっています。

最も一般的な2つの実装は、ArrayListLinkedListです。

次のリストがあるとします。

List<String> arrayList = new ArrayList<>();
// populate the ArrayList

List<String> linkedList = new LinkedList<>();
// populate the LinkedList

両方のクラスが同じインターフェースを実装しているため、最初の要素を削除するサンプルコードは同じように見えます。

arrayList.remove(0);
linkedList.remove(0);

ArrayList の場合、削除のコストは O(n)ですが、 LinkedListのコストはO(1)です。 。

さて、これは、オブジェクトを取得するためのコストが逆であるため、デフォルトとしてLinkedListをどこでも使用する必要があるという意味ではありません。 get(i)を呼び出すコストは、 ArrayListの場合はO(1)、この場合は O(n)です。 LinkedListの。

4. 結論

Javaで配列の最初の要素を削除する方法を見てきました。 さらに、Javaコレクションフレームワークを使用して同じ結果を達成する方法についても見てきました。

サンプルコードはGitHubにあります。