つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

Java初級者のための必須Java標準APIまとめと簡易解説

   

プログラマにとって、ライブラリはとても重要なツールです。ライブラリを利用することは、様々な恩恵をもたらします。開発の効率化、車輪の再発明防止、可読性向上(イディオムとしての効果)などなど。

この記事ではJava初級者が知っておくべき、優先度の高いAPIをまとめます。

前提

  • Java7を対象とします。
  • intやIntegerなど基本的な型を理解しておりforやifを利用した簡単なプログラムが作れる読者を対象とします。
  • awt, swingパッケージは除外します。
    個人的な意見ですが、それらを利用したGUIアプリはそれほど多くないためです。
  • appletパッケージは除外します。
    同上。
  • <E>のようになっている部分は型パラメータ、Genericsというものです。サンプルコードでは<String>などど記述しますが、場合によって変える必要があります。詳細は”Java Generics”で検索してください。

インタフェース

  • java.util.List<E>
    代表的なメソッド:add(E e), get(int index), size()
  • java.util.Map<K, V>
    代表的なメソッド:put(K key, V value), containsKey(Object key)
  • java.util.Set<E>
    代表的なメソッド:add(E e), remove(Object o), size()

非常に重要なインタフェースです。まずは何も考えずに呪文のように以下の構文を覚えると良いと思います。

List<String> list = new ArrayList<String>();

なぜ左辺にArrayListではなく、Listを使うのかと言うと、拡張性や可読性のためです。詳しくは他の文献を参照してください。左辺にArrayListと書いても大きな問題にはなりませんが、Listと書くことで、この文脈ではListの操作ができれば十分であるということがソースから分かるため、できればListと書いておいた方が良いと思います。MapやSetも同様です。

  • java.util.Comparator<T>
    代表的なメソッド:compare(T o1, T o2)
  • java.lang.Comparable<T>
    代表的なメソッド:compareTo(T o)

オブジェクトのコレクションで全体順序付けを行う比較関数が定義されたインタフェースです。プログラム内で独自のデータ構造(Java Bean, DTO, VO, Entity, etc)を利用していて、そのデータ構造のオブジェクトを比較したりソートしたりする場合に必要なインタフェースです。

  • java.lang.Runnable
    代表的なメソッド:run()

マルチスレッドプログラミングを行うときに利用します。

  • java.lang.Math
    代表的なメソッド:abs(int a), max(int a, int b), sin(double a)

算術演算のためのクラスです。円の面積や平方根を求めるとき、その他簡単な数値操作に利用します。

  • java.lang.Object
    代表的なメソッド:equals(Object obj), toString()

全てのクラスの継承元となるクラスです。つまり全てのクラスで上記のメソッドが利用できます。ただし、独自にクラスを作成したときは自分でtoStringをOverrideしないと使い物になりません。

  • java.io.Serializable
    代表的なメソッド:なし

クラスが直列化可能であることを示すマークアップ用インタフェースです。 オブジェクトの永続化を行うときにも使用します。利用するフレームワークがSerializableなクラスを求めていたり、オブジェクトをファイルなどに出力して保存したくなったとき、このインタフェースが必要になります。

クラス

  • java.util.ArrayList<E>
    代表的なメソッド:add(E e), get(int index), size()
  • java.util.HashMap<K, V>
    代表的なメソッド:put(K key, V value), containsKey(Object key)
  • java.util.HashSet<E>
    代表的なメソッド:add(E e), remove(Object o), size()

上記で挙げたインタフェースの実装クラスです。

  • java.util.Collections
    代表的なメソッド:fill(List<? super T> list, T obj), reverse(List<?> list), sort(List<T> list)

Collectionを操作するためのクラスです。sortは良く使うと思います。

  • java.util.Arrays
    代表的なメソッド:asList(T… a), sort(Object[] a), fill(Object[] a, Object val)

Javaの配列を操作するためのクラスです。Javaでは配列よりもCollectionを利用する傾向にあるため、それほど出番は多くないと思います。ただし、asListはListを返すため、割と利用されると思います。固定値のリストを作成するシーンでは活用されると思います。

以下のように記述することで、ArrayListをnewして、addして、addして、addして・・・というような煩雑な記述を避けることができます。

List<String> seasons = Arrays.<String> asList("Spring", "Summer", "Autumn", "Winter");

ただし、上記のasListが返すオブジェクトのクラスはjava.util.Arrays$ArrayListです。java.util.ArrayListではありません。そのため、seasonsにaddしようとするとUnsupportedOperationExceptionが発生します。asListを利用する時は、そのリストが変更されない、ということを確認しておく必要があります。

  • java.util.Date
    代表的なメソッド:getTime(), setTime(long time)
  • java.util.Calendar
    代表的なメソッド:add(int field, int amount), get(int field), getInstance(Locale aLocale), getTime()

