Java データ構造

Java はデータを処理・整理するための豊富なデータ構造を提供しています。

Java の java.util パッケージには、これらのデータ構造の実装が多数用意されており、必要に応じて適切なクラスを選択できます。

以下は、一般的な Java データ構造の一部です:

配列(Arrays)

配列(Arrays)は基本的なデータ構造であり、固定サイズで同じ型の要素を格納できます。

int[] array = new int[5];
  • 特徴:サイズが固定で、同じ型の要素を格納します。
  • 利点:要素へのランダムアクセスが効率的です。
  • 欠点:サイズが固定で、要素の挿入と削除が比較的遅いです。

リスト(Lists)

Java には、ArrayList や LinkedList などの複数のリスト実装が用意されています。

List<String> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();

ArrayList:

  • 特徴:動的配列であり、サイズを変更できます。
  • 利点:効率的なランダムアクセスと高速な末尾への挿入。
  • 欠点:途中への挿入と削除は比較的遅いです。

LinkedList:

  • 特徴:双方向リンクリストであり、要素同士がポインタで接続されています。
  • 利点:要素の挿入と削除が効率的で、イテレータのパフォーマンスが良いです。
  • 欠点:ランダムアクセスは比較的遅いです。

セット(Sets)

セット(Sets)は重複しない要素を格納するために使用され、一般的な実装として HashSet や TreeSet があります。

Set<String> hashSet = new HashSet<>();
Set<Integer> treeSet = new TreeSet<>();

HashSet:

  • 特徴:順序付けられていないセットで、HashMap に基づいて実装されています。
  • 利点:効率的な検索と挿入操作。
  • 欠点:順序が保証されません。

TreeSet:

  • 特徴:TreeSet は順序付けられたセットで、内部は赤黒木に基づいて実装されており、重複要素は許可されません。
  • 利点:自動ソート機能を提供し、要素を順番に格納する必要がある場面に適しています。
  • 欠点:パフォーマンスは比較的低く、null 要素の挿入は許可されません。

マップ(Maps)

マップ(Maps)はキーと値のペアを格納するために使用され、一般的な実装として HashMap や TreeMap があります。

Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();

HashMap:

  • 特徴:ハッシュテーブルに基づいて実装されたキーと値のペアの格納構造です。
  • 利点:効率的な検索、挿入、削除操作。
  • 欠点:順序付けられておらず、順序が保証されません。

TreeMap:

  • 特徴:赤黒木に基づいて実装された順序付けられたキーと値のペアの格納構造です。
  • 利点:順序付けられており、キーの順序に従った走査をサポートします。
  • 欠点:挿入と削除は比較的遅いです。

スタック(Stack)

スタック(Stack)は線形データ構造の一種で、後入れ先出し(Last In, First Out、LIFO)の原則に従って要素を管理します。スタックでは、新しい要素はスタックの一番上に追加され、要素を削除できるのはスタックの一番上からのみです。つまり、最後に追加された要素が最初に削除されることを意味します。

Stack<Integer> stack = new Stack<>();

Stack クラス:

  • 特徴:スタックを表し、通常は後入れ先出し(LIFO)の順序で要素を操作します。

キュー(Queue)

キュー(Queue)は先入れ先出し(FIFO)の原則に従い、一般的な実装として LinkedList や PriorityQueue があります。

Queue<String> queue = new LinkedList<>();

Queue インターフェース:

  • 特徴:キューを表し、通常は先入れ先出し(FIFO)の順序で要素を操作します。
  • 実装クラス: LinkedList, PriorityQueue, ArrayDeque。

ヒープ(Heap)

ヒープ(Heap)は優先キューの基礎であり、最大ヒープと最小ヒープを実装できます。

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

ツリー(Trees)

Java には TreeNode 型が用意されており、二分木などのデータ構造を構築するために使用できます。

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

グラフ(Graphs)

