Java には、よく使う機能を持ったクラスが最初から用意されています。この章では、その中から Spring入門で使うものを学びます。int をクラスにした Integer、要素を増やしたり減らしたりできる List、日付を表す Date です。List<Employee> のように型を < > で指定する ジェネリクス の読み方も、ここで覚えます。
この章で学ぶこと
-
Integerとintの違い、自動の変換 -
Integer.parseIntで文字列を数に変える -
ListとArrayList(add・get・size、拡張 for 文) - ジェネリクス
<型>の読み方 java.util.Date
11.1 この章で作るもの
この章では、ch11 パッケージに、社員のクラス Employee と Main を作ります。Employee は、Spring入門の Entity に近づけて、社員IDと年齢を Integer にし、生年月日の Date を持たせます。章の最後には、Main を実行するとコンソールに次のように表示されるようになります(「今の日時」は実行したときの日時になります)。
新規登録前の社員ID:null
社員ID:4
1年後の年齢:31
文字列を数に変換:27
社員の数:3
1人目:雷禅 海皇
雷禅 海皇(26歳)
院照 心愛(27歳)
林檎 星飛(24歳)
今の日時:Tue Oct 13 10:00:00 JST 2026
生年月日:null
| ファイル | 作業 | 内容 |
|---|---|---|
ch11/Employee.java |
新規 | 社員を表すクラス。社員ID・名前・年齢・生年月日を持つ |
ch11/Main.java |
新規 |
Integer・List・Date を使うクラス(main あり) |
11.2 Integer と int
第5章で、「int には null を入れられない」と学びました。社員IDのように、「新規登録の前はまだ値が無い」ことを表したい数には、int をクラスにした Integer を使います。
-
srcを右クリックし、新規 → パッケージ でch11パッケージを作ります。 -
ch11パッケージを右クリックし、新規 → クラス で、名前Employee、mainの チェックを入れずに クラスを作ります。緑の行を入力します(getter と setter は ソース → getter および setter の生成 で作れます)。ch11/Employee.javapackage ch11; /** 社員を表す */ public class Employee { private Integer empId; private String name; private Integer age; public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } -
ch11パッケージを右クリックし、新規 → クラス で、名前Main、mainに チェックを入れて クラスを作り、緑の行を入力します。ch11/Main.javapackage ch11; public class Main { public static void main(String[] args) { Employee e1 = new Employee(); System.out.println("新規登録前の社員ID:" + e1.getEmpId()); e1.setEmpId(4); e1.setName("田中 美咲"); e1.setAge(30); System.out.println("社員ID:" + e1.getEmpId()); int nextAge = e1.getAge() + 1; System.out.println("1年後の年齢:" + nextAge); } } -
保存して、
Main.javaを実行します。コンソール新規登録前の社員ID:null 社員ID:4 1年後の年齢:31
new Employee() の直後、empId には何も入っていないので null です。int なら 0 になり、「社員IDが 0 の社員」なのか「まだ IDが無い」のかを区別できません。Integer なら null で「まだ無い」ことを表せます。
ラッパークラス
Integer のように、基本型の値をクラスの型として扱えるようにしたものを ラッパークラス といいます。基本型ごとに用意されています。
| 基本型 | ラッパークラス |
|---|---|
int |
Integer |
long |
Long |
double |
Double |
boolean |
Boolean |
自動の変換
e1.setEmpId(4) では、int の 4 を Integer の引数に渡しています。int nextAge = e1.getAge() + 1; では、Integer の値を int として計算しています。このように、int と Integer は 自動で変換 されるので、ふつうの数と同じように計算や代入ができます。
【ご注意】null の Integer を int にはできない
Integer が null のときに、int の変数に入れたり計算したりすると、NullPointerException が起きます。e1.setAge(30) の前に int nextAge = e1.getAge() + 1; を書くと、このエラーになります。Integer の値を計算に使うときは、null でないことを確かめてから使います。
【知識メモ】Spring入門では数を Integer にする
Spring入門の Entity と Form では、数の項目(社員ID・性別・年齢・部署ID)をどれも Integer にしています。社員IDは「新規登録の前は無い」ことを表すため、年齢などは「画面で未入力のときに null として受け取り、入力チェックでエラーにする」ためです。
11.3 Integer.parseInt
画面やファイルから受け取った値は、"26" のように数字の 文字列 です。文字列のままでは計算できないので、Integer.parseInt(文字列) で int に変えます。
-
Main.javaのmainメソッドの最後に、緑の行を書き足します。ch11/Main.java(main メソッドの最後)System.out.println("1年後の年齢:" + nextAge); String input = "26"; int age = Integer.parseInt(input); System.out.println("文字列を数に変換:" + (age + 1)); } -
保存して実行します。最後に、次のように表示されます。
コンソール(最後の行)文字列を数に変換:27
Integer.parseInt は、Integer クラスの static なメソッドです(第7章 7.5 の クラス名.メソッド名(…) の形)。"abc" のように数に変えられない文字列を渡すと、NumberFormatException というエラーが起きます。このエラーの扱いは、第12章で学びます。
【知識メモ】Spring入門では変換を Spring が行う
Spring入門では、画面から送られてきた "26" という文字列を、Form の Integer age に Spring が自動で変換して入れてくれます。自分で parseInt を書くことはありませんが、裏で同じことが行われています。
11.4 List と ArrayList
第6章の配列は、作るときに要素の数が決まり、後から増やせませんでした。要素を後から増やしたり減らしたりできる入れ物が List(リスト)です。List はインターフェース(第10章)で、それを実装したクラスの1つが ArrayList です。
-
Main.javaに、社員を作って返すstaticなメソッドcreateと、リストを使う処理を書き足します。List・ArrayListは補完で入力すると、import java.util.List;・import java.util.ArrayList;が自動で入ります。ch11/Main.javapackage ch11; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Employee e1 = new Employee(); System.out.println("新規登録前の社員ID:" + e1.getEmpId()); e1.setEmpId(4); e1.setName("田中 美咲"); e1.setAge(30); System.out.println("社員ID:" + e1.getEmpId()); int nextAge = e1.getAge() + 1; System.out.println("1年後の年齢:" + nextAge); String input = "26"; int age = Integer.parseInt(input); System.out.println("文字列を数に変換:" + (age + 1)); List<Employee> employees = new ArrayList<>(); employees.add(create(1, "雷禅 海皇", 26)); employees.add(create(2, "院照 心愛", 27)); employees.add(create(3, "林檎 星飛", 24)); System.out.println("社員の数:" + employees.size()); System.out.println("1人目:" + employees.get(0).getName()); for (Employee e : employees) { System.out.println(e.getName() + "(" + e.getAge() + "歳)"); } } /** サンプルデータを作るために、社員IDと名前と年齢を決めて社員を作る * @param empId 社員ID * @param name 名前 * @param age 年齢 * @return 作った社員 */ static Employee create(Integer empId, String name, Integer age) { Employee employee = new Employee(); employee.setEmpId(empId); employee.setName(name); employee.setAge(age); return employee; } } -
保存して実行します。
コンソール(後半)社員の数:3 1人目:雷禅 海皇 雷禅 海皇(26歳) 院照 心愛(27歳) 林檎 星飛(24歳)
| コード | 意味 |
|---|---|
List<Employee> employees = new ArrayList<>(); |
Employee を入れる空のリストを作る。変数の型はインターフェースの List、作るのはクラスの ArrayList(第10章の Validatable v1 = e1; と同じ形)。new の後ろの <> は、左と同じ型という意味 |
employees.add(要素) |
最後に要素を足す |
employees.get(添字) |
添字の要素を取り出す。添字は配列と同じく 0 から |
employees.size() |
要素の数。配列の length と違い ( ) を付ける |
for (Employee e : employees) |
拡張 for 文で、要素を先頭から1つずつ取り出す。配列と同じ書き方 |
employees.get(0).getName() は、「get(0) で取り出した Employee の getName() を呼ぶ」という意味です。メソッドの戻り値に対して、続けて . でメソッドを呼べます(第13章 13.5)。
【知識メモ】List 型の変数に ArrayList を入れる理由
Spring入門では、データベースから取り出した社員の一覧を List<Employee> で受け取り、画面のテンプレートに渡します。
List はインターフェースで、ArrayList はそれを実装したクラスです。List を実装したクラスは、ArrayList のほかにも LinkedList などがあります。どのクラスも add・get・size など、List に決められたメソッドを持っています。
変数の型をクラスの ArrayList ではなく、インターフェースの List にしておくのは、そのためです。List 型の変数には、List を実装したクラスなら、どのクラスのオブジェクトの参照でも代入できます。変数を使う側は List のメソッドだけを使って書くので、後から代入するクラスを別のものに変えても、使う側のコードは書き直さずに済みます。第10章 10.4で、インターフェースの型の変数に、それを実装した別々のクラスのオブジェクトを入れたのと同じ考え方です。
Spring入門でも、変数の型は List にします。Spring がどのクラスで一覧を作ったかを気にせずに、List のメソッドと拡張 for 文(テンプレートでは th:each)で順に使えます。ArrayList を自分で new することは、ほとんどありません。
11.5 ジェネリクス
List<Employee> の <Employee> は、「このリストに入れる要素の型は Employee」という指定です。この < > で型を指定する仕組みを ジェネリクス といいます。
| 書き方 | 読み方 |
|---|---|
List<Employee> |
Employee を入れる List
|
List<String> |
String を入れる List
|
List<Integer> |
Integer を入れる List。<int> とは書けない(基本型は指定できないので、ラッパークラスを使う) |
JpaRepository<Employee, Integer> |
型を2つ指定する例(Spring入門)。「扱う Entity は Employee、その ID の型は Integer」。読み方は第13章
|
型を指定しておくと、employees.add("雷禅 海皇") のように違う型を入れようとしたときにコンパイルエラーになり、employees.get(0) の結果は Employee として、キャスト無しでそのまま使えます。この教材では、ジェネリクスを自分で定義することはなく、使う側として読み書きできれば十分 です。
11.6 Date
日付と時刻を表すクラスが java.util.Date です。new Date() と書くと、今の日時を持つオブジェクトができます。
-
Employee.javaに、生年月日のフィールドと getter・setter を書き足します。Dateは補完で入力し、候補から「Date - java.util」を選びます(java.sql.Dateという別のクラスも候補に出るので、java.utilのほうを選びます)。ch11/Employee.java(追加する部分)package ch11; import java.util.Date; /** 社員を表す */ public class Employee { private Integer empId; private String name; private Integer age; private Date birthDate; …(これまでの getter と setter)… public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } } -
Main.javaのmainメソッドの最後に、緑の行を書き足します。Dateはここでも補完で入力し、import java.util.Date;を入れます。ch11/Main.java(main メソッドの最後)for (Employee e : employees) { System.out.println(e.getName() + "(" + e.getAge() + "歳)"); } Date now = new Date(); System.out.println("今の日時:" + now); System.out.println("生年月日:" + e1.getBirthDate()); } -
保存して実行します。
コンソール(最後の2行)今の日時:Tue Oct 13 10:00:00 JST 2026 生年月日:null
Date を println で表示すると、「曜日 月 日 時:分:秒 タイムゾーン 年」の英語の形になります。2026/10/13 のような形で表示したり、画面から入力された日付を Date に変換したりする方法は、Spring入門で画面を作るときに学びます。この教材では、Date は「日付を入れる型」として、フィールドに持たせるところまでにします。値を入れていない birthDate は null です。
【知識メモ】java.time.LocalDate
Java には、日付だけを扱う新しいクラス java.time.LocalDate もあります。この教材と Spring入門では、現場で今も広く使われている java.util.Date を使います。
11.7 うまくいかないときは
| 症状 | 考えられる原因と対処 |
|---|---|
NullPointerException が int nextAge = e1.getAge() + 1; で出る |
getAge() が null を返しています。setAge(…) で値を入れてから計算してください。詳しくは 付録A「よくある実行時のエラー」 を見てください。 |
| 「List を型に解決できません」「ArrayList を型に解決できません」 |
import java.util.List;・import java.util.ArrayList; がありません。クラス名の末尾で Ctrl + Space を押して import を入れてください。 |
| 「型 List<Employee> のメソッド add(Employee) は引数 (String) に適用できません」 | リストに、指定した型と違う型の値を入れようとしています。< > の型と、入れる値の型を合わせてください。 |
| 「length を解決できないか、フィールドではありません」 |
List の要素の数は size() です。length は配列です。 |
Employee.java の import が import java.sql.Date; になっている |
補完で java.sql.Date を選んでしまっています。この章では動きますが、第14章以降で日付を入れるときにエラーになります。import の行を import java.util.Date; に直してください。 |
NumberFormatException が出る |
Integer.parseInt に、数に変えられない文字列を渡しています。第12章で扱います。詳しくは 付録A「よくある実行時のエラー」 を見てください。 |
ほかのエラーは、付録A「よくあるコンパイルエラー」・付録A「よくある実行時のエラー」 も参考にしてください。
11.8 まとめと確認問題
まとめ
-
Integerはintの ラッパークラス。nullを入れられるので、「まだ値が無い」ことを表せる。intとは自動で変換されるが、nullをintにするとNullPointerException -
Integer.parseInt("26")で文字列をintに変える。数に変えられない文字列はNumberFormatException -
List<Employee> employees = new ArrayList<>();で要素を増減できるリストを作る。add・get(添字)・size()、拡張 for 文で使う。import java.util.List;・import java.util.ArrayList;が必要 -
ジェネリクス
<型>は、入れる要素の型の指定。基本型は書けないのでラッパークラスを使う -
java.util.Dateは日付と時刻を表すクラス。new Date()は今の日時。Spring入門では生年月日に使う
この章で使ったクラスとメソッドは、付録B「クラスとメソッド早見表」 にまとめています。
確認問題
問1 社員IDを int ではなく Integer にする理由を答えてください。
解答を見る
Integer なら null を入れられるので、「新規登録の前で、まだ社員IDが無い」ことを表せるためです。int だと 0 になり、「IDが 0」なのか「まだ無い」のかを区別できません。
問2 文字列 "30" を int の変数 n に入れるコードを書いてください。
解答を見る
int n = Integer.parseInt("30");
問3 String を入れるリストを作り、"営業部" を足して、要素の数を表示するコードを書いてください。
解答を見る
List<String> depts = new ArrayList<>();depts.add("営業部");System.out.println(depts.size());
問4 List<int> と書けないのはなぜですか。どう書きますか。
解答を見る
ジェネリクスには基本型を指定できないためです。ラッパークラスを使って List<Integer> と書きます。
問5 配列とリストで、要素の数を調べる書き方はそれぞれどう違いますか。
解答を見る
配列は names.length(( ) なし)、リストは employees.size()(( ) あり)です。