皆さんこんにちは!開発エンジニアをしているnkumaです!
最近、業務でJava 配列を見かけたのですが、久しく触っていなかったためにかなりド忘れしていました。
そのため、復習がてらJava 配列についてブログに起こしてみようと発起した次第です。
本記事では、Java 配列の宣言・代入といった基本から、ソートや要素を増やすなどのちょっとした応用までを紹介していきます。
Javaを学び始めて、「変数、代入の意味は分かるよ!」という方向けの内容です。
「Java 配列なんて知ってるよ!」という中級者の方も、応用編以降はためになると思うので、是非ご一読ください!
構文だけでなく、具体的なコードも併せて記載していますので、すぐにでも使えるようになるかと思います。
※大半の具体例コードは、以下の配列があることが前提です。
String[] dogs = {"ポチ太郎","ポチ次郎","ポチ三郎","ポチ四郎","ポチ五郎","ポチ六郎","ポチ七郎","ポチ八郎","ポチ九郎","ポチ十郎"};
Java 配列とは
こんなケースを考えてみてください。
まず、10個の似たような変数を用意します。(①)
そして、全ての変数に共通の処理をします。(②)
// ①10個の似たような変数を作成 String dog1 = "ポチ太郎"; String dog2 = "ポチ次郎"; String dog3 = "ポチ三郎"; String dog4 = "ポチ四郎"; String dog5 = "ポチ五郎"; String dog6 = "ポチ六郎"; String dog7 = "ポチ七郎"; String dog8 = "ポチ八郎"; String dog9 = "ポチ九郎"; String dog10 = "ポチ十郎"; // ②全ての変数に共通の処理 dog1 = dog1 + "(犬)"; dog2 = dog2 + "(犬)"; dog3 = dog3 + "(犬)"; dog4 = dog4 + "(犬)"; dog5 = dog5 + "(犬)"; dog6 = dog6 + "(犬)"; dog7 = dog7 + "(犬)"; dog8 = dog8 + "(犬)"; dog9 = dog9 + "(犬)"; dog10 = dog10 + "(犬)";
とても面倒ですよね…10個なら面倒で済みますが、1000個とかなら到底できそうにないです。
Java 配列はそんな面倒から、ある程度解放してくれます!
// ①10個の値が入ったJava 配列を作成 String[] dogs = {"ポチ太郎","ポチ次郎","ポチ三郎","ポチ四郎","ポチ五郎","ポチ六郎","ポチ七郎","ポチ八郎","ポチ九郎","ポチ十郎"}; // ②Java 配列に入った全ての値に同じ処理をする for (String dog : dogs) { dog = dog + "(犬)"; }
10個の値を一つの変数にまとめることができました!
これをループさせることで、一つ一つを手打ちで書かなくても共通処理が書けるようになりました!
かなり楽をできるようになったと思います。
10個の値を一つの変数にまとめたように、
Java 配列とは、値を複数保持できる変数のことです!
Java 配列の特徴
Java 配列にはいくつかの特徴があります。
それに伴って、用語があるのでそれらをまず紹介します。
- 要素
- 配列の中の値のこと
- インデックス
- 要素を呼び出すために順番についている番号札、ラベルみたいなもの
- 0から始まることに注意!
次に、Java 配列の持つ主な特徴です。
- 要素は固定長
- = 最初に決めた数以上のものは入れられない!
- Java 配列には便利なメソッドがいくつもある
- 配列の中身を並び替えたり、他の配列にコピーしたりできる。
- 中身のループが簡単!
- 拡張for文という、中身をループさせるのに特化した記載方法がある。
以降は、Java 配列の基本的な使い方や応用的な使い方を紹介していきます!
基本編
ここでは、宣言や代入といった初歩的なことを説明いたします。
「そんなの知ってるよ!」という方は、応用編からお読みください。
Java 配列の作り方
Java 配列の作り方から説明していきます。
宣言・要素数の指定
まずは、変数という受け皿を作ります。 いくつか注意することがあるので気を付けて下さい。
- 配列変数名には、「複数形」を使うのが一般的
- 要素数の指定は、1から始まる普通の数字!
- 後述の呼び出すときに用いる「0から始まるインデックス」とは違うので注意してください!
構文
// Java 配列の宣言 型[] 配列変数名; // 要素数の指定 配列変数名 = new 型[要素数]
具体例コード
// Java 配列の宣言 String[] dogs; // いつも通りの型に「[]」をつけるだけ、dogの集合なので「dogs」 // 要素数の指定 dogs = new String[10]; // 10個の値を入れたかったら、10を指定する
代入
次は、配列の中身を入れていきます。
配列のどこにいれるかを指定するには「インデックス」を使います。
インデックスは0から始まるので注意してください!
上述の要素数の指定とずれることになります。(要素数の指定「10」⇒インデックスの最後「9」)
構文
// Java 配列の代入
配列変数名[インデックス] = 代入する値;
具体例コード
System.out.println(dogs[0]); // 「ポチ太郎」と出力(0から始まるので一番初めの「ポチ太郎」) // Java 配列の代入 dogs[0] = "タマ太郎"; System.out.println(dogs[1]); // 「タマ太郎」と出力
インデックスを指定すれば、最初から入れなければならないというルールはありません。
ちなみに、一度も代入されていないものでもデフォルト値が自動で入っています。
(Stringならnull、intなら0など型によって決まっている)
int[] numbers; numbers = new int[100]; nembers[50] = 999; // 0~49に値は入れていないが問題なし System.out.println(numbers[50]); // 「999」が出力される System.out.println(numbers[10]); // 「0」が出力される(一度も代入してないのでデフォルト値)
初期化
Java配列を作るには、宣言して…要素数を指定して…値を代入して…と面倒ですよね…。
ここで便利な記法を紹介します。
宣言と代入を同時に行う「初期化」です!
入れる値が決まっているならば、この方法で作るのが一般的ですね。
代入する値はいくつでも可能です。
構文
// Java 配列の初期化 型[] 配列変数名 = {代入する値①, 代入する値②, 代入する値③, ... , 代入する値㊿ };
具体例コード
// Java 配列の初期化 String[] dogs = {"ポチ太郎", "ポチ次郎", "ポチ三郎", "ポチ四郎", "ポチ五郎", "ポチ六郎", "ポチ七郎", "ポチ八郎", "ポチ九郎", "ポチ十郎"};
Java 配列の中身の使い方
要素の取得
Java 配列の中身を取得するには、インデックスを利用します。
インデックスは0から始まることに注意です。
2番目に入れた値を取り出すなら「1」、10番目に入れた値を取り出すなら「9」とする必要があります。
取得の仕方がやや違うだけで、普通の変数と同じように利用することができます。
構文
配列変数名[取得したいインデックス]
具体例コード
System.out.println(dogs[2]); // 「ポチ三郎」が出力される System.out.println(dogs[8]); // 「ポチ九郎」が出力される String HelloDogs = "こんにちは!" + dogs[5] + "と" + dogs[9]; System.out.println(dogs[8]); // 「こんにちは!ポチ六郎とポチ十郎」が出力される
Java 配列 ループのさせ方
Java 配列の中身をループさせる代表的な方法「拡張for文」を紹介します。
拡張for文は「foreach文」とも呼ばれます。
大抵のエディタはforeach
と打てば、補完機能で拡張for文が出てくると思います。
これは「配列の中身全てを順番に処理する」のに向いています。
forの条件文で型は配列に合わせた型([]を除いた型
)を、宣言する変数名は何でもいいです。
(一般的には配列変数名の単数形です)
そこで宣言した変数に、順番に配列の中身が入っていきます。
その変数を利用して、for内部のループして行いたい処理を書きましょう。
配列の中身がなくなったらループは自動的に終了します!
構文
for (型 変数名 : ループしたい配列変数名) {
ループして行いたい処理
}
具体例コード
for (String dog : dogs) { // 配列はString[]なので型はString dog = dog + "(犬)" // dogに「ポチ太郎、ポチ次郎...」と順番に中身が入っていく }
応用編
配列をコピーする
Java 配列を「そのままコピー」するには、コピー元配列名.clone()
メソッドを使います。
対して、「部分的にコピー」したいときにはSystem.arraycopy()
メソッドです。
構文
// Java 配列を「そのままコピー」する 型[] コピー先の配列変数名 = コピー元の配列変数名.clone(); // Java 配列の「一部分をコピー」する System.arraycopy(①コピー「元」の配列変数名, ②コピー「元」のコピー開始位置, ③コピー「先」の配列変数名, ④コピー「先」のコピー開始位置, ⑤コピーの個数);
具体例コード
// Java 配列を「そのままコピー」する String[] dogs2 = dogs.clone(); System.out.println(dogs[1] + " | " + dogs2[1]); //「ポチ太郎 | ポチ太郎」と出力される System.out.println(dogs[8] + " | " + dogs2[8]); // 「ポチ七郎 | ポチ七郎」と出力される // Java 配列の「一部分をコピー」する String[] dogs2 = new String[5]; System.arraycopy(dogs, 5, dogs2, 0, 5) // ①dogsの②6個目(※インデックスなので0から数える)から、⑤5個を、③dogs2の④1つ目(インデックスなので…以下略)以降にコピーする System.out.println(dogs[5] + " | " + dogs2[0]); // 「ポチ六郎 | ポチ六郎」と出力される System.out.println(dogs[9] + " | " + dogs2[4]); // 「ポチ十郎 | ポチ十郎」と出力される
要素数の増やし方
どうやっても、配列の要素数を途中で増やす方法はありません。
ですが、上述の「部分的にコピーするSystem.arraycopy()
メソッド」を使えば疑似的に要素数を増やすことができます!
具体例コード
// 「元々の数+増やしたい分」の要素数を指定した配列を新しく作成 int count = dogs.length + 10; // dogsの要素数 + 10個 = 20個 String[] dogs2 = new String[count]; // 配列をコピーする System.arraycopy(dogs, 0, dogs2, 0, dogs.length); // dogsの最初から要素の数だけ、dogs2の最初以降にコピー dogs2[15] = "ポチ十六郎"; System.out.println(dogs2[5]); // 「ポチ六郎」と出力される System.out.println(dogs2[15]); // 「ポチ十六郎」と出力される
配列の全ての要素を指定した値で埋める
Java 配列を指定した値で全て埋めるには、Arrays.fill()
メソッドを利用します。
構文
// Java 配列を指定した値で全て埋める
Arrays.fill(配列変数名, 埋める値);
具体例コード
String[] animals = new String[10]; Arrays.fill(animals, "犬"); System.out.println(animals[0]); // 「犬」と出力される System.out.println(animals[5]); // 「犬」と出力される
Java 配列の一歩先へ
ここでは、配列の派生形・類似的なものを紹介いたします。より高度で実践的です。
どれも詳しく解説するだけで1記事、2記事となってしまうもののため、簡単な説明のみとしています。
触りの部分だけでも勉強になると思うので、「へえ、こんなのがあるんだ。便利そう。」って感覚くらいでお読みください。
そして、興味を持ったなら是非調べてみてください。
よりたくさんの情報を扱う「多次元配列」
多次元配列とは、「配列の中にまた配列を入れたもの」になります。
2次元配列は「配列①の中に配列②が入っているもの」、3次元配列は「配列①の中に、配列③が入っている配列②が入っているもの」です。
2次元配列とかは縦・横のマス目で考えると分かりやすいと思います。
それでもかなり複雑になってしまうので、安易に使うことは避けましょう。
使い方
以下は、2次元配列を例に挙げています。
構文
// 2次元配列の宣言 データ型[][] 配列変数名 = new データ型[要素数①][要素数②]; // 要素数①:いくつ配列を入れるのか // 要素数②:中身の配列の要素数 // 2次元配列の代入 配列変数名[0][0] = 代入する値; 配列変数名[0][1] = 代入する値; 配列変数名[0][2] = 代入する値; ・・・ 配列変数名[1][0] = 代入する値; 配列変数名[1][1] = 代入する値; // 2次元配列の取得 System.out.println(配列変数名[0][0]);
要素を後から継ぎ足しできる「List」
こちらはかなり便利です!
Java 配列と同じ「値のまとまり」ですが、不便だった「後から追加できない」を解消しており、「どんどん追加することができる」という特徴があります。
ちなみに一口にListといっても、要素の取得が早いが挿入や削除が遅いArrayList
、要素の挿入や削除は早いが取得が遅いLinkedList
があります。
使い方
構文
// Listの宣言 List<型> リスト名 = new ArrayList<型>(); // Listに値を追加 リスト名.add(追加する値); // Listの値を書き換える リスト名.set(書き換えたい値のインデックス, 書き換える値); // Listの値を取得する リスト名.get(取得したいインデックス);
具体例コード
// Listの宣言 List dogsList<String> = new ArrayList<String>(); // Listに値を追加 dogsList.add("ポチ太郎"); dogsList.add("ポチ次郎"); dogsList.add("ポチ三郎"); // Listの値を書き換える dogsList.set(2, "タマ三郎"); // Listの値を取得する System.out.println(dogsList.get[0]); // 「ポチ太郎」と出力される System.out.println(dogsList.get[2]); // 「タマ三郎」と出力される
Java 配列とListの違い
Listの方が便利そうですが、何でもListを使えばいい訳ではありません。
Listはデータ保持の都合上、「特定のインデックスにアクセスする」場合に時間がかかってしまうなどデメリットもあります。
何も意識せず、とりあえずListを使うのではなく、使い分けを意識しましょう。
意外とJava 配列を使う時には、後から要素を追加したいことが少なかったりします。
以下はJava 配列とListの使い分けです。参考にしていただけると幸いです。
インデックスに名前をつけられる「Map」
配列やListの要素を取得するときは、インデックスという数字を使っていました。
しかし、実際に利用しようとなるとどこに何が入っているか分かりません。
それぞれの値に数字じゃなくて、「名前が付けられたら分かりやすいのに・・・」と思う場面も多そうです。
ここで紹介するのが「Map」です。
Mapは「インデックスの代わりに名前をつける」ことができます。
インデックスの代わりにつける名前のことを「キー」と呼びます。
また、Mapは通常「HashMap」を使いますが、特徴をもった「LinkedMap」「TreeMap」というのもあります。
使い方
構文
// Mapの宣言 Map<キーの型, 値の型> マップ名 = new HashMap<キーの型, 値の型>(); // Mapの代入 マップ名.put(キー, 値); // Mapの取得 マップ名.get(キー);
具体例コード
// Mapの宣言 Map<String, String> dogsMap = new HashMap<String, String>; // Mapの代入 dogsMap.put("黒犬","ポチ太郎"); dogsMap.put("白犬","ポチ次郎"); // Mapの取得 System.out.println(dogsMap.get["赤い犬"]); // 「ポチ太郎」と出力される
Java 配列 使い方 まとめ
業務でJava 配列を利用することは機会は多くはありません。
ListやMapの方がよく出てくるイメージがあります。
しかし、(特に初心者の方は)おろそかにするわけにはいきません。
Java 配列の考え方を基にすることで、ListやMap、それ以外のことも理解がしやすくなるからです。
また、比較的少ないとはいえ配列を使うこともあります。
ぜひ一度、上述の具体例コードを参考にしながら、ご自身で書いてみてください!
◆ 関連ブログ
・Java 18 インストールと新機能紹介【最新版】
・【多言語対応】Spring Boot+Java - 動的に言語を切り替る方法 -
・オブジェクト指向を学ぶためのオブジェクト指向エクササイズ
・【入門】Spring Bootとは~実践まで
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com