グラフの表現は通常、独自のデータ構造を定義するか、グラフライブラリを使用する必要があり、Java には組み込みのグラフクラスはありません。

以上で紹介したのは、Java における一般的なデータ構造の一部にすぎません。実際には、特定の問題に応じて選択できるデータ構造やアルゴリズムが他にも数多くあります。


その他の説明

以下のクラスは伝統的なレガシークラスです。Java 2 では、新しいフレームワークであるコレクションフレームワーク(Collection)が導入されましたが、これについては後で説明します。

列挙(Enumeration)

列挙(Enumeration)インターフェースは、それ自体はデータ構造に属しませんが、他のデータ構造の分野で広く応用されています。列挙(The Enumeration)インターフェースは、データ構造から連続する要素を取得する方法を定義します。

例えば、列挙には nextElement というメソッドが定義されており、このメソッドは複数の要素を含むデータ構造の次の要素を取得するために使用されます。

列挙インターフェースの詳細については、列挙(Enumeration)を参照してください。。

ビットセット(BitSet)

ビットセットクラスは、個別に設定およびクリアできるビットまたはフラグのグループを実装します。

このクラスは、一連のブール値を処理するときに非常に便利です。各値に1「ビット」を割り当て、ビットを適切に設定またはクリアするだけで、ブール値を操作できます。

このクラスの詳細については、ビットセット(BitSet)を参照してください。。

ベクター(Vector)

ベクター(Vector)クラスは従来の配列と非常に似ていますが、Vector のサイズは必要に応じて動的に変更できます。

配列と同様に、Vector オブジェクトの要素もインデックスを介してアクセスできます。

Vector クラスを使用する最大の利点は、オブジェクトの作成時にサイズを指定する必要がなく、サイズが必要に応じて動的に変化することです。

このクラスの詳細については、ベクター(Vector)を参照してください。

スタック(Stack)

スタック(Stack)は、後入れ先出し(LIFO)のデータ構造を実装します。

スタックは、オブジェクトが垂直に積み重なったものと考えることができます。新しい要素を追加すると、その要素は他の要素の上に置かれます。

スタックから要素を取り出すときは、スタックの一番上から要素を1つ取り出します。言い換えれば、最後にスタックに入れた要素が最初に取り出されます。

このクラスの詳細については、スタック(Stack)を参照してください。。

辞書(Dictionary)

辞書(Dictionary)クラスは抽象クラスであり、キーを値にマッピングするデータ構造を定義します。

整数インデックスではなく特定のキーを介してデータにアクセスしたい場合は、Dictionary を使用する必要があります。

Dictionary クラスは抽象クラスであるため、キーを値にマッピングするデータ構造のみを提供し、特定の実装は提供しません。

このクラスの詳細については、辞書(Dictionary)を参照してください。。

Dictionary クラスは新しい Java バージョンでは非推奨(deprecated)になっており、Dictionary の代わりに Map インターフェースとその実装クラス(HashMap、TreeMap など)を使用することをお勧めします。

Map インターフェースとその実装クラスについては、以下を参照してください:Java コレクションフレームワーク。

ハッシュテーブル(Hashtable)

Hashtable クラスは、ユーザー定義のキー構造に基づいてデータを整理する手段を提供します。

例えば、アドレスリストのハッシュテーブルでは、人名ではなく郵便番号をキーとしてデータを保存および並べ替えることができます。

ハッシュテーブルのキーの具体的な意味は、ハッシュテーブルの使用状況とそのデータに完全に依存します。

このクラスの詳細については、ハッシュテーブル(HashTable)を参照してください。。

プロパティ(Properties)

Properties は Hashtable を継承します。Properties クラスは永続的なプロパティセットを表します。プロパティリスト内の各キーとそれに対応する値はすべて文字列です。

Properties クラスは多くの Java クラスで使用されています。例えば、環境変数を取得する際に、System.getProperties() メソッドの戻り値として使用されます。

このクラスの詳細については、属性(Properties)を参照してください。。

その他の拡張