Dateは現在では非推奨メソッドだらけなので使わない方が良いです。Calendarを使いましょう。とは言っても、Dateしかサポートしていないフレームワークやライブラリはまだまだ多いので、使わなければならないシーンは多いです。

  • java.util.Properties
    代表的なメソッド:getProperty(String key), load(InputStream inStream)
  • java.util.ResourceBundle
    代表的なメソッド:getString(String key), getBundle(String baseName)

Javaではプログラム外に定義しておきたい値をpropertiesファイルに記述します。上記のクラスはこのpropertiesファイルを読み込み、内部のキーに対応する値を読み込む機能を提供します。

  • java.util.Random
    代表的なメソッド:nextInt(), setSeed(long seed)
  • java.util.SecureRandom
    代表的なメソッド:nextInt(), setSeed(long seed)

ランダムな数値を求めるときに利用するクラスです。2つありますが、どちらを利用するかはプログラムの特性によって決めます。例えば以下のコードを実行すると必ず”-1157793070″が出力されます。これはランダムな値を生成する式がseedにのみ依存しているためです。seedが実行するたび必ず10なので結果も必ず同じです。

Random r = new Random();
r.setSeed(10);
System.out.println(r.nextInt());

上記のRandomがSecureRandomだった場合はseedが同じでも、毎回出力結果は異なります。

seedによって毎回挙動を統一したい場合はRandomを、変えたい場合はSecureRandomを利用します。

  • java.text.SimpleDateFormat
    代表的なメソッド:format(Date date), parse(String source)

文字型の日付を日付型に変換したり、日付型の日付を文字列に変換したりするときに使用します。

  • java.security.MessageDigest
    代表的なメソッド:getInstance(String algorithm), update(byte[] input), digest()

MD5やSHA-256でハッシュ値を求めるときに使用します。

例外クラス

ここでは特に重要で良く見かける例外を記述します。どのようなケースで発生するかをおさえておく必要があります。

  • java.lang.ArrayIndexOutOfBoundsException

配列のindex指定に問題がある場合に発生します。

String[] array = new String[] { "zero", "one", "two" };
System.out.println(array[3]); // 発生
System.out.println(array[-1]); // 発生
  • java.lang.IndexOutOfBoundsException

コレクションのindex指定に問題がある場合に発生します。

List<String> array = new ArrayList<String>();
System.out.println(array.get(0)); // 発生
  • java.lang.ClassCastException

キャストできない型にキャストしたときに発生します。

public class SuperA {
}
public class SubB extends SuperA {
}

SuperA superA = new SuperA();
SubB subB = (SubB) superA; //発生

ダウンキャストはClassCastExceptionの危険性をはらんでいます。

  • java.lang.ClassNotFoundException

クラスが見つからないときに発生します。適当な独自クラスを利用するプログラムをコンパイルした後で、独自クラスを削除し、mainを実行すると再現できます。必須のjarが不足している、プロパティファイルに記述したクラスが間違っておりロードできない、デプロイに失敗して一部の.classが欠けている、というような状況で発生します。

  • java.lang.Exception

全てのExceptionの継承元です。明確な設計の意図がある場合を除いて、catch節でこの例外を受け取ってはいけません。

try {
  hoge.something();
} catch(Exception e){
  //BAD
}

上記のようなコードを書くと、NullPointerExceptionなどのRuntimeExceptionまでキャッチしてしまいます。RuntimeException系のほとんどは、プログラム側ではどうしようもない例外なので、catchせずにそのまま呼び出し元に例外を伝搬し、プログラムを落とす方がよいです。上記のコードはcatchする上に何もしないので、例外を握りつぶしています。揉み消しています。これはバグの解明に苦労します。

Exceptionをcatchせずに、特定の例外のみcatchするようにします。

  • java.lang.IllegalArgumentException

引数に問題があるときに発生します。例外をthrowしたメソッドの仕様を確認してください。

  • java.lang.NoSuchMethodException

利用しようとしたメソッドが存在しない場合に発生します。クラスAはクラスBのメソッドCを利用しているとします。クラスAとクラスBをコンパイルした後で、クラスBだけメソッドCを削除し、クラスBのみコンパイルしたとします。この状態で実行するとクラスAでメソッドCが見つからないため、上記の例外が発生します。

  • java.lang.NullPointerException

最も発生する例外です。利用しようとしたオブジェクトがnullの場合に発生します。

List<String> list = null;
System.out.println(list.size()); //発生

99%の場合、上記のようなnullに対してメソッド呼び出しを行ったときに発生しますが、たまにnewでインスタンスを生成したときにも発生します。

String pathName = null;
File file = new File(pathName);
  • java.lang.NumberFormatException

数値変換できないときに発生します。

String str = "12345A";
int i = Integer.parseInt(str); //発生

以上です。どなたかのお役にたてば、幸いです。これが足りない!などご意見もお待ちしています。

 - Java ,