Javaの配列やコレクションは集合を取り扱うデータ構造です。複数の要素(オブジェクト)の集合をうまく取り扱うことで、プログラムの見通しを改善できます。
🎂 コレクション
コレクション・フレームワークのインターフェースと具象クラスの一覧です。
出典:改訂2版 パーフェクトJava
コレクションを使うコードのサンプルです。
List
はStringを要素とするリストです。コレクション型の要素には参照型を指定します。インターフェースの
List
を使うのは、実装ArrayList
よりも依存を下げるためです。public class SampleList { |
🚌 Listインターフェースのメソッド
Listインターフェースの代表的なメソッドの紹介です。
メソッド名 | 説明 |
---|---|
add |
要素の追加 |
addAll |
要素をまとめて追加 |
contains |
要素の存在チェック |
get |
要素の取得 |
indexOf |
要素の検索 |
lastIndexOf |
後方からの要素の検索 |
remove |
要素の削除(複数ある場合は最初の要素を削除) |
set |
要素の置換 |
size |
要素数の取得 |
subList |
部分リストの取得(コピーではなく、参照による部分リストを返す) |
出典:改訂2版 パーフェクトJava
Listどうしの結合:addAll
JavaのListインターフェイスで定義されたaddAll()
メソッドはListどうしを結合できます。
import java.util.ArrayList; |
結果は次のとおりで、2つのListが結合されているのがわかります。
1-1 |
🐯 ArrayListとLinkedListの選び方
Listインターフェースの主要な具象クラスは、配列を使った実装のArrayList
とリンクノードを使った実装のLinkedList
があります。
ArrayList
は取得(get)や要素の更新(set)が早いですが、要素の挿入(add)が早くありませんLinkedList
は要素の挿入(add)、削除(remove)が早いですが、検索(indexOf)や要素の取得(get)は早くありません
上の特徴を踏まえて、ArrayList
とLinkedList
は次のように使い分けます。
- 要素の読み込み(検索)や書き換えが中心なら
ArrayList
がよい - 要素の挿入や削除の頻度が高い場合は
LinkedList
が効率的
🚕 補足:ArrayのtoStringについて
配列Array
のtoString
は次のような定義になります。
public String toString() { |
つまり、配列をSystem.out.println
に渡すとハッシュ値を返します。
🐮 補足:配列の初期化演算子
配列の初期化はいくつかパターンがあるので注意してください。
int[] array = { 2, 3 }; |
以下はコンパイルエラーになるので注意してください。
// { xxx } で要素数を自動で取得するので指定してはだめ |
😼 補足:配列のコピー:arraycopy
配列のコピーを行うSystem.arraycopy
は5つの引数を受け取る少し不雑なメソッドです。
引数 | 説明 |
---|---|
第1引数 | コピー元となる配列 |
第2引数 | コピー元のどの位置からコピーを開始するか(0始まり) |
第3引数 | コピー先の配列 |
第4引数 | コピー先配列のどの位置からコピーを開始するか(0始まり) |
第5引数 | 第2引数のいちからいくつの要素をコピーするか |
char[] arrayA = { 'a', 'b', 'c', 'd', 'e' }; |
🎃 補足:java.util.Queue
インターフェース
キュー専用のインターフェイス。Queueの実装はArrayDeque
を使うと良さそう。
Queue |
オプション | 失敗時に例外 | 戻り値で判定 |
---|---|---|
末尾に追加 | add() |
offer() |
先頭から削除 | remove() |
poll() |
先頭から取得(削除しない) | element() |
peek() |
🍮 補足:Array
からArrayList
への変換
JavaでArray
からArrayList
に変換する方法です。
String[] alpha = { "a", "b", "c", "d", "e" }; |
🎉 参考リンク
- 改訂2版 パーフェクトJava
- How to join/combine two ArrayLists in java
- java - Why is ArrayDeque better than LinkedList