Java 学 習 教 材 (2) 筑 波 大 学 コンピュータサイエンス 専 攻 三 谷 純 最 終 更 新 日 2013/2/8 (C) 2013 Jun Mitani 図 表 出 典 : 三 谷 純 著 プログラミング 学 習 シリーズ Java ( 翔 泳 社 刊 )
本 資 料 の 位 置 づけ Java 2 アプリケーションづくりの 初 歩 ( 三 谷 純 著 ) 本 資 料 は Java2 アプリケーションづくりの 初 歩 ( 三 谷 純 著 ) を 大 学 企 業 などで 教 科 書 として 採 用 され た 教 員 指 導 員 を 対 象 に 授 業 などで 活 用 していただくことを 前 提 として 作 られてい ます どなたでも 自 由 に 使 用 できます 授 業 の 進 め 方 などに 応 じて 改 変 していただいて 結 構 です 大 型 本 : 296ページ 出 版 社 : 翔 泳 社 (2010/1/29) 言 語 日 本 語 ISBN-10: 4798120995 ISBN-13: 978-4798120997 発 売 日 : 2010/1/29
第 9 章 パッケージとJava API
パッケージとは Javaには クラスライブラリ と 呼 ばれる 便 利 なクラスやインタフェースがあらかじめ 準 備 されている クラスライブラリは 必 要 に 応 じて 自 由 に 使 え る クラスライブラリは 複 数 の パッケージ に 分 類 されている
Javaの 主 なパッケージ
パッケージに 含 まれるクラスの 利 用 java.utilパッケージに 含 まれるRandom クラスのインスタンスを 生 成 する 例 java.util.random rand = new java.util.rondom(); パッケージ 名 クラス 名 (パッケージ 名 ).(クラス 名 )という 表 現 をクラス の 完 全 限 定 名 という
import 宣 言 完 全 限 定 名 を 毎 回 記 述 するのは 大 変 とても 長 い 完 全 限 定 名 の 例 javax.xml.bind.annotation.adapters.xmladapter パッケージ 名 クラス 名 import 宣 言 をすれば プログラムの 中 でパッ ケージ 名 の 記 述 を 省 略 できる import パッケージ 名.クラス 名 ;
import 宣 言 の 使 用 例 import java.util.random; class ImportExample { public static void main(string[] args) { Random rand = new Random(); // 0~1の 間 のランダムな 値 を 出 力 する System.out.println(rand.nextDouble()); java.util.randomのimport 宣 言 をしている
複 数 のクラスのimport 宣 言 複 数 のクラスをimport 宣 言 する 場 合 そ のクラスの 数 だけ 宣 言 する import java.util.arraylist; import java.util.random; import java.util.*; *(アスタリスク) 記 号 を 使 って 省 略 できる java.utilパッケージに 含 まれる 全 てのクラスを import 宣 言 したのと 同 じ
パッケージの 階 層 例 えば 次 の 二 つは 異 なるパッケージ java.utilパッケージ java.util.zipパッケージ import java.util.*; と 記 述 してもjava.util.zipパッケージのク ラスは 使 用 できない 次 のように 記 述 する import java.util.*; import java.util.zip.*;
java.langパッケージ java.langパッケージにはjavaの 基 本 的 な 機 能 を 提 供 するクラスが 含 まれる System.out.println() のSystem クラスもjava.langパッケージに 含 まれ る import java.lang.*; という 記 述 は 省 略 できる
API 仕 様 書 Javaにはあらかじめ3000 以 上 のクラスや インタフェースが 準 備 されている API 仕 様 書 で 使 い 方 を 調 べられる http://docs.oracle.com/javase/jp/6/api/
API 仕 様 書 で 確 認 できるクラス 情 報 Randomクラスは java.utilパッケージ に 含 まれる java.lang.objectク ラスを 継 承 している Serializableインタ フェースを 実 装 している サブクラスに SecureRandomクラスが ある
クラスの 説 明 フィールド コンストラク タ メソッド の 説 明 が 続 く クラスの 説 明
Stringクラス String は java.langパッケージに 含 まれるクラス 次 の2 通 りでインスタンスを 生 成 できる String message = "こんにちは"; String message = new String("こんにちは"); new を 使 わなくてもインスタンスを 作 れる 特 殊 なクラス
Stringオブジェクトの 生 成 方 法 による 違 い String s1 = new String("こんにちは"); String s2 = new String("こんにちは"); System.out.println(s1 == s2); // false 異 なる2つのインスタンスが 生 成 される たまたま 文 字 列 が 同 じだけ
Stringオブジェクトの 生 成 方 法 による 違 い String s1 = "こんにちは"; String s2 = "こんにちは"; System.out.println(s1 == s2); // true 1つのインスタンスを 参 照 する
Stringクラスのメソッド Stringクラスには 文 字 列 を 扱 うための 便 利 なメソッドがある String str = "Javaの 学 習 "; System.out.println(str.length()); // 7 System.out.println(str.indexOf(" 学 習 ")); // 5 System.out.println(str.indexOf("Ruby")); // -1 System.out.println(str.contains(" 学 習 ")); // true System.out.println(str.contains("Ruby")); // false String str2 = str.replace("java", "Java 言 語 ")); System.out.println(str2); // Java 言 語 の 学 習
Stringクラスのメソッド 文 字 列 を 区 切 り 記 号 で 分 割 する 例 String str = "2012/12/31"; String[] items = str.split("/"); for(int i = 0; i < items.length; i++) { System.out.println(items[i]); 実 行 結 果 2012 12 31
Mathクラス java.lang.mathクラスには 数 学 的 な 計 算 を 行 う 便 利 なクラスメソッドが 多 数 ある
Mathクラスの 使 用 java.langパッケージはimport 文 を 省 略 できる クラスメソッドの 使 用 方 法 ( 復 習 ) Math.メソッド 名 ( 引 数 ); class MathExample { public static void main(string[] args) { System.out.println("-5の 絶 対 値 は" + Math.abs(-5)); System.out.println("3.0の 平 方 根 は" + Math.sqrt(3.0)); System.out.println(" 半 径 2の 円 の 面 積 は" + 2*2*Math.PI); System.out.println("sin60 は" + Math.sin(60.0*Math.PI / 180.0));
パッケージの 作 成 パッケージは 自 分 で 作 成 できる package パッケージ 名 ; とプログラムコードの 先 頭 に 記 述 する package mypackage; public class MyClass { public void printmessage() { System.out.println("mypackage.MyClassのprintMessageメソッド"); Eclipseでは[ファイル]-[ 新 規 ]-[パッケージ]でパッケージを 新 規 作 成 その 中 にクラスを 作 成 する
パッケージの 階 層 構 造 とフォルダの 階 層 構 造 jp.co.javacompany.developパッケージ 内 に MyClassクラスがある 場 合 注 :クラスの 継 承 の 階 層 とパッケージ の 階 層 はまったく 関 係 ない
パッケージ 名 の 設 定 パッケージ 名 は 他 人 が 作 ったものと 同 じ ものではいけない( 名 前 の 衝 突 ) ドメイン 名 をパッケージ 名 に 使 用 するこ とが 多 い 並 び 順 は 逆 例 :jp.co.javacompany.develop
クラスのアクセス 制 御 アクセス 修 飾 子 を 使 って パッケージ 外 部 からのアクセスを 制 御 できる クラスとインタフェースの 宣 言 で 使 用 できるアクセス 修 飾 子
メソッドとフィールドのアクセス 修 飾 子 メソッドとフィールドの 宣 言 で 使 用 できるアクセス 修 飾 子
アクセス 修 飾 子 の 優 先 順 位 フィールドやメソッドのアクセス 修 飾 子 がpublicであっても クラスのアクセス 修 飾 子 がpublicでない 場 合 は パッケー ジの 外 からはアクセスできない
複 数 のクラス 宣 言 を 持 つプログラムコード 1つの.javaファイルで 複 数 のクラスを 宣 言 できる public 修 飾 子 をつけられるのは1つだけ public 修 飾 子 をつけたクラス 名 とファイル 名 は 一 致 する 必 要 がある MultiClassExample.java class SimpleClass { String str; SimpleClass(String str) { this.str = str; public class MultiClassExample { public static void main(string[] args) { SimpleClass sc = new SimpleClass("Hello."); System.out.println(sc.str);
第 10 章 例 外 処 理
例 外 の 発 生 プログラムが 動 作 する 時 にトラブルが 発 生 することがある これを 例 外 と 言 う 例 外 が 発 生 する 例 外 が 投 げられ る 例 外 がスロー(throw)される な どと 表 現 する
例 外 が 発 生 する 例 ゼロでの 除 算 int a = 4; int b = 0; System.out.println(a / b);
例 外 が 発 生 する 例 範 囲 を 超 えたインデックスの 参 照 int[] scores = new int[3]; scores[0] = 50; scores[1] = 55; scores[2] = 70; scores[3] = 65;
投 げられた 例 外 をキャッチする 例 外 が 投 げられたとき にも その 例 外 を キャッチして 処 理 を 続 けることができる 仕 組 みがある try~catch 文 を 使 う 例 外 処 理 と 呼 ぶ
try~catch 文 try { tryブロック 本 来 実 行 したい 処 理 だが 例 外 が 投 げられる 可 能 性 がある 処 理 catch( 例 外 の 型 変 数 名 ) { catchブロック 例 外 が 投 げられたときの 処 理 finally { finallyブロック 最 後 に 必 ず 行 う 処 理
処 理 の 流 れ
例 外 処 理 の 例 public class ExceptionExample3 { public static void main(string[] args) { int a = 4; int b = 0; try { int c = a / b; System.out.println("cの 値 は" + c); catch (ArithmeticException e) { System.out.println(" 例 外 をキャッチしました"); System.out.println(e); System.out.println("プログラムを 終 了 します");
finallyの 処 理 public static void main(string[] args) { int a = 4; int b = 0; try { int c = a / b; System.out.println("cの 値 は" + c); catch (ArithmeticException e) { System.out.println(" 例 外 をキャッチしました"); System.out.println(e); return; finally { System.out.println("finallyブロックの 処 理 です"); System.out.println("プログラムを 終 了 します");
catchブロックの 検 索 class SimpleClass { void dosomething() { int array[] = new int[3]; array[10] = 99; // 例 外 が 発 生 する System.out.println("doSomethingメソッドを 終 了 します"); public class ExceptionExample5 { public static void main(string args[]) { SimpleClass obj = new SimpleClass(); try { obj.dosomething(); // 例 外 の 発 生 するメソッドの 呼 び 出 し catch (ArrayIndexOutOfBoundsException e) { System.out.println(" 例 外 をキャッチしました"); e.printstacktrace();
例 外 オブジェクト 例 外 が 発 生 した 時 には java.lang.exceptionクラスの 例 外 オブジェクト が 投 げられる 実 際 は Exceptionクラスのサブクラス 例 外 の 種 類 によって 異 なる ゼロ 除 算 :ArithmeticException 配 列 の 範 囲 を 超 えた 参 照 ArrayIndexOutOfBoundsException
例 外 オブジェクトの 種 類 による 場 合 分 け try { 例 外 が 投 げられる 可 能 性 のある 処 理 catch( 例 外 の 型 1 変 数 名 1) { 例 外 の 型 1の 例 外 が 投 げられたときの 処 理 catch( 例 外 の 型 2 変 数 名 2) { 例 外 の 型 2の 例 外 が 投 げられたときの 処 理 finally { 最 後 に 必 ず 行 う 処 理
例 外 クラスの 階 層 Exceptionオブジェクトが 投 げられる 可 能 性 がある 場 合 は try~catch 文 を 書 かなくてはいけない ただし RuntimeExceptionだけは try~catch 文 が 無 くてもよい
例 外 を 作 成 して 投 げる 例 外 オブジェクトを 自 分 で 作 成 して 投 げ ることができる 例 外 オブジェクトの 作 成 Exception e = new Exception(" という 例 外 が 発 生 しました"); 例 外 オブジェクトを 投 げる throw e; 通 常 はExceptionクラスをそのまま 使 用 せず サブクラスを 作 って 例 外 を 投 げる
メソッドの 外 への 例 外 の 送 出 自 分 で 作 成 した 例 外 オブジェクトを throwした 後 の 処 理 1. try~catch 文 で 囲 んで 処 理 する 2. メソッドの 外 に 投 げる (メソッドの 呼 び 出 し 側 で 処 理 する) 2の 場 合 はメソッドの 宣 言 に throws を 追 加 する 戻 り 値 メソッド 名 ( 引 数 ) throws 例 外 の 型 { 例 外 を 投 げる 可 能 性 のあるメソッドの 内 容
メソッドの 外 への 例 外 の 送 出 の 例 class Person { int age; void setage(int age) throws InvalidAgeException { if(age < 0) { throw new InvalidAgeException("マイナスの 値 が 指 定 された"); this.age = age; public class ExceptionExample7 { public static void main(string[] args) { Person p = new Person(); try { p.setage(-5); catch (InvalidAgeException e) { System.out.println(e);
第 11 章 スレッド
スレッドとは スレッドは 処 理 の 流 れ これまで 見 てきたプログラムは 命 令 が1つ ずつ 処 理 された シングルスレッド Javaでは 複 数 の 処 理 を 同 時 に 行 うことが できる マルチスレッド 例 1.ファイルをダウンロードしながら 画 面 の 表 示 を 更 新 する 例 2.アニメーション 表 示 しながらユーザ のマウス 操 作 を 受 け 付 ける
スレッドの 作 成 通 常 のプログラムは1つのスレッドで 実 行 される 新 しいスレッドを 追 加 できる 2つの 方 法 がある 1.Threadクラスを 継 承 した 新 しいクラス を 作 成 する 2.Runnableインタフェースを 実 装 した 新 しいクラスを 作 成 する
方 法 1.Threadクラスを 拡 張 する class MyThread extends Thread { // Thread クラスのrunメソッドをオーバーライド public void run() { 命 令 文 Threadクラスを 継 承 したクラスを 作 成 する runメソッドをオーバーライドする 命 令 文 に 処 理 を 記 述 する
方 法 1のThreadの 使 用 例 class MyThread extends Thread { public void run() { for(int i = 0; i < 100; i++) { System.out.println("MyThreadのrunメソッド("+i+")"); public class SimpleThreadTest { public static void main(string[] args) { MyThread t = new MyThread(); t.start(); for(int i = 0; i < 100; i++) { System.out.println("SimpleThreadTestのmainメソッド("+i+")");
Threadの 使 用 例 Threadクラスのrunメソッドを 直 接 呼 ば ない startメソッドを 呼 ぶことで 別 スレッ ドの 処 理 が 始 まる 複 数 のスレッドが 並 行 して 処 理 を 進 める
方 法 2.Runnableインタフェースを 実 装 する 方 法 1がいつでも 使 えるとは 限 らない 他 のクラスのサブクラスは Threadクラ スのサブクラスになれない 方 法 2 Runnableインタフェースを 実 装 する Runnableインタフェースに 定 義 されている runメソッドを 追 加 する
方 法 2のThread 使 用 例 class MyThread implements Runnable { public void run() { for(int i = 0; i < 100; i++) { System.out.println("MyThreadのrunメソッド("+i+")"); public class SimpleThreadTest2 { public static void main(string[] args) { MyThread t = new MyThread(); Thread thread = new Thread(t); thread.start(); for(int i = 0; i < 100; i++) { System.out.println("SimpleThreadTest2のmainメソッド("+i+")");
スレッドを 一 定 時 間 停 止 させる Thread.sleep( 停 止 時 間 (ミリ 秒 )); public class SleepExample { public static void main(string[] args) { for(int i = 0; i < 10; i++) { try { Thread.sleep(1000); catch (InterruptedException e) { System.out.println(e); System.out.print("*");
スレッドの 終 了 を 待 つ スレッドAからスレッドBのjoinメソッドを 呼 ぶと ス レッドBの 処 理 が 終 わるまでスレッドAは 次 の 処 理 に 移 らない MyThread t = new MyThread(); t.start(); try{ t.join(); catch (InterruptedException e) { System.out.println(e);
joinメソッドの 呼 び 出 しによる 待 機
スレッドを 止 める スレッドはrunメソッドの 処 理 が 終 了 する と 動 作 が 止 まる whileループの 条 件 を 制 御 してrunメソッ ドを 終 了 させるのが 一 般 的 class MyThread extends Thread { public boolean running = true; public void run() { while(running) { // 命 令 文 System.out.println("runメソッドを 終 了 ");
マルチスレッドで 問 題 が 生 じるケース 複 数 のスレッドが1つの 変 数 に 同 時 にアク セスすると 不 整 合 が 生 じる 場 合 がある スレッドAが 変 数 iの 値 を1 増 やす スレッドBが 変 数 iの 値 を1 増 やす 上 記 の 処 理 が 同 時 に 行 われるとiの 値 が1 しか 増 えない 場 合 がある
問 題 が 生 じないケース 変 数 moneyの 値 ( 現 在 の 値 は98)をスレッドAとスレッドB が1ずつ 増 やす 処 理
問 題 が 生 じるケース 変 数 moneyの 値 ( 現 在 の 値 は98)をスレッドAとスレッドB が1ずつ 増 やす 処 理 スレッドAの 処 理 にスレッドBが 割 り 込 んだ
スレッドの 同 期 メソッドにsynchronized 修 飾 子 をつけ ると そのメソッドを 実 行 できるスレッ ドは 一 度 に1つに 限 定 される static synchronized void addoneyen() { money++; あるスレッドによってメソッドが 実 行 されている 間 は 他 のスレッドはその 処 理 が 終 わるまで 待 機 することになる これをスレッドの 同 期 と 呼 ぶ
第 12 章 ガーベッジコレクションとメモリ
プログラムの 実 行 とメモリ 管 理 プログラム 実 行 中 に 覚 えておかなくては ならない 情 報 はメモリに 格 納 される メモリにはスタックとヒープと 呼 ばれる 領 域 がある スタック ヒープ メソッドの 呼 び 出 し 履 歴 メソッドの 中 で 宣 言 されたローカル 変 数 の 値 メソッドの 処 理 が 終 わると そのメソッ ドに 関 する 情 報 と 変 数 が 削 除 される 生 成 されたインスタンス ガーベッジコレクタによって 管 理 される
スタックとヒープ MyObject dosomething() { MyObject obj = new MyObject(); return obj;
空 きメモリサイズの 確 認 class DataSet { int x; int y; public class FreeMemoryTest { public static void main(string[] args) { System.out.println(" 空 きメモリサイズ:" + Runtime.getRuntime().freeMemory()); DataSet[] data = new DataSet[100]; for(int i = 0; i < 100; i++) { data[i] = new DataSet(); System.out.println(" 生 成 済 みインスタンス 数 :" + (i + 1) + " 空 きメモリサイズ:" + Runtime.getRuntime().freeMemory());
使 用 できるサイズは 有 限 インスタンスを 大 量 に 生 成 すると ヒー プを 消 費 する 全 て 使 い 切 ってしまうと 実 行 時 エラーが 発 生 する メソッドの 呼 び 出 しの 階 層 があまりに 深 いとスタックも 使 いきる 可 能 性 がある ( 再 帰 呼 び 出 しなどを 行 った 場 合 )
ガーベッジコレクション プログラムの 中 で 不 要 になったインスタ ンスの 情 報 を 削 除 し メモリの 空 き 領 域 を 増 やす 処 理 Java 仮 想 マシンが 自 動 で 行 う インスタンスが 不 要 になる インスタンスがどこからも 参 照 されなくなる
ガーベッジコレクションの 対 象 になるタイミング MyObject obj1 = new MyObject(); MyObject obj2 = new MyObject(); obj2 = obj1; 参 照 先 の 変 更 ガーベッジコレクションの 対 象
ガーベッジコレクションの 対 象 になるタイミング MyObject obj = new MyObject(); obj = null; nullの 代 入 生 成 されたインスタンスは 誰 からも 参 照 されなくなる void dosomething() { MyObject obj = new MyObject(); メソッドの 処 理 が 終 わると 生 成 されたインスタンスは 誰 からも 参 照 されなくなる
ガーベッジコレクションが 実 行 されるタイミング Java 仮 想 マシンが 適 切 なタイミングで 実 行 する ガーベッジコレクションは 時 間 のかかる 処 理 なので ある 程 度 不 要 なインスタン スが 貯 まってからまとめて 行 われる Runtime.getRuntime().gc(); の 命 令 文 で ガーベッジコレクションを 指 定 したタイミングで 行 わせることもでき る
第 13 章 コレクション
大 きさの 変 わる 配 列 Javaでの 配 列 の 使 い 方 MyObject[] objects = new MyObject[100]; objects[0] = new MyObject(); 要 素 の 数 を 指 定 する 必 要 がある 格 納 できる 要 素 の 数 の 上 限 は 後 から 変 更 できない java.utilパッケージにarraylistという 便 利 なクラスがある 要 素 の 数 を 最 初 に 決 める 必 要 が 無 い 便 利 なメソッドが 備 わっている
ArrayListの 活 用 ArrayList months = new ArrayList(); months.add("january"); System.out.println(" 要 素 数 " + months.size()); months.add("februaly"); System.out.println(" 要 素 数 " + months.size()); months.add("march"); System.out.println(" 要 素 数 " + months.size()); System.out.println("== 一 覧 の 出 力 =="); System.out.println(months.get(0)); System.out.println(months.get(1)); System.out.println(months.get(2));
型 を 指 定 したArrayListクラス 型 パラメータを 指 定 したArrayListオブ ジェクトの 生 成 ArrrayList<Point> points = new ArrayList<Point>(); < >の 中 に 配 列 に 格 納 するオブジェクトの 型 を 指 定 する 型 パラメータ ここで 指 定 した 型 のオブジェクトだけを 格 納 でき るようになる 上 の 例 ではPointクラスのインスタンスまたは Pointクラスのサブクラスのインスタンス
型 パラメータの 指 定 の 有 無
ジェネリクス API 仕 様 書 でArrayListを 見 るとクラス 名 が 次 のようになっている ArrayList<E> E はArrayListに 格 納 できるオブジェク トのクラスを 指 定 する 型 パラメータ getメソッドは 次 のように 記 述 されている public E get(int index) 戻 り 値 の 型 が E となっている 型 パラメータ で 指 定 したクラスの 参 照 が 戻 り 値 と 言 う 意 味 特 定 のクラスに 特 化 したArrayListにできる
ラッパークラス ArrayListに 格 納 できるのは 参 照 型 基 本 型 の 値 は 格 納 できない ArrayList<int> は 誤 り ラッパークラスを 使 用 する ラッパークラスとは 基 本 型 をオブジェクトとし て 扱 うためのクラス ArrayList<Integer> arr = new ArrayList<Integer>(); arr.add(new Integer(50)); Integer integer0 = arr.get(0); int i = integer0.intvalue();
基 本 型 とそれに 対 応 するラッパークラス
コレクションフレームワーク 実 際 のプログラムでは 複 数 の( 多 数 の)オブジェクト を 扱 うことが 多 い 配 列 よりも 便 利 に 使 えるクラスがJavaには 予 め 多 数 準 備 されている これらをコレクションフレームワークと 呼 ぶ(ArrayListもこれに 含 まれる) 目 的 に 応 じて 使 い 分 ける 膨 大 な 数 のオブジェクトから 目 的 のオブジェクトを 素 早 く 取 り 出 したい 同 じインスタンスへの 参 照 が 重 複 して 格 納 されないようにした い キーワードを 使 ってオブジェクトを 取 りだしたい 特 定 の 値 で 並 び 変 えたい 大 きく 分 けると リスト マップ セットの3 種 類
リスト オブジェクトが 順 番 に 並 ぶ 先 頭 から2 番 目 のもの 最 後 に 追 加 したも の を 取 りだすことができる 異 なる 要 素 が 同 一 のオブジェクトを 参 照 できる Listインタフェースを 実 装 する
マップ キーと 値 (オブジェクト)のペアを 管 理 する キーでオブジェクトを 取 りだせる キーは 重 複 してはいけない Mapインタフェースを 実 装 する
セット 格 納 されるオブジェクトに 重 複 がないことを 保 証 する 個 々のオブジェクトを 指 定 して 取 りだす 方 法 が 無 い(リストやマップと 組 み 合 わせて 使 用 する) Setインタフェースを 実 装 する
リストコレクション:ArrayList 配 列 + 便 利 な 機 能 インデックスで 直 接 要 素 にアクセスできるので 高 速 要 素 の 追 加 と 削 除 には 内 部 で 要 素 のコピーが 行 われるので 低 速
リストコレクション:LinkedList 要 素 の 追 加 と 削 除 は 高 速 インデックスを 指 定 しての 要 素 へのアク セスは 低 速
マップコレクション:HashMap キーと 値 に 使 用 する 型 を 型 パラメータで 指 定 する HashMap<String, String> map = new HashMap<String, String>(); map.put(" 住 所 ", " 茨 城 県 つくば 市 "); map.put(" 氏 名 ", "Java 太 郎 "); System.out.println(map.get(" 住 所 ")); System.out.println(map.get(" 氏 名 "));
セットコレクション:HashSet キーと 値 に 使 用 する 型 を 型 パラメータで 指 定 する HashSet<String> set = new HashSet<String>(); map.add("jan"); map.add("feb"); System.out.println(set); // 要 素 を 全 て 出 力 System.out.println(set.contains("Jan"));
コレクションに 含 まれる 全 要 素 へのアクセス これまでに 学 習 したfor 文 を 使 うと 次 の ようにしてArrayListの 全 要 素 にアクセ スできる ArrayList<String> list = new ArrayList<String>(); list.add("good morning."); list.add("hello."); for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); この 方 法 は インデックスを 指 定 して 要 素 にアクセスできるものにしか 使 えない インデックスを 指 定 したアクセスが 低 速 なコレクションには 適 さない 他 にも 全 要 素 にアクセスする 方 法 がある
イテレータ(Iterator) イテレータは コレクションの 中 の 要 素 を1つず つ 順 番 に 参 照 する 能 力 をもつオブジェクト 主 に 次 の2つのメソッドがある boolean hasnext() まだ 要 素 があるか E next() 現 在 参 照 している 要 素 を 返 して 次 の 要 素 に 移 動 する
イテレータ(Iterator)の 使 用 例 HashSet<String> set = new HashSet<String>(); set.add("a"); set.add("b"); set.add("c"); set.add("d"); Iterator<String> it = set.iterator(); while(it.hasnext()) { String str = it.next(); System.out.println(str); セットコレクションに 対 しても 1つずつ 要 素 を 参 照 できる
拡 張 for 文 通 常 のfor 文 イテレータを 使 ったアクセ スよりも 簡 潔 に 記 述 できる 構 文 for( 型 名 変 数 名 : コレクション) { forループ 内 の 処 理 ArrayList<String> list = new ArrayList<String>(); list.add("good morning."); list.add("hello."); for(string str : list) { System.out.println(str);
LinkedListクラスによるキュー キュー: 先 入 れ 先 出 し(First In First Out:FIFO)によるオブジェクト 管 理
Queueインタフェースの 使 用 Queue<String> queue = new LinkedList<String>(); queue.offer("(1)"); System.out.println("キューの 状 態 :" + queue); queue.offer("(2)"); System.out.println("キューの 状 態 :" + queue); queue.offer("(3)"); System.out.println("キューの 状 態 :" + queue); queue.offer("(4)"); System.out.println("キューの 状 態 :" + queue); while(!queue.isempty()) { System.out.println(" 要 素 の 取 り 出 し:" + queue.poll()); System.out.println("キューの 状 態 " + queue);
LinkedListクラスによるスタック スタック: 後 入 れ 先 出 し(Last In First Out:LIFO)によるオブジェクト 管 理
LinkedListのスタックとしての 利 用 LinkedList<String> stack = new LinkedList<String>(); stack.addlast("(1)"); System.out.println("スタックの 状 態 :" + stack); stack.addlast("(2)"); System.out.println("スタックの 状 態 :" + stack); stack.addlast("(3)"); System.out.println("スタックの 状 態 :" + stack); stack.addlast("(4)"); System.out.println("スタックの 状 態 :" + stack); while(!stack.isempty()) { System.out.println(" 要 素 の 取 り 出 し:"+stack.removeLast()); System.out.println("スタックの 状 態 " + stack);
sortメソッドによる 並 べ 替 え コレクションに 格 納 された 要 素 を 値 の 大 小 で 並 べ 替 えたいことがよくある Collectionsクラスのsortメソッドで List インタフェースを 実 装 したコレクション (ArrayList, LinkedListなど)の 要 素 の 並 び 替 えを 行 える ArrayList<String> list = new ArrayList<String>(); // listに 要 素 を 追 加 する 処 理 Collections.sort(list); // 並 び 替 え 実 行
自 作 クラスのインスタンスの 並 び 替 え 自 分 で 作 ったクラスを 順 番 に 並 び 替 える 場 合 は 大 小 をどのように 決 定 するのか 明 らかにしてお く 必 要 がある Comparableインタフェースを 実 装 する public int comapareto(クラス 名 変 数 名 ) メソッドを 実 装 する
Comarableインタフェースの 実 装 例 class Point implements Comparable<Point> { int x; int y; Point(int x, int y) { this.x = x; this.y = y; public int compareto(point p) { return (this.x + this.y) - (p.x + p.y); ArrayList<Point> list = new ArrayList<Point>(); // listに 要 素 を 追 加 する 処 理 Collections.sort(list); // 並 び 替 え 実 行
第 14 章 入 出 力
入 出 力 入 力 :プログラムにデータが 入 ってくること ファイルからのデータの 読 み 込 み キーボードで 入 力 されたデータの 読 み 込 み ネットワーク 通 信 によるデータの 読 み 込 み 出 力 :プログラムからデータを 送 りだすこと 画 面 への 表 示 ファイルへの 保 存 ネットワーク 通 信 による 送 信 プリントアウト ストリームオブジェクトがデータの 橋 渡 しをする 扱 うデータは 文 字 列 データ(Unicode,16ビッ ト 単 位 ) と バイナリデータ(8ビット 単 位 ) に 分 けられる
標 準 出 力 入 出 力 先 を 特 に 指 定 しなかった 場 合 に 標 準 的 に 使 用 される 出 力 一 般 的 には コ ンソール 標 準 出 力 への 文 字 列 の 出 力 System.out.println("こんにちは");
標 準 入 力 標 準 入 力 からの 文 字 列 の 受 け 取 り InputStreamReader in = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(in); try { String str = reader.readline(); catch(ioexception e) {
文 字 列 と 数 値 の 変 換 標 準 入 力 から 渡 されるデータは 文 字 列 10 という 文 字 列 を 数 値 として 処 理 で きるようにするには 次 のような 変 換 が 必 要 String str0 = "10"; int i = Integer.parseInt(str0); String str1 = "0.5"; double d = Double.parseDouble(str1);
ファイルへの 出 力 try { File file = new File("C: java test.txt"); FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); for(int i = 0; i < 5; i++) { bw.write("[" + i + "] r n"); bw.close(); catch (IOException e) { System.out.println(e);
バッファを 用 いたデータの 書 き 込 み
バッファを 用 いたデータの 読 み 込 み
ストリームの 連 結 ストリームは 最 低 1つ 必 要 目 的 に 応 じてストリームを 複 数 連 結 できる
ファイルからの 入 力 try { File file = new File("C: java test.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String s; while((s = br.readline())!= null) { System.out.println(s + "を 読 み 込 みました"); br.close(); catch (IOException e) { System.out.println(e);
シリアライゼーションとオブジェクトの 保 存 プログラムの 状 態 をファイルに 保 存 する ( 一 度 プログラムを 終 了 させて 後 から 続 きを 行 うときなどに 必 要 ) 方 法 1.テキストファイルに 文 字 列 で 情 報 を 書 き 込 む 方 法 2.シリアライゼーションによってオブ ジェクトそのものをファイルに 保 存 する
シリアライゼーション オブジェクトをその 状 態 を 保 持 したままファイ ルに 書 き 出 すことができる このことをシリアライゼーションと 言 う ファイルに 書 き 出 せるオブジェクトは Serializableインタフェースを 実 装 している 必 要 がある 実 装 すべきメソッドは 何 もないの で 宣 言 するだけ class Point implements Serializable { int x; int y;
シリアライゼーションを 使 用 したオブジェクトの 保 存 try { FileOutputStream fs = new FileOutputStream("C: java triangle.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeobject(/* 出 力 するオブジェクトへの 参 照 */); os.close(); catch(ioexception e) { System.out.println(e);
保 存 したオブジェクトの 再 現 try { FileInputStream fs = new FileInputStream("C: java triangle.ser"); ObjectInputStream os = new ObjectInputStream(fs); MyObject obj = (MyObject)os.readObject(); os.close(); catch(ioexception e) { System.out.println(e); catch (ClassNotFoundException e) { System.out.println(e);
ファイルとフォルダの 操 作 java.io.fileクラスを 使 って ファイ ルとフォルダの 操 作 を 行 える Fileオブジェクトの 作 成 File file = new File("C: java test.txt"); Fileクラスのファイル 操 作 のための 主 なメソッド boolean exists() ファイルが 存 在 するか どうか 確 認 する boolean delete() ファイルを 削 除 する boolean renameto(file dest) 名 前 を 変 更 する
フォルダ 操 作 フォルダもファイルと 同 じように java.io.fileクラスを 使 用 する Fileオブジェクトの 作 成 File file = new File("C: java"); Fileクラスのフォルダ 操 作 のための 主 なメソッド String[] list() boolean mkdir() boolean mkdirs() boolean delete() フォルダに 含 まれるファイルの 一 覧 を 返 す フォルダを 作 成 する 階 層 を 持 ったフォルダを 一 度 に 作 成 する フォルダを 削 除 する
第 15 章 GUI
GUIアプリケーションとは GUI: Graphical User Interface CUI: Character-based User Interface
Swingライブラリ ウィンドウ ボタン メニューなどを 扱 うクラス 群 を 集 めたライブラリ javax.swingパッケージに 含 まれる GUIアプリケーションを 扱 うには ユーザ の 操 作 に 応 答 するためのイベント 処 理 が 必 要
import javax.swing.*; フレームの 作 成 class SimpleFrameExample { public static void main(string[] args) { JFrame frame = new JFrame(); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 200); frame.setvisible(true);
自 分 自 身 のインスタンスを 生 成 するクラス import javax.swing.*; public class MyFrame extends JFrame { public static void main(string[] args) { new MyFrame(); MyFrame() { setdefaultcloseoperation(jframe.exit_on_close); setsize(300, 200); setvisible(true);
コンポーネントの 配 置 ボタンやチェックボックスなどのGUI 部 品 は コンポーネント と 呼 ばれる コンポーネントは コンテナの 上 に 配 置 される
JButton(ボタン)コンポーネントの 配 置 import javax.swing.*; public class MyFrame extends JFrame { public static void main(string[] args) { new MyFrame(); MyFrame() { setdefaultcloseoperation(jframe.exit_on_close); getcontentpane().add(new JButton("ボタン")); setsize(300, 200); setvisible(true); ボタンを 配 置 しただけなので クリックしても 何 も 起 こらない
ボーダーレイアウト JFrameクラスのgetContentPaneメソッド で 取 得 できるコンテナはBorderLayoutと 呼 ばれる 方 法 でコンポーネントが 配 置 される 配 置 場 所 を5つから 選 択 して 指 定 できる add(borderlayout.west, new JButton("ボタン"));
ボーダーレイアウトの 配 置 例 getcontentpane().add(borderlayout.center, new JButton("CENTER")); getcontentpane().add(borderlayout.south, new JButton("SOUTH")); getcontentpane().add(borderlayout.west, new JButton("WEST")); getcontentpane().add(borderlayout.east, new JButton("EAST")); getcontentpane().add(borderlayout.north, new JButton("NORTH")); setsize(300, 200); setvisible(true);
ボーダーレイアウトの 配 置 例 コンポーネントの 数 に 応 じて 自 動 的 に 大 きさが 調 整 される WESTに 配 置 しなかった 場 合 CENTER,SOUTHのみ 配 置 した 場 合
レイアウトマネージャ レイアウトマネージャがコンポーネントをど こに どの 大 きさで 配 置 するかを 決 定 する 各 種 のレイアウトマネージャが 準 備 されてい る それぞれ レイアウト 方 法 が 異 なる BorderLayout FlowLayout BoxLayout GridLayout レイアウトマネージャを 変 更 するには コン テナのsetLayoutメソッドを 使 用 する
フローレイアウト setdefaultcloseoperation(jframe.exit_on_close); getcontentpane().setlayout(new FlowLayout()); getcontentpane().add(new JButton("1 January")); getcontentpane().add(new JButton("2 February")); getcontentpane().add(new JButton("3 March")); getcontentpane().add(new JButton("4 April")); getcontentpane().add(new JButton("5 May")); getcontentpane().add(new JButton("6 June")); setsize(300, 200); setvisible(true);
ボックスレイアウト getcontentpane().setlayout( new BoxLayout(getContentPane(), BoxLayout.Y_AXIS);
グリッドレイアウト getcontentpane().setlayout( new GridLayout(2, 3));
パネルを 活 用 したレイアウト JPanelはコンポーネントをのせることが できるコンポーネント JPanelを 活 用 することで 複 雑 なコン ポーネントの 配 置 が 可 能 になる
イベント 処 理 ボタンがクリックされた などのよう に ユーザによって 何 か 操 作 が 行 われた ことを イベントが 発 生 した という Javaでは イベントオブジェクト (java.awt.event)によって イベント が 表 現 される イベントが 発 生 したときの 処 理 をイベン ト 処 理 という
ソースとリスナ イベントを 発 生 するオブジェクトのことを ソース(source)と 呼 ぶ JButtonなどの コンポーネントに 限 られる イベントを 受 け 取 るオブジェクトのことをリ スナ(listener)と 呼 ぶ 必 要 なインタ フェース(リスナインタフェース)を 実 装 し ているクラスがリスナになれる
イベント 処 理 (ボタン 押 下 時 の 処 理 )を 行 うプログラムの 作 成 1.リスナを 作 成 する イベント 通 知 を 受 け 取 るクラスを 作 成 する ActionListenerインタフェースを 実 装 す る イベントが 発 生 すると actionperformed メソッドが 呼 び 出 される 2.ソースにリスナを 登 録 する イベントが 発 生 した 時 に その 通 知 を 誰 に 送 るのかをソースに 登 録 する リスナ 登 録 リスナ 登 録 はaddActionListenerメソッ ドで 行 う
import javax.swing.*; import java.awt.event.*; public class SingleButtonExample extends JFrame implements ActionListener { public static void main(string[] args) { new SingleButtonExample(); SingleButtonExample() { JButton button = new JButton("ボタン"); button.addactionlistener(this); getcontentpane().add(button); setdefaultcloseoperation(jframe.exit_on_close); setsize(200, 100); setvisible(true); public void actionperformed(actionevent ae) { System.out.println("ボタンが 押 されました");
イベント 処 理 の 様 子 リスナ 登 録 したオブジェクト (SimpleButtonExampleオブジェクト)へイ ベントが 通 知 される(actionPerformedメソッ ドが 呼 び 出 される)
複 数 のコンポーネントがある 場 合 異 なるボタンに 対 して 同 じオブジェクトをリ スナ 登 録 している 場 合 は 同 じように actionperformedメソッドが 呼 ばれる 引 数 で 渡 されるActionEventオブジェクトの getsourceメソッドでイベント 通 知 元 のオブ ジェクトを 判 別 できる
JButton button1; JButton button2; MultiButtonsExample() { button1 = new JButton("ボタン1"); button1.addactionlistener(this); getcontentpane().add(borderlayout.west, button1); button2 = new JButton("ボタン2"); button2.addactionlistener(this); getcontentpane().add(borderlayout.east, button2); setdefaultcloseoperation(jframe.exit_on_close); setsize(200, 100); setvisible(true); public void actionperformed(actionevent ae) { if(ae.getsource() == button1) { System.out.println("ボタン1が 押 されました"); else if(ae.getsource() == button2) { System.out.println("ボタン2が 押 されました");
さまざまなコンポーネント Swingライブラリには さまざまなコン ポーネントがある 必 要 に 応 じてAPI 仕 様 書 を 調 べる
第 16 章 グラフィックスとマウスイベント
JPanelを 使 ったグラフィックス 描 画 描 画 を 行 うためのパネルクラスの 作 成 (JPanelを 継 承 ) paintcomponentメソッドをオーバーライドする 引 数 のGraphicsオブジェクトを 使 って 描 画 import java.awt.*; import javax.swing.*; public class MyPanel extends JPanel { public void paintcomponent(graphics g) { g.fillrect(50, 30, 150, 100); 作 成 したパネルクラスを 配 置 する getcontentpane().add(new MyPanel());
Graphiscオブジェクトの 座 標 系 描 画 領 域 の 大 きさはコンポーネントの getsizeメソッドで 取 得 できる
直 線 の 描 画 public void paintcomponent(graphics g) { Dimension d = getsize(); g.drawline(0, 0, d.width, d.height); g.drawline(0, d.height, d.width, 0);
様 々な 描 画 メソッド drawarc 円 弧 を 描 く drawline 直 線 を 描 く drawoval 楕 円 を 描 く drawpolygon 多 角 形 を 描 く drawpolyline 折 れ 線 を 描 く drawrect 長 方 形 を 描 く drawstring 文 字 列 を 描 く setcolor 描 画 色 を 指 定 する
Graphics2Dクラス Graphicsクラスよりも 高 機 能 なグラ フィックス 機 能 を 提 供 する グラデーション アンチエイリアシング 線 の 太 さ 線 のスタイルの 指 定 など paintcomponentメソッドの 引 数 の Graphicsオブジェクトをキャストして 使 用 できる public void paintcomponent(graphics g) { Graphics2D g2d = (Graphics2D)g; // Graphics2Dのメソッドを 使 った 描 画
マウスイベント マウスクリック カーソルの 移 動 ド ラッグ 操 作 などもイベントの1つ イベント 処 理 によって マウスで 操 作 で きるプログラムを 作 成 できる リスナ 登 録 リスナインタフェースの 実 装 イベントが 通 知 された 時 の 処 理
2つのイベントリスナ MouseListenerインタフェース void mouseclicked(mouseevent e) void mouseentered(mouseevent e) void mouseexited(mouseevent e) void mousepressed(mouseevent e) void mousereleased(mouseevent e) MouseMotionListenerインタフェース void mousedragged(mouseevent e) void mousemoved(mouseevent e) それぞれ 次 のメソッドでリスナ 登 録 する addmouselistener addmousemotionlistener
import java.awt.event.*; import javax.swing.*; class MyPanel extends JPanel implements MouseListener, MouseMotionListener { public MyPanel() { addmouselistener(this); addmousemotionlistener(this); public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { public void mousedragged(mouseevent e) { public void mousemoved(mouseevent e) {
第 17 章 ネットワーク
ネットワーク 接 続 一 般 的 にTCP/IPというプロトコルが 用 い られることが 多 い 一 方 をサーバー 他 方 をクライアントと 呼 ぶ
IPアドレスとポート 番 号 クライアントがサーバーに 接 続 要 求 を 出 す サーバーのIPアドレスと サーバー 側 の プログラムが 使 用 するポート 番 号 を 知 っ ている 必 要 がある IPアドレスの 例 :192.168.1.11 ポート 番 号 の 例 :5000 番
ServerSocketとSocket
サーバー 側 のプログラム 例 try { ServerSocket serversocket = new ServerSocket(5000); while(true) { Socket socket = serversocket.accept(); PrintWriter writer = new PrintWriter(socket.getOutputStream()); writer.println("こんにちは 私 はサーバです "); writer.close(); catch(ioexception e) { System.out.println(e);
クライアント 側 のプログラム 例 try { Socket socket = new Socket("127.0.0.1", 5000); BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); String message = reader.readline(); System.out.println("サーバーからの 文 字 列 :" + message); reader.close(); catch(ioexception e) { System.out.println(e);
第 18 章 一 歩 進 んだ Javaプログラミング
スタティックインポート パッケージ 名 とクラス 名 を 省 略 して ク ラス 変 数 やクラスメソッドを 直 接 記 述 で きる import static java.lang.math.pi; import static java.lang.math.abs; public class StaticImportExample { public static void main(string[] args) { System.out.println("PI=" + PI); System.out.println("abs(-2)=" + abs(-2));
System.out.printfメソッド 文 字 列 の 中 の 特 別 な 記 号 (%d, %fなど) を 引 数 で 指 定 した 変 数 の 値 に 置 き 換 え ることができる int x = 5; int y = 10; int z = 15; System.out.printf("x=%d%n", x); System.out.printf("(x,y)=(%d,%d)%n", x,y); System.out.printf("(x,y,z)=(%d,%d,%d)%n",x,y,z); %d 整 数 %f 小 数 を 含 む 値 %s 文 字 列 %n 改 行
enum 宣 言 特 定 の 定 数 の 値 だけを 取 れる 独 自 の 型 を 定 義 できる class Student { enum Gender { MALE, FEMALE ; String name; Gender gender; Student s = new Student(); s.name = " 山 田 太 郎 "; s.gender = Student.Gender.MALE;
== 演 算 子 とequalsメソッド == 演 算 子 を 使 って2つのオブジェクト 参 照 を 比 較 した 場 合 両 方 が 同 一 のインスタ ンスを 参 照 している 場 合 はtrue,そうで ない 場 合 はfalse equalsメソッドはobjectクラスに 備 わっているメソッド オーバーライドし て 自 分 で 定 義 できる コレクションクラスでは オブジェクト の 比 較 にequalsメソッドが 使 用 される
内 部 クラス クラスの 宣 言 を 別 のクラスの 内 部 で 行 え る class Outer { class Inner { 内 部 クラスは 外 部 クラスのプライベート 宣 言 された 変 数 にもアクセスできる
匿 名 クラス メソッドの 引 数 を 指 定 するカッコの 中 で クラスを 定 義 すること と そのイン スタンスを 生 成 すること の 両 方 を 行 え る クラスの 名 前 が 不 要 plusbutton.addactionlistener { new ActionListener() { public void actionperformed(actionevent ae) { // 処 理 ;