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)を参照してください。。
その他の拡張