よく使うクラス

Java基礎 7

1.本章での学習項目

本章では、Javaにある標準のクラスの調べ方とよく使うクラスを学習します。

2.本章の講義

本章で学習する内容を動画としてまとめたものです。最初に一通り見終わった後で、学習に入るようにしてください。

講義:よく使うクラス

3.クラスライブラリ

Javaには、予め多くのクラスが用意されています。
例えば、ファイルからデータを読み込んだり、書き込んだりという処理は、読み込むデータファイルが違っても基本の処理は同じになりますので、その処理を毎回プログラミングすることは、非効率です。
そのような、共通的に利用できる処理については、Javaで既に多くクラスが用意されています。これらのクラスをクラスライブラリと呼んでいます。

通常、Javaでプログラミングするときには、これらのクラスライブラリをうまく利用してプログラミングしていき、効率化を図ります。
既にあるクラスの機能を利用せず、自分で一からプログラムを記述しないように、これらのクラスライブラリの調べ方や使い方を習得しておく必要があります。
この章では、Javaのクラスライブラリの中でも、よく使うクラスを学習しながら、クラスライブラリの調べ方と使い方を学習します。

3.1.APIドキュメント

上記で説明したとおり、Javaには、標準で用意されたクラスが多くあります。
よく使うクラスやそれらのクラスに定義されているフィールドやメソッドでよく使うものについては、プログラミングしているうちに覚えてしまうものもあります。

しかし、あまりに多くありすぎるため殆どのクラスは覚えることはできません。
システム開発で、現役のプログラマーとして活躍している技術者も全てを覚えているわけではありません。
開発のときに、都度、適切なクラスを調べることでプログラミングを行っています。

API(エーピーアイ)ドキュメントとは、そういったクラスをまとめた辞書のようなWebページです。
APIとは、Application Program Interfaceの略で、クラスやメソッド、フィールドなどの情報です。
このAPIドキュメントを使うことによって、Javaのクラスライブラリを調べて、実際のプログラミングに活かすことができます。

APIドキュメントで確認できる主な情報は、以下のとおりです。

  • クラスの概要
  • コンストラクタ、フィールド、メソッドの一覧と説明
  • 発生する例外(例外については、後述します。)
  • 継承関係(継承については、後述します。)

このAPIドキュメントは、インターネットで検索可能です。以下のリンクをクリックしてみてください。

APIドキュメント

以下のような画面が表示されたでしょうか。この画面がAPIドキュメントの画面です。


frequently class javadoc1

この章で学習を始める前に、まずこのAPIドキュメントの使い方を確認していきます。

それでは、トップの画面から確認します。この画面は、ドキュメントの概要と、モジュールの一覧が表示されます。
モジュールはJava 9より導入された各機能の単位です。これから学習する、パッケージ、クラスはそれぞれのモジュールに分類されています。
それでは、画面を下の方にスライドし、赤枠の「java.base」モジュールをクリックしてみましょう。


frequently class javadoc2

「java.base」モジュールに分類されている、パッケージの一覧が表示されます。
クラスは、このパッケージという単位で分類されています。
このパッケージの中から、APIを確認したいクラスを探します。

今回学習するIntegerクラスを調べてみましょう。Integerクラスが属するパッケージは、「java.lang」というパッケージです。
「java.lang」を探してクリックしてください。


frequently class javadoc3

以下のような画面が出てきます。この画面をスライドさせ、「Integer」クラスを探してクリックしてください。
なお、右上の検索欄から探すことも可能です。


frequently class javadoc4

「Integer」クラスをクリックすると、以下のような画面が表示されます。


frequently class javadoc5

この画面が、Integerクラスの説明が記述された画面です。
すでに定義されたコンストラクタやフィールド、メソッドなどが一覧で紹介されていることが確認できたでしょうか。
各メソッドやフィールドをクリックすると、それらの説明が確認できます。

このように、APIドキュメントは標準で用意されているクラスライブラリを調べるときに利用します。
例えば、クラスを検索したり、またクラスの中のメソッドを調べたりするときに有効です。
この章の学習の中で出てくるクラスについては、都度APIドキュメントで確認し、使い方に慣れるようにしましょう。

Information

よく使うパッケージ

Javaの標準クラスを分類しているパッケージの中でよく使うパッケージについて、以下に記載しておきます。
今後、少しずつ、これらのパッケージにあるクラスをチェックしておくと良いでしょう。

パッケージ名 説明
java.lang Javaの基本クラス
java.util 汎用的な各種ユーティリティクラス
java.io 入出力用クラス
java.sql データベース関連のクラス

3.2.Javadocコメント

上記で説明したAPIドキュメントに記載されているような、クラスやメソッドの概要、戻り値や引数の定義について、自身のプログラムにも記載することができます。
それをJavadocコメントといいます。
Javadocコメントは、定められた記法に則って、クラスやメソッド、フィールドに付与します。
以下に、クラス、フィールド、メソッドそれぞれにJavadocコメントを記載した例を示します。

StudentName.java
/**
 * 生徒の名前を扱うクラス
 * @author techfun
 *
 */
public class StudentName {
	/**
	 * 生徒名フィールド
	 */
	String name;

	/**
	 * 名前を引数として受け取り、
	 * 生徒名フィールドにセットする
	 * @param tName 名前
	 */
	void setName(String tName) {
		name = tName;
	}

	/**
	 * 生徒名を戻り値として返す
	 * @return name 生徒名
	 */
	String getName() {
		return name;
	}
}

Javadocコメントは、コメントの一種であるため、プログラム実行時の動作に影響はありません。
「/**」と「*/」で囲み、その間に記載していきます。
Eclipseには、Javadocコメントを簡単に記載するための機能があります。
どのメソッドでも構いませんので、メソッドの定義の1行上にカーソル持っていき、「/**」と入力してEnterキーを押してみてください。

/**
 *
 * @param tName
 */
void setName(String tName) {
	name = tName;
}

自動的に「*(アスタリスク)」と、Javadocコメントの終わりを表す「*/」が入力され、 上記の例だと、その間に「@param」と入力されます。
こちらに追記するかたちで、Javadocコメントを記述していきます。
基本的には1行目に処理概要、2行目以下にクラスの作成者や、引数や戻り値の情報を記述します。
クラスのJavadocコメントの「@author」にはクラスの作成者、メソッドの「@param」には引数、「@return」には戻り値をそれぞれ記載します。
Javadocコメントに記述すべき内容は、上記で説明したAPIドキュメントに記載されている情報とほぼ同義であると考えてください。
つまり、そのJavadocコメントを見れば、クラスやメソッドの概要、戻り値や引数、継承関係などが全てわかるようにJavadocコメントを書いていく必要があります。

開発現場によって書き方のルールが異なることがありますが、原則、すべてのクラスとメソッド(フィールドについては通常のコメントで記載する場合もある)に記述する必要があります。

では、Javadocコメントを記述することでどのようなメリットがあるのかを見ていきます。
以下のように、利用するクラスでメソッド名にカーソルをあてて、「F2」キーを押してみてください。


(kari)1

StudentNameクラスの、setNameメソッドのJavadocコメントをこのように利用するクラスで参照することができます。
大規模なソフトウェアを開発する場合、多人数でコードを共有したり、修正していくことがよくあります。
他の人が見てもわかりやすいコーディングを行っていくことは、メンテナンス性の向上や、バグの防止、開発効率の向上に必要不可欠です。
Javadocコメントについては、今後意識してコーディングを行っていくようにしましょう。
なお、この教材で紹介するプログラムについては、教材の見やすさのためにJavadocコメントについては省略しています。

Information

Javadoc

Javadocとは、Javadocコメントが記述されたソースコードから、APIドキュメントのHTMLページを生成するソフトウェアのことです。Javadocの細かな仕様については、こちらをご参照ください。

StudentNameクラスをJavadocでAPIドキュメントにすると、以下のように作成することができます。


javadoc6

4.ラッパークラス

よく使うクラスとして、最初にラッパークラスを学習します。

Javaには、基本データ型と参照型がありましたが、実際のJavaプログラムでは99%が参照型であり、基本データ型は特殊な型です。
そのため、あるデータ(値)を基本データ型のままで扱うと、プログラムの中で利用しにくいことがあり、基本データ型でなく、参照型から生成されたオブジェクトとして扱いたいことがあります。

そんなときに使用するのが、ラッパークラスです。ラッパークラスは、基本データ型を参照型に変換する機能を持っており、基本データ型であるデータ(値)を参照型のオブジェクトに変換することができます。
参照型に変換することにより、例えば、そのデータ(値)を、メソッドで16進数に変換したり、一部の文字列を抜き出したり、文字列変換を行ったりすることができます。
ラッパークラスは、java.langパッケージに属し、8種類の基本データ型に対応しています。

以下の各ラッパークラスが用意されています。

ラッパークラス名 対応基本データ型
Byte byte
Short short
Integer int
Long long
Float float
Double double
Character char
Boolean boolean

それでは、これらのラッパークラスのうち、Integerクラスについて、学習しましょう。
その他のラッパークラスも同様な機能を持っていますので、Javadocを確認してみると良いでしょう。

4.1.Integerクラス

基本データ型を代表して、int型のラッパークラスである、Integerクラスを説明します。

4.1.1.Integerクラスのオブジェクトに変換

Integerクラスにはint型の変数を扱う便利なメソッドが用意されています。
Integerクラスの機能を利用したいときは、int型の変数や値をIntegerクラスに変換する必要があります。
int型の変数や値をIntegerクラスのオブジェクトに変換するには、クラスメソッドvalueOfメソッドを使用して以下のように記述します。

Integer オブジェクト名 = Integer.valueOf(変換したいint型の変数または値);

プログラムで書くと以下のようになります。int型の3をIntegerクラスのオブジェクトmyIに変換しています。

// int型の3をIntegerクラスのオブジェクトmyIに変換
Integer myI = Integer.valueOf(3); // int型の3をもつIntegerインスタンスを生成
System.out.println(myI); // 3が表示されます

valueOfメソッドには、valueOf(10)のようにint型の引数を持つものと、valueOf(“10”)のようにString型を持つものがあります。
引数にString型を持つメソッドの場合、Integer型に変換できない数字でない文字列を渡すと、NumberFormatException例外というエラーが発生します。(例外については、後述します。)

// int型またはString型の10をIntegerクラスのオブジェクトmyIに変換
Integer myI = Integer.valueOf(10); // int型10をもつIntegerインスタンス生成
Integer myI = Integer.valueOf("10"); // String型10をもつIntegerインスタンス生成

// String型の"あ"をIntegerクラスのオブジェクトmyIに変換するとエラー発生
Integer myI = Integer.valueOf("あ"); // NumberFormatException 例外発生
4.1.2.Integerクラスのメソッド

Integerクラスには、valueOfメソッドの他にも多くのメソッドがあります。インスタンスメソッドとクラスメソッドの両方があり、それぞれ使い方は違ってきます。

Integerクラスの主要なクラスメソッドについて、いくつか見てみましょう。
クラスメソッドは、インスタンス化する必要がないメソッドですので、「Integer.」にメソッド名を記述し、変換したい数値を引数を引き渡します。valueOfメソッドもその一つです。

10進数の数値を2進数に変換することができるクラスメソッドtoBinaryStringメソッドを紹介します。
以下がサンプルソースです。10進数の数値3を2進数表記の11に変換しています。
実行すると、コンソールには3の2進法表記である「11」が表示されます。

// 10進数の数値3を2進数に変換
System.out.println(Integer.toBinaryString(3)); // 3の2進数法表記である11を表示

その他のIntegerクラスの主要なクラスメソッドを利用したサンプルソースです。詳細はJavadocを参照しながら学習してみてください。

MyInteger1.java
// Integerクラスのクラスメソッド
public class MyInteger1 {
	public static void main(String[] args) {
		// 文字列(数字)をintに変換
		// 文字列20をint型に変換
		System.out.println(Integer.parseInt("20"));

		// 16進数表記の1Eをint型(10進数)の30に変換
		System.out.println(Integer.parseInt("1E", 16));

		// 文字列(数字)をIntegerに変換(基数は数字で指定)
		// 文字列64(16進数表記)を10進数表記100に変換し、Integerクラスのオブジェクトに変換
		System.out.println(Integer.valueOf("64",16));
	}
}
図1 上記のプログラムを実行した場合の出力
20
30
100

次に、Integerクラスの主要なインスタンスメソッドについて、いくつか見てみましょう。
以下にIntegerクラスのインスタンスメソッドを利用したサンプルソースを紹介します。
詳細は、Javadocを参照しながら、学習してみてください。

MyInteger2.java
// Integerクラスのインスタンスメソッド
public class MyInteger2 {
	public static void main(String[] args) {
		// Integerクラスのインスタンスを生成
		// int型100の値を持つIntegerクラスのオブジェクトmyI1を生成
		Integer myI1 = Integer.valueOf(100);

		// int型100の値を持つIntegerクラスのオブジェクトmyI2を生成
		Integer myI2 = Integer.valueOf(100);

		// 各データ型への変換
		int i = myI1.intValue(); // myI1の値をint型に変換
		long l = myI1.longValue(); // myI1の値をlong型に変換
		float f = myI1.floatValue(); // myI1の値をfloat型に変換
		double d = myI1.doubleValue(); // myI1の値をdouble型に変換
		String st = myI1.toString(); // myI1の値をString型に変換
	}
}

Integerクラスの使い方、調べ方は習得できたでしょうか。その他のラッパークラスもJavadocで確認しておくようにしましょう。

5.Stringクラス

ラッパークラスの次にStringクラスを学習します。

5.1.Stringクラスのインスタンス化

Stringクラスは、文字列を扱うクラスで、ラッパークラスと同様にjava.langパッケージに属します。

Stringクラスは頻繁に利用するため、例外的に許される文法や決まりがいくつかあります。
これまでの学習で、文字列は「””(ダブルクォーテーション)」で囲んで表現していましたが、これらの文字列は全てStringクラスのオブジェクトとして扱われています。
通常、クラスのオブジェクトはインスタンス化をして生成しますが、Stringクラスの場合、文字列を「””(ダブルクォーテーション)」で囲んで代入することで、インスタンス化することができます。

以下が、「あいうえお」という文字列を引数にコンストラクタを使用して、オブジェクトを生成するサンプルソースです。

// インスタンス化により、オブジェクト生成
String str = new String("あいうえお");

しかし、Stringクラスの場合、上記のようにインスタンス化を明示しなくても、これまでのサンプルソースで記述してきたように、文字列を代入することでオブジェクトを生成できます。

// 文字列"あいうえお"を代入することにより、オブジェクト生成
String str = "あいうえお";

つまり、Stringクラスのオブジェクトを生成するときに、「new String()」の記述が省略できるということです。

5.2.Stringクラスのクラスメソッド

Stringクラスには、以下のようなクラスメソッドがあります。主に他の型からStringへの変換に使われます。
以下がサンプルソースです。int型やlong型、float型、double型の値をString型に変換しています。

MyString1.java
// Stringクラスのクラスメソッド
public class MyString1 {
	public static void main(String[] args) {
		// 各型の文字列表現を持つ String 型インスタンスを生成
		int i = 100;
		System.out.println(String.valueOf(i)); // int型をString型に変換
		long l = 2147483648L;
		System.out.println(String.valueOf(l)); // long型をString型に変換
		float f = 3.14F;
		System.out.println(String.valueOf(f)); // float型をString型に変換
		double d = 3.14;
		System.out.println(String.valueOf(d)); // double型をString型に変換
	}
}
上記のプログラムを実行した場合の出力
100
2147483648
3.14
3.14

Stringクラスには、他にもいくつかクラスメソッドがありますので、Javadocで確認しておきましょう。

5.3.Stringクラスのインスタンスメソッド

Stringクラスには、色々なインスタンスメソッドがあります。
文字列を比較したり、文字列から一部の文字列を抜き出したり、文字列を分割したりなど、様々な処理ができます。

以下がよく使うインスタンスメソッドです。

メソッド名 説明
charAt 指定した位置にある文字を取得します
compareTo 辞書の表示順で文字列を比較します
equals 文字列の比較をします
indexOf 文字列を検索して指定した文字が最初に出現する位置番号を取得します
lastIndexOf 文字列を検索して指定した文字が最後に出現する位置番号を取得します
split 区切り文字列を指定して文字列を分割します

以下がサンプルソースです。「ABCDEF」という文字列を持つStringクラスのオブジェクトmySを使用して、文字の抜き出しと比較を行っています。
その後、「AABBCCDDEEFF」という文字列をmySに代入しなおして、CやCDなどが現れる位置がmySの文字列の左から数えて何番目かをindexOfメソッドやlastIndexOfメソッドを使用して、調べています。
なお、文字列は左から数え、一番左の文字を0番目としてカウントします。
該当の文字列が見つからない場合は、-1を返します。
最後に、「りんご,もも,みかん,なし,すいか,いちご」という文字列をmySに代入しなおして、「,」区切りで文字列を分割しています。

MyString2.java
// Stringクラスのよく使うインスタンスメソッド
public class MyString2 {
	public static void main(String[] args) {
		// StringクラスのオブジェクトmySに「ABCDEF」を代入
		String myS = "ABCDEF";

		// 1.2文字目(B)を取り出します
		System.out.println("1の結果:" + myS.charAt(1));

		// 2.mySを "ABCDEG" と辞書式(abcやあいうえお順)に比較し、数値を返します
		System.out.println("2の結果:" + myS.compareTo("ABCDEG"));

		// 3."ABCDEG" をmySと辞書式(abcやあいうえお順)に比較し、数値を返します
		System.out.println("3の結果:" + "ABCDEG".compareTo(myS));

		// 4.mySを "abcdef" と比較、booleanで返します
		System.out.println("4の結果:" + myS.equals("abcdef"));
		System.out.println("4の結果:" + !myS.equals("abcdef"));

		// 改行
		System.out.println("");

		// mySに「AABBCCDDEEFF」を代入
		myS = "AABBCCDDEEFF";

		// 5.文頭から調べて最初に "C"が現れる位置番号を返します
		System.out.println("5の結果:" + myS.indexOf("C"));

		// 6.5番目から調べて最初に "C"が現れる位置番号を返します
		System.out.println("6の結果:" + myS.indexOf("C", 5));

		// 7.文頭から調べて最初に "CD"が現れる位置番号を返します
		System.out.println("7の結果:" + myS.indexOf("CD"));

		// 8.6番目から調べて最初に"CD"が現れる位置番号を返します
		System.out.println("8の結果:" + myS.indexOf("CD", 6));

		// 9.文末から調べて最初に "C"が現れる位置番号を返します
		System.out.println("9の結果:" + myS.lastIndexOf("C"));

		// 10.4番目から文頭に向かって調べて最初に "C"が現れる位置番号を返します
		System.out.println("10の結果:" + myS.lastIndexOf("C", 4));

		// 11.文末から調べて最初に "CD"が現れる位置番号を返します
		System.out.println("11の結果:" + myS.lastIndexOf("CD"));

		// 12.6番目から文頭に向かって調べて最初に"CD"が現れる位置番号を返します
		System.out.println("12の結果:" + myS.lastIndexOf("CD", 6));

		// 改行
		System.out.println("");

		// mySに「りんご,もも,みかん,なし,すいか,いちご」を代入
		myS = "りんご,もも,みかん,なし,すいか,いちご";

		// 13.mySの文字列を「,」を区切り文字として分割
		String[] splMyS = myS.split(",");

		System.out.println("13の結果:");

		for (String str : splMyS) {
				System.out.println(str);
		}
	}
}
上記のプログラムを実行した場合の出力
1の結果:B
2の結果:-1
3の結果:1
4の結果:false
4の結果:true

5の結果:4
6の結果:5
7の結果:5
8の結果:-1
9の結果:5
10の結果:4
11の結果:5
12の結果:5

13の結果:
りんご
もも
みかん
なし
すいか
いちご
5.3.1.equalsメソッド

プログラムの処理の中で、文字列の比較はよく行う処理の一つです。
文字列の比較には、Stringクラスのインスタンスメソッドのequalsメソッドを使用します。

まずは、以下のサンプルソースを確認してみてください。
2つの「あいうえお」という文字列を比較しています。
当然同じ値を比較しているので、比較結果は、trueとなり、if文の処理が実行されます。

if ("あいうえお" == "あいうえお") {
	// 比較結果がtrueのため実行されます
}

一見当たり前のようですが、上記の比較は、基本データ型の比較のようにデータ(値)そのものを比較しているわけでなく、インスタンスの参照元を比較しています。
違いを理解するため、以下のサンプルソースで確認しましょう。
2つのStringクラスのオブジェクトaとbは、同じ値”あいうえお”を持っていますが、別のオブジェクトであるため、参照元が異なります。
そのため、if文の比較結果は、falseとなり、if文の処理は、実行されません。

String a = new String("あいうえお");
String b = new String("あいうえお");
if (a == b) {
	// 比較結果がfalseのため実行されません
}

このように、文字列同士を比較する場合に「==」演算子を利用すると、思わぬ結果が返ってくることがあるため、基本的に利用しません。
そのため、文字列の比較にはStringクラスのequalsメソッドを使います。
equalsメソッドを使用すると、オブジェクトの参照元ではなく、データ(値)を比較することができます。

String a = new String("あいうえお");
String b = new String("あいうえお");
// true
if (a.equals(b)) {
	// 比較結果がtrueのため実行されます
}

また、「!」(エクスクラメーションマーク)をつけることで、比較結果を逆にすることができます。

String a = new String("あいうえお");
String b = new String("あいうえお");
if (!a.equals(b)) {
	// 比較結果がfalseのため実行されません
}

Stringクラスのequalsメソッドは、よく使いますので、忘れないようにしましょう。
また、「!」(エクスクラメーションマーク)はequalsメソッドだけでなく、
他の比較結果(つまりboolean型)を返却するメソッドにも利用できますので、こちらも覚えておきましょう。

5.3.2.splitメソッド

splitメソッドを使うと、文字列を特定の区切り文字で分割することができます。
例えば、「,(カンマ)」でいくつかの要素に区切られた文字列を読み込んで、「,」を目安に要素ごとにを文字列を分割することができます。
分割した値は、String型の配列となります。

以下のような書式となります。

String[] strs = 分割対象文字列.split(区切り文字列);

区切り文字列部分には、「,」や「A」などの一つの文字だけでなく、「ABC」などの文字列も指定できます。
区切り文字列に指定する引数は、正確には「正規表現」を指定するのですが、少し難易度が高いので、詳しい説明は割愛します。
ひとまずは、区切りたい文字を指定すると文字が分割され、String型の配列で戻ってくるとだけ覚えておけば良いでしょう。

なお、古いバージョンのJDKを使う場合、splitメソッドは使えない可能性があります。
使えない場合は、「StringTokenizer」というクラスで同じような操作が行えるため、Javadocで調べてみてください。

5.3.3.その他のインスタンスメソッド

その他のよく使うインスタンスメソッドを紹介します。

メソッド名 説明
length 文字列の長さを取得するために使います
replace 文字を置換します
startsWith 引数で渡した文字で始まるかをbooleanで返します
substring 部分文字列を抽出します
trim 前後の空白文字を削除します

以下がサンプルソースです。

MyString3.java
// Stringクラスのその他のよく使うインスタンスメソッド
public class MyString3 {
	public static void main(String[] args) {
		String myS = new String("ABCDEF");

		// 1.文字列の長さを取得します
		System.out.println("1の結果:" + myS.length());

		// 2.Bをbで置き換えます
		System.out.println("2の結果:" + myS.replace("B", "b"));

		// 3.ABで始まるかどうかをbooleanで返します
		System.out.println("3の結果:" + myS.startsWith("AB"));

		// 4.2番目を基点にBCで始まるかどうかをbooleanで返します
		System.out.println("4の結果:" + myS.startsWith("BC", 1));

		// 5.3番目から最後までの文字列を切り出します
		System.out.println("5の結果:" + myS.substring(2));

		// 6.3番目と4番目の文字列を切り出します
		System.out.println("6の結果:" + myS.substring(2, 4));

		myS = new String(" ABC DEF ");
		// 7.文字列の両端からスペースを削除します
		System.out.println("7の結果:" + myS.trim());
	}
}
上記のプログラムを実行した場合の出力
1の結果:6
2の結果CDEF
3の結果:true
4の結果:true
5の結果:CDEF
6の結果:CD
7の結果:ABC DEF

Stringクラスのインスタンスメソッドの使い方は、理解できたでしょうか。
一度に覚えるのは大変ですので、少しずつ使いながら覚えていくと良いでしょう。

5.4.Stringクラスの加算演算子

最後にStringクラスの加算演算子について、説明します。
Stringクラス(文字列)に対して、加算演算子「+(プラス)」を使用すると、文字列の連結ができます。

以下がサンプルソースです。

String str = "あさ" + "から";
System.out.println(str);
str += "げんきです";
System.out.println(str);

また、他の型と文字列を加算演算子でつなげると、結果をString型にする性質があります。
以下がサンプルソースです。
空文字の「””」とint型の数値を加算すると、文字列の連結となります。

// 1は、文字列となります
System.out.println("" + 1);

// 34と1が文字列となり、文字列の連結で341と表示されます
System.out.println(34 + "" + 1);

適切に利用すれば非常に有効な機能ですが、理解が浅いとプログラムバグ(エラー)の原因になりますので、注意して使いましょう。

6.LocalDateTimeクラス

Javaには、日時を扱うクラスとして、LocalDateTimeクラスやZonedDateTimeクラス、OffsetDateTimeクラスなどがあります。
また、フォーマッターとしてDateTimeFormatterクラスがあります。
ここでは、LocalDateTimeクラスとDateTimeFormatterクラスの使い方を学習します。

LocalDateTimeクラスは、年、月、日、時、分、秒(ナノ秒)、曜日を扱いながら、現在日時や曜日の他、指定した日の曜日を取得することなどができます。
このLocalDateTimeクラスはjava.timeパッケージに属します。
パッケージに属しているクラスを使用するときには、インポートと呼ばれる処理を行う必要があります。
そのため、LocalDateTimeクラスを使用するには、以下のインポート文をクラスの宣言部の上に記述します。

import java.time.LocalDateTime;

LocalDateTimeクラスを使用するときは、LocalDateTimeクラスのクラスメソッドである「nowメソッド(現在日時)」か「ofメソッド(日時を指定)」で、インスタンス化する必要があります。
「new」を用いたインスタンス化はできませんので、注意してください。

以下がサンプルソースです。現在日時、曜日、時間と分、秒を取得して、コンソールに表示しています。

MyLocalDateTime1.java
// LocalDateTimeクラスで現在日時、曜日、時間、分、秒を取得
import java.time.LocalDateTime;
import java.time.format.TextStyle;
import java.util.Locale;

public class MyLocalDateTime1 {
	public static void main(String[] args) {
		// LocalDateTimeクラスを現在日時でインスタンス化
		LocalDateTime ldt = LocalDateTime.now();

		int year = ldt.getYear(); // 現在年を取得
		int month = ldt.getMonthValue(); // 現在月を取得
		int day = ldt.getDayOfMonth(); // 現在日を取得

		// 現在年月日を表示
		System.out.println(year + "年" + month + "月" + day + "日");

		// 現在曜日を取得
		String week = ldt.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.JAPAN);

		// 現在曜日を表示
		System.out.println(week);

		int hour = ldt.getHour(); // 現在時間を取得
		int min = ldt.getMinute(); // 現在分を取得
		int sec = ldt.getSecond(); // 現在秒を取得

		// 現在時間、分、秒を表示
		System.out.println(hour + "時" + min + "分" + sec + "秒");
	}
}
上記のプログラムを実行した場合の出力(結果は実行時の状況により変動します)
2018年12月7日
金曜日
20時2分9秒

現在曜日を取得する時には、以下のように記述します。

// 現在曜日を取得
String week = ldt.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.JAPAN);

getDisplayNameメソッドの引数には、第一引数に表示するテキストのサイズ、第二引数に地域を設定します。
上記のプログラムでは、TextStyle.FULLでフルテキストを指定し、Locale.JAPANで地域に日本を指定することで、『●曜日』と表示させています。
なお、TextStyleには別のテキストサイズが、Localeには別の地域の設定が可能ですので、必要に応じてAPIドキュメントを確認し、利用してみましょう。

また、DateTimeFormatterクラスを用いれば、より簡潔に書くことができます。
以下のサンプルソースでは、日時を指定した後に各情報を表示しています。

MyLocalDateTime2.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class MyLocalDateTime2 {

	public static void main(String[] args) {
		// LocalDateTimeクラスを2018年12月18日 15時27分54秒インスタンス化
		LocalDateTime ldt = LocalDateTime.of(2018, 12, 18, 15, 27, 54);

		// 年月日を表示
		DateTimeFormatter dtfDate = DateTimeFormatter.ofPattern("uuuu年MM月dd日");
		System.out.println(dtfDate.format(ldt));

		// 曜日を表示
		DateTimeFormatter dtfWeek = DateTimeFormatter.ofPattern("EEEE", Locale.JAPAN);
		System.out.println(dtfWeek.format(ldt));

		// 時間、分、秒を表示
		DateTimeFormatter dtfTime = DateTimeFormatter.ofPattern("HH時mm分ss秒");
		System.out.println(dtfTime.format(ldt));
	}
}

DateTimeFormatterクラスやLocaleクラスもインポートする必要があるため、クラスの宣言部の上にインポート文を記述しましょう。

また、曜日を表示するために、DateTimeFormatter.ofPatternメソッドに指定している「”EEEE”」は、下記のように”E”を一つのみ指定することで、『曜日』の文字を無くした、短い曜日表示が可能となりますので、確認してみましょう。

DateTimeFormatter dtfWeek = DateTimeFormatter.ofPattern("E", Locale.JAPAN);

6.1.LocalDateTimeクラスのインスタンスメソッド

よく使うインスタンスメソッドを紹介します。

メソッド名 説明
getXXXメソッド 指定した日時の値を返します
withXXXメソッド 指定した日時を設定します
plusXXXメソッド 指定した日時を加算します

以下がサンプルソースです。

MyLocalDateTime3.java
import java.time.LocalDate;
import java.time.LocalDateTime;

public class MyLocalDateTime3 {
	public static void main(String[] args) {

		LocalDateTime ldt = LocalDateTime.now();
		// 年を設定
		ldt = ldt.withYear(2020);
		int year = ldt.getYear();

		// 設定した年を表示
		System.out.println(year + "年");

		// 年月日を設定
		ldt = ldt.with(LocalDate.of(2024, 12, 30));

		year = ldt.getYear();
		int month = ldt.getMonthValue();
		int day = ldt.getDayOfMonth();
		System.out.println(year + "年" + month + "月" + day + "日");

		// 日を加算
		ldt = ldt.plusDays(4);

		year = ldt.getYear();
		month = ldt.getMonthValue();
		day = ldt.getDayOfMonth();
		System.out.println(year + "年" + month + "月" + day + "日");
	}
}
上記のプログラムを実行した場合の出力
2020年
2024年12月30日
2025年1月3日

上記サンプルソースでは、以下の部分でLocalDateクラスを用いています。

ldt = ldt.with(LocalDate.of(2024, 12, 30));

こちらは時刻を持たない日付のみを保持するクラスで、インスタンス化をはじめ、基本的な使い方はLocalDateTimeクラスと同じです。
なお、日付を持たず時刻のみを保持するLocalTimeクラスもあります。必要に応じて使い分けましょう。

また、withXXXメソッドやplusXXXメソッドは、計算した後のインスタンスを返すので、変数へ代入するのを忘れないようにしましょう。

Information

Java7以前に使用されていた日時を扱うクラス

本章では、Java8から導入された日時を扱うクラスを紹介しましたが、Java7以前は、本章の記載はできません。
そのため、java.util.Dateクラスとjava.util.Calendarクラス、それとjava.text.SimpleDateFormatクラスを使用していました。

Java7以前のクラスを用いた例
// 今の日時をCalnedarクラスを使用して表示する
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH時mm分");
System.out.println(sdf.format(cal.getTime()));

// 今の日時をDateクラスを使用して表示する
Date date = new Date();
System.out.println(sdf.format(date));
上記のプログラムを実行した場合の出力
2018年12月07日20時02分
2018年12月07日20時02分

7.練習問題1

それでは、IntegerクラスとStringクラスの問題を解いてみましょう。

7.1.問題1

以下のソースのコメントに従い、各問題に沿ったコードをプログラムソースの「/*ここに追加*/」の部分に追加し、実行結果と同様に出力されるようにプログラムを完成させてください。

InteStrMondai1.java
public class InteStrMondai1 {
	public static void main(String[] args) {
		// 問題1 int型の250を内部に持つIntegerクラスのオブジェクトを生成し、
		// Integer型の参照変数tempIに代入しましょう。
		Integer tempI = /* ここに追加 */;
		System.out.println("問題1:" + tempI);

		// 問題2 IntegerクラスのparseIntメソッドを使用して、
		// String型の"20"をint型に変換しましょう。
		int i = /* ここに追加 */ ;
		System.out.println("問題2:" + i);

		// 問題3 IntegerクラスのparseIntメソッドを使用して、
		// 16進数表記のFFをint型(10進数)に変換しましょう。
		int j = /* ここに追加 */ ;
		System.out.println("問題3:" + j);

		// 問題4 StringクラスのvalueOfメソッドを使用して、
		// int型の250をString型に変換しましょう。
		int k = 250;
		String tempS = /* ここに追加 */;
		System.out.println("問題4:" + tempS);

		// 問題5 Stringクラスのequalsメソッドを使用して、
		// 2つの文字列がイコールか否かを判定しましょう。
		String tempS1 = "おはよう";
		String tempS2 = "おはよう";
		if (/* ここに追加 */) {
			System.out.println("問題5:同じです。");

		} else {
			System.out.println("問題5:違います。");
		}

		tempS2 = "こんにちは";
		if (/* ここに追加 */) {
			System.out.println("問題5:違います。");

		} else {
			System.out.println("問題5:同じです。");
		}

		// 問題6 StringクラスのindexOfメソッドを使用して、
		// 文字列の中に「@」が含まれているか判定しましょう。
		String mail = "test@test.co.jp";
		if (/* ここに追加 */) {
			System.out.println("問題6:@があります。");

		} else {
			System.out.println("問題6:@がありません。");
		}

		mail = "testtest.co.jp";
		if (/* ここに追加 */) {
			System.out.println("問題6:@があります。");

		} else {
			System.out.println("問題6:@がありません。");
		}

		// 問題7 Stringクラスのsubstringメソッドを使用して、
		// 文字列から月の値を抜き出しましょう。
		String theDate = "2010-06-11";
		String month = /* ここに追加 */ ;
		System.out.println("問題7:" + month + "月");

		// 問題8 Stringクラスのsplitメソッドを使用して、
		// 「aa」を区切り文字として分割しましょう。
		String animal = "わんaaにゃーaaこけこっこーaaブヒaaモーaヒヒーン";
		String[] splAnimal = /* ここに追加 */ ;

		System.out.println("問題8:");

		for (String str : splAnimal) {
			System.out.println(str);
		}
	}
}
実行結果
問題1:250
問題2:20
問題3:255
問題4:250
問題5:同じです。
問題5:違います。
問題6:@があります。
問題6:@がありません。
問題7:06月
問題8:
わん
にゃー
こけこっこー
ブヒ
モーaヒヒーン

※この問題の解答は掲載しておりません。Tech Fun ITスクールのJava研修では、講師が丁寧に解説しています。

8.練習問題2

LocalDateTimeクラスの練習問題です。

8.1.問題1

LocalDateTimeクラスを使用して、1999年12月31日の日時を取得し、「1999年12月31日は、金曜日です。」とコンソールに表示してください。

LocalDateTimeMondai1.java
import java.time.LocalDateTime;
import java.time.format.TextStyle;
import java.util.Locale;

public class LocalDateTimeMondai1 {

	public static void main(String[] args) {
		// LocalDateTimeクラスを1999年12月31日でインスタンス化
		LocalDateTime ldt = LocalDateTime.of(1999, 12, 31, 23, 59, 59);

		// 年、月、日を取得
		int year = ldt.getYear();
		int month = ldt.getMonthValue();
		int day = ldt.getDayOfMonth();

		// 曜日を取得
		String week = ldt.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.JAPAN);

		// 結果をコンソールに表示
		System.out.println(year + "年" + month + "月" + day + "日は、" + week + "です。");

	}

}

最初に、LocalDateTimeをofメソッドを使って日時を指定したうえでインスタンス化しています。
なお、時分秒の部分は、今回の問題では不要ですので、任意の値で問題ありません。

LocalDateTimeのオブジェクトから、各メソッドを使って年月日、曜日を取得し、最後にその値を組み合わせて表示します。

8.2.問題2

LocalDateTimeクラスとDateTimeFormatterクラスを使用して、5年後の今日の日付を取得し、「5年後の今日は、xxxx年xx月xx日です。」とコンソールに表示してください。

※この問題の解答は掲載しておりません。Tech Fun ITスクールのJava研修では、講師が丁寧に解説しています。

9.本章のまとめ

  • Javaには標準で用意されたクラスが多くあり、その情報をまとめたものが「 APIドキュメント」である。
  • 「JavaDocコメント」とは、クラスやメソッドについての説明や、メソッドの戻り値などの定義を記載したものである。
  • 「ラッパークラス」は、基本データ型を参照型に変換することができる。
  • Stringクラスでよく使われるメソッドには「equals」や「split」、「substring」などのインスタンスメソッドがある。
  • 日時を扱うクラスとして「LocalDateTimeクラス」があり、「DateTimeFormatterクラス」を用いれば表示方法を細かく設定することができる。

本章で出てきたクラスやメソッドは、以降の章だけではなく、実務でも利用する機会が多くあります。
何回も使って、教材を見なくても書けるようになるとよいでしょう。

よく使うクラスについての説明は、以上です。

執筆・編集

Tech Fun Magazine編集部
Tech Funの現役のITエンジニアが、システム開発の基礎知識や実践的なノウハウを執筆・編集しています。
Tech Fun ITスクールの研修講師として活躍するメンバーもおり、プログラミング初心者がつまづきやすいポイントを丁寧に解説しています。

ARTICLE
記事一覧

Java基礎

Java12からJava17までに導入された機能の紹介

システム開発の基本

プログラミングとテストの要点

データベース環境構築

データベース環境構築(Windows版) テストデータ作成

データベース環境構築

データベース環境構築(Windows版) MariaDBの設定

データベース環境構築

データベース環境構築(Mac版) テストデータ作成

データベース環境構築

データベース環境構築(Mac版) MariaDBの設定

Java基礎

はじめてのJava

Java基礎

Javaのデバッグ方法

Java基礎

ポリモフィズム

記事一覧を見る