[J2SE1.4] コレクション・フレームワーク

»more

[J2SE1.4] java.langパッケージ

goto [J2SE1.4] INDEX

[J2SE1.4] スレッド

スレッド
ソフトウェア(プログラム)の実行単位
1つのプログラムは最低1つのスレッドが存在する

public class SingleThreadExample {
  public static void main(String[] args) {
    syso("working");
  }
}

上記プログラムを実行するとmainメソッドの処理を行う1つのスレッドが起動する。
→スレッドを1つだけ起動させるプログラムを【シングルスレッド】のプログラムという。

シングルスレッドのプログラムに対して複数スレッドが動くプログラムを【マルチスレッド】のプログラムと言う。


マルチスレッドプログラムの作成方法
Javaでマルチスレッドのプログラムを作成するには、スレッド生成のクラスを作成する必要がある。
スレッドの生成クラスの作成方法2つ
・Threadクラスを継承する方法
・Runnableインタフェースを実装する方法

【Threadクラスを継承する方法】
Threadクラスのサブクラスを作成
run()メソッドをオーバーライド
スレッドで処理したい内容を記述

public class ExtendingThreadSample extends Thread {
  public void run() {
    //any operation
  }
}

次に
ExtendingThreadSampleをインスタンス化
インスタンスのstart()メソッドを呼ぶ
ことでスレッドが起動する。

public class MainClass {
  public static void main(String[] args) {
    ExtendingThreadSample th = new ExtendingThreadSample();
    th.start();
  }
}

スレッドを起動させる為に呼ぶメソッドはrun()メソッドではなく、start()メソッドである。
start()メソッドを呼び出したタイミングですぐにスレッドが実行されるわけではなく、
スレッドスケジューラに登録されるだけで、いつ実行するかはスレッドスケジューラが決定権を持つ。


【Runnableインタフェースを実装する方法】
Runnableインタフェースを実装
Runnableの抽象メソッドrun()メソッドを定義
スレッドで処理したい内容を記述

public class ImplementingRunnableSample implements Runnable {
  public void run() {
    //any operation
  }
}

起動・実行するには
ImplementingRunnableSampleをインスタンス化
インスタンスをコンストラクタ引数として Threadクラスをインスタンス化
Threadクラスのインスタンスのstart()メソッドを呼ぶ

public class MainClass {
  public static void main(string[] args) {
    ImplementingRunnableSample myThread = new ImplementingRunnableSample();
    Thread th = new Thread(myThread);
    th.start();
  }
}

Runnableインタフェースを実装したクラスには、start()メソッドがない為、
スレッドスケジューラに登録できない。
→Threadクラスのインスタンスを作成し、start()を呼んで実行する。

--------------------------------------------------
Q1 間違ってるのは?

a. スレッドを生成するクラスを作成する場合、Threadクラスを継承すればよい。
b. スレッドの実行開始はrun()メソッドを呼び出すことで行う。
c. スレッドを生成するクラスを作る場合、Runnableインタフェースを実装すればよい。
d. スレッドの実行開始はstart()メソッドを呼んで行う。

A1

b

start():スレッドを実行開始するメソッド
run():スレッドの処理内容を記述するメソッド

--------------------------------------------------
Q2 正しいのは?

01:class ThreadSample extends Thread {
02:  public void run() {
03:    for (int i=0; i<5; i++) {
04:      System.out.println("hoge");
05:    }
06:  }
07:}
08:public class MainSample {
09:  public static void main(String[] args) {
10:    ThreadSample th = new ThreadSample();
11:    th.run();
12:  }
13:}

a. 10行目でコンパイルエラー
b. 12行目でコンパイルエラー
c. 実行時にエラー
d. 問題なく実行される

A2

d

スレッドの実行開始には、run()でなく、start()を呼ぶ。
run()を呼んだ場合は、スレッドとして実行されず、
同スレッドでrun()が実行されるだけ。

--------------------------------------------------
Q3 正しいのは?

01:classThreadSample implements Runnable {
02:  public void run() {
03:    for (int i=0; i<5;i++) {
04:      System.out.println("hoge");
05:    }
06:  }
07:}
08:public class MainSample {
09:  public static void main(Strng[] args) {
10:    ThreadSample th = new ThreadSample();
11:    th.start();
12:  }
13:}

a. 10行目でコンパイルエラー
b. 11行目でコンパイルエラー
c. 実行時にエラー
d. 問題なく実行される

A3

b

10行目では問題なくインスタンス化されるが
ThreadSampleクラスはThreadクラスのサブクラスでないので
start()は呼び出せない。

--------------------------------------------------
Q4 (A)に入るのは?

01:public class ThreadSample implements Runnable {
02:  public void run() {
03:    for (int i=0; i<5; i++) {
04:      System.out.println("hoge");
05:    }
06:  }
07:  public static void main(String[] args) {
08:    (A)
09:  }
10:}

a. new ThreadSample().start();
b. new Thread(new ThreadSample()).start();
c. new Thread(ThreadSample).start();
d. new Thread(new ThreadSample()).run();

A4

b

--------------------------------------------------
Q5 正しいのは?

01:public class ThreadSample extends Thread {
02:  public void run() {
03:    for (int i=0; i<5; i++) {
04:      System.out.println("hoge");
05:    }
06:  }
07:}
08:public class MainSample {
09:  public static void main(String[] args) {
10:    ThreadSample th = new ThreadSample();
11:    Thread t = new Thread(th);
12:    t.start();
13:  }
14:}

a. 10行目でコンパイルエラー
b. 11行目でコンパイルエラー
c. 実行時にエラー
d. 問題なく実行される

A5

d

--------------------------------------------------
Q6 Threadクラスのインスタンスメソッドは?

a. sleep(long msec);
b. start();
c. wait();
d. run();
e.notifyAll();
f. join();

A6

○a. sleep(long msec);
○b. start();
×c. wait();
○d. run();
×e.notifyAll();
○f. join();

Thread#run(): スレッドの処理内容の実行
Thread#start():スレッド自体の実行開始
Thread#join():他のスレッドの実行終了を待機
THread#sleep(long msec):スレッドの実行を一時停止(static method)
Object#wait():他のスレッドからnotify()かnotifyAll()メソッドで呼ばれるまで待機
Object#notifyAll():待機している全スレッドを実行再開


goto [J2SE1.4] INDEX

[J2SE1.4] オーバーロード、オーバーライド、実行時のデータ型

goto [J2SE1.4] INDEX

[J2SE1.4] 演算子とデータのメモリの割り当て

Q1 正しいのは?

a. int a = 0x30000;
b. byte b = -0200;
c. double c = 3E+100;

A1

整数リテラルの表現を問う問題

○a. int a = 0x30000;
   頭の0xは、16進数を表す。16進数で30000は、10進数196608(=3*16^4)で、
   intの表現可能範囲内。
○b. byte b = -0200;
   頭の0は、8進数を表す。8進数で200は、10進数-128(=-2*8^2)で、
   byteの表現可能範囲内。
○c. double c = 3E+100;
   nE+yは、浮動小数表現のn*10^yを表す。3E+10は、10進数で30000000000で、
   doubleの表現可能範囲内。

--------------------------------------------------
Q2 何が表示される?

01:public class JavaBasic [
02:
03:  public static void main(String[] args) {
04:    int b = 10;
05:    b = ~b;
06:    b = b >> 3;
07:    b = b << 3;
08:    syso(b);
09:  }
10:}
11:
A2

-16

L.4: 10を2進数で表現すると[00000000000000000000000000001010](intは32bitなので32桁)になる。
L.5: ビット反転(~)すると[11111111111111111111111111110101]になる。
L.6: 3つ符号保存右シフト(>>)すると[11111111111111111111111111111110]となる。
符号保存右シフトは、最上位ビットが1のときは1が、0の時は0がシフトさせた後の最上に現れる。
符号無視右シフト(>>>)は常に0が現れる。
L.7: 左にシフト(<<)すると[11111111111111111111111111110000]となる。
これを10進数に直すと[-16]になる。

--------------------------------------------------
Q3 何が表示される?

public class JavaBasic {
  public static void main(String[] args[]) {
    int b = 10^10 + 10|10;
    syso(b);
  }
}

A3

30

ビット演算子は、優先順位が低い演算子で、[+]演算子の方が先に演算される。
→[10^(10 + 10)|10]となる。

前半部分[10^20]は、2進数で、
00000000000000000000000000001010 ^
00000000000000000000000000010100 =
00000000000000000000000000011110
という演算になる。
[^]演算子は、各ビット値を比較して異なる場合のみ1にする演算を行う。

後半部分は、
00000000000000000000000000011110 |
00000000000000000000000000001010 =
00000000000000000000000000011110
という演算になる。
[|]演算子は、各ビット値を比較してどちらか一方でも1の場合に1にする演算をする。

これを10進数に直すと、[30]になる。

--------------------------------------------------
Q4 実行結果は?

public class JavaBasic {
  public static void main(String[] args) {
    String a = null;
    int b = null;
    boolean c = (b > 5) | a.equals("ABC");
    syso(c);
  }
}

a. true
b. false
c. nullPointerException

A4

○c. nullPointerException

[|]演算子は、boolean型に対しても演算出来る。

論理演算子[||]と同じ演算結果になるが、[||]演算子の場合は、
左辺がtrueであれば右辺はtrueでもfalseでも演算結果はtrueになるため、
左辺がtrueの時は、右辺を実行しない。

論理演算子[|]は、左辺の結果が何であれ、必ず右辺を実行する。

a.equals("ABC")が実行されると、aがnullでヌルポが出る。

boolean c = (b > 5) || a.equals("ABC");
とすれば、実行結果trueとなる。


goto [J2SE1.4] INDEX

[J2SE1.4] Java言語の基礎

Q1 コンパイルしたらどうなる?

01:package javabasic;
02:
03:public class JavaBasic1 {
04:
05: private void func() {
06: System.out.println("SJC-P!");
07: }
08:
09: public static void main(String[] args) {
10: JavaBasic1 a = new JavaBasic1();
11: a.func();
12: }
13:}

a. L3でエラー
b. L5でエラー
c. L10でエラー
d. L11でエラー
e. エラーなし

A1

e

まず、
L.10でmain()メソッドから、自分自身のオブジェクトを作れるのか。
→自分自身のクラスに含まれるメソッドから、自分自身のオブジェクトを作ることは出来る。
次に、
L.11でprivateなインスタンスメソッドfunc()を呼び出せるのか。
→インスタンスメソッドは オブジェクトに対して呼び出しを行うことと、
 アクセス修飾子privateは 自分自身のクラスの中からはアクセスできること
 ことから問題なし。
よって、
コンパイル出来る。

--------------------------------------------------
Q2 コンパイルしたらどなる?

01:package javabasic;
02:
03:interface JavaBasicIF {
04:  String name = "hogehoge";
05:  public void func1();
06:  int func2();
07:  public abstract String func3();
08:}
09:
10:public class JavaBasicImpl implements JavaBasicIF {
11:  public void func1() {
12:    syso("func1");
13:  }
14:  
15:  int func2() {
16:    syso("func2");
17:    return 0;
18:  }
19:  
20:  public String func3() {
21:    syso("func3");
22:    return name;
23:  }
24:}

a. L4でエラー
b. L11でエラー
c. L15でエラー
d. L20でエラー
e. エラーなし

A2

c

インタフェースは、定数と抽象メソッドしか定義できない。
各メンバのシグニチャは、変数であればpublic final staticが、メソッドであればpublic abstractが自動付加される。

実装クラスは、インタフェースで定義された抽象メソッドと同じシグニチャのメソッドを定義する必要がある。
L6で定義されているのはpublic abstractなので、L15もpublicでなくてはならない。

--------------------------------------------------
Q3 正しいのは?

a. byteは、-127から128までの数値を扱える。
b. unsigned byteは、0から255までの数値を扱える。
c. intの最大値は、Integer.MAX_VALUEで得られる。
d. byte a = 10; byte b = 20; byte c = a + b;は文法的に正しい。
e. char c = 5000;は文法的に正しい。

A3

×a.
   byteで扱えるのは、-128〜127までの数値。
×b.
   javaに、unsignedなんてない。
○c.
   各基本データ型に対応するラッパクラスの
   MAX_VALUE、MIN_VALUE static変数で、最大、最小値を得られる。
×d.
   整数型は演算の際全てintにキャストされてから計算される。
   byte c = a + b;の右辺の演算結果はintになるため、コンパイルエラーになる。
○e.
   charは、2バイトの符号なし整数(0〜65535)を扱える。
--------------------------------------------------
Q4

a. strictfpは変数やメソッドの前に指定するJavaの修飾子である。
b. transientは、オブジェクトをシリアライズする際に、シリアライズ対象のフィールドにつける修飾子である。
c. volatileは、コンパイラに指示を与えるための修飾子である。
d. gotoを使ってラベルをつけた行へジャンプできる。

A4

×a.
   strictfpは、classやinterfaceの前につける修飾子。
   修飾子 strictfp を付与しクラスやメソッドを宣言した場合、
   そのスコープ内の式は全て FP-strict となる。
   FP-strict の式内では、計算の中間結果の表現もすべて
   IEEE 754 規格に定められた数値集合が使用される。
   逆に strictfp で宣言されていないクラスやメソッド内の式では、
   中間結果の表現に指数拡張範囲を用いる裁量が実装に対して許されている。
   つまりプラットフォームによって IEEE 754 規格外の数値集合が
   使われる可能性があり、式内の浮動小数点数の動作が変わる可能性があるということ。
×b.
   transientは、オブジェクトをシリアライズする際に、
   シリアライズ対象外のフィールドにつける修飾子。
○c.
   volatileは、コンパイラがフィールドに対して行う最適化を行わないように指示する修飾子。
×d.
   javaでは、gotoは意味の無い予約語。



goto [J2SE1.4] INDEX

[J2SE1.4] ガーベッジコレクション

ガーベッジコレクション(GC)=ゴミ集め
ゴミ=Javaプログラム中の不要になったオブジェクト

オブジェクトの要/不要=オブジェクトに対しての参照あり/なし
※参照されてるのに、GC対象となるケースもある。

Account a = new Account();
 参照変数 a ―参照→ Accountオブジェクト

a = null;
 参照変数 a ―×→ Accountオブジェクト
              →AccountオブジェクトはGC対象になる

GC対象となったオブジェクトは、直ぐにGCされメモリ開放となるわけでなく、
JavaVMが適当なタイミングでまとめてGCする。

--------------------------------------------------
Q1 GCされる可能性があるの何行目の後?

1:public class GCTest {
2:  public static void main(String[] args) {
3:    String str = "hello!";
4;    str = "g'bye!";
5:    System.out.pringln(str);
6:  }
7:}

a. L.3
b. L.4
c. L.5
d. L.6

A1

×a. L.3
○b. L.4
   L.3で、"hello!"というStringオブジェクトが作られ、
   それがString型参照変数strで参照されてる。
   L.4では、新たに"g'bye!"というStringオブジェクトが作られ参照されてる。
   この時点で、"hello!"Stringオブジェクトは何処からも参照されなくなるので、GC対象になる。
×c. L.5
×d. L.6

--------------------------------------------------
Q2 GCされる可能性があるのは、何行目の後?

1:public class GCTest {
2:  public static void main(String[] args) {
3:    String str = "hello!";
4:    str = str + " hogehoge";
5:    System.out.pringln(str);
6:  }
7:}

a. L.3
b. L.4
c. L.5
d. L.6

A2

×a. L.3
○b. L.4
   L.3で、"hello!"Stringオブジェクトが作られ、String型参照変数strに参照されてる。
   Stringオブジェクトは、内容を変更できないオブジェクト。
   L.4では、Stringオブジェクトの中身を置き換えてるように見えるが、そうではなく、
   新たに" hogehoge"Stringオブジェクトが作られ、演算によって"hello! hogehoge"Stringオブジェクトが作られる。
   結果、"helllo!"と" hogehoge"Stringオブジェクトは、参照されなくなり、GC対象になる。
×c. L.5
×d. L.6

--------------------------------------------------
Q3 GCされる可能性があるのは、何行目の後?

01:class Person {
02:  public String name;
03:  Person(String name) {
04:    this.name = name;
05:  }
06:}
07:public class GCTest {
08:  static Person func() {
09:    Person a = new Person("Shriver");
10:    return a;
11:  }
12:  public static void main(String[] args) {
13:    Person shriver = func();
14:    System.out.println(shriver.name);
15:  }
16:}

a. L.9
b. L.10
c. L.13
d. L.14
e. L.15

A3

×a. L.9
×b. L.10
×c. L.13
×d. L.14
○e. L.15

func()メソッド内9行目で作られるオブジェクトが、
どのタイミングでGC対象になるかがポイント。
このオブジェクトは、メソッド内の参照変数aから参照されている。

メソッド処理が終わると、変数の持つ参照はなくなるが、
戻り値としてshiriverという参照変数に参照されている。

main()メソッドの最後までshiriverに参照されているので、
GC対象になるのは、main()メソッドのブロックの後になる。

--------------------------------------------------
Q4 GCされる可能性があるのは、何行目の後?

01:class GCObject {
02:  public GCObject obj;
03:  GCObject() {
04:    this.obj = this;
05:  }
06:}
07:public class GCTest [
08:  public static void main(String[] args) {
09:    GCObject a = new GCObject();
10:    System.out.println();
11:    a = null;
12:    System.out.plintln();
13:  }
14:}

a. L.9
b. L.10
c. L.11
d. L.12
e. L.13

A4

×a. L.9
×b. L.10
○c. L.11
   ポイントは、4行目のように自分自身への参照を保持しているオブジェクト。
   例え参照があっても、その参照が自分自身からのみであれば、そのオブジェクトはGC対象になるため、
   11行目で参照変数aからの参照が無くなった時点でGC対象になる。
×d. L.12
×e. L.13

--------------------------------------------------
Q5 GCされる可能性があるのは、何行目の後?

01:class GCObject {
02:  public GCObject obj;
03:}
04:public class GCTest {
05:  public static void main(String[] args) {
06:    GCObject a = new GCObject();
07:    GCObject b = new GCObject();
08:    a.obj = b;
09:    b.obj = a;
10:    a = null;
11:    b = null;
12:    System.out.println();
13:  }
14:}

a. L.8
b. L.9
c. L.10
d. L.11
e. L.13

A5

×a. L.8
×b. L.9
×c. L.10
○d. L.11
×e. L.13

ポイントは、相互に参照を保持してるオブジェクトの扱い方。
相互に参照していても、その参照がいくつかのオブジェクト間で閉じている場合、
それらオブジェクト群は、まとめてGC対象になる。

--------------------------------------------------
Q6 強制的にGCするには?

a.強制的にメモリから開放することはできない
b.対象オブジェクトへの全ての参照をnullにする
c.そのオブジェクトへの全ての参照をnullにして System.gc()を実行する
d.そのオブジェクトへの全ての参照をnullにして Runtime.gc()を実行する

A6

○a.強制的にメモリから開放することはできない
×b.対象オブジェクトへの全ての参照をnullにする
   オブジェクトへの参照がなくなると、GC対象となり、
   JavaVMがGCを実行したタイミングでメモリから開放される。
×c.そのオブジェクトへの全ての参照をnullにして System.gc()を実行する
   System.gc()メソッドは、GCを行うようにJavaVMに提案するだけ。
   JavaVMはGC処理の優先順位を高く設定するが、そのタイミングにGCするとは限らない。
×d.そのオブジェクトへの全ての参照をnullにして Runtime.gc()を実行する
   そげなメソッドなぞなかばい。


goto [J2SE1.4] INDEX

[J2SE1.4] 制御文、アサーションと例外処理

Q1 (A)に入れられるのは?

switch (A) {
  ......
}

a. byte
b. short
c. int
d. long
e. char
f. float
g. double

A1

○a. byte
○b. short
○c. int
×d. long
○e. char
×f. float
×g. double

byte、short、int、charの4つの基本データ型が可能。
switch文の引数には、整数型の式を渡すが、long型を不可で、char型は可。

--------------------------------------------------
Q2 (A)に入れられるのは?

byte a = 100;
byte b = 10;
final byte c = 5;
switch (a) {
  case (A);
}

a. -100
b. 100
c. 変数b
d. 定数c
e. 3.14
f. -3.14

A2

○a. -100
   負の数値はOK。
×b. 100
   switchの引数になっているのはbyte型変数。
   byte型の範囲(-128〜127)外の値の指定は不可。
×c. 変数b
   caseに変数は不可。
○d. 定数c
   final指定された定数は可。
×e. 3.14
   caseは整数のみ。
×f. -3.14
   caseは整数のみ。
   


--------------------------------------------------
Q3 アサーション有効で、コンパイル実行できるのは?

public class AssertionTest {
  static void func(String str) {
    assert(str != null);
    System.out.println(str);
  }
  public static void main(String args[]) {
    func("hogehoge");
    func(null);
  }
}

a. javac -ea AssertionTest.java
b. javac -target 1.4 AssertionTest.java
c. javac -source 1.4 AssertionTest.java
d. java -ea AssertionTest
e. java -target 1.4 AssertionTest
f. java -source 1.4 AssertionTest

A3

×a. javac -ea AssertionTest.java
×b. javac -target 1.4 AssertionTest.java
○c. javac -source 1.4 AssertionTest.java
   -sourceオプションでソースコードがどのバージョンのJava言語で書かれているかを指定。
   このオプションをつけないとassertキーワードを含むコードはコンパイルエラーになる。
○d. java -ea AssertionTest
   -eaオプションをつけると、アサーションが有効になる。
   -eaオプションをつけずに実行しても、アサーションエラーは発生しない。
×e. java -target 1.4 AssertionTest
×f. java -source 1.4 ssertionTest

--------------------------------------------------
Q4 throwできるのは?

import java.io.*;
public class ThrowableTest {
  public static void main(String args[]) throws Throwable {
    throw new (A);
  }
}

a. String()
b. Throwable()
c. Exception()
d. RuntimeException()
e. IOException()
f. AssertError()

A4

×a. String()
○b. Throwable()
○c. Exception()
○d. RuntimeException()
○e. IOException()
○f. AssertError()

Throwable←Exception←RuntimeException
Throwable←Error←AssertError

--------------------------------------------------
Q5 入れてもエラーなくコンパイルできるのは?

public class ExceptionTest {
  static void func() throws IOException {
    throw new (A);
  }
  public static void main(String args[]) {
    try {
      func();
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }
}

a. IOException
b. RuntimeException()
c. Exception()
d. Error()

A5

○a. IOException
   func()メソッドのthrowsでIOExceptionは呼び出し元に投げるようになっている。
   呼び出し元では、Exceptionクラスのサブクラスであれば全ての例外をcatchするのでコンパイル可。
○b. RuntimeException()
   RuntimeException(とそのサブクラス)は、throwsに書かなくても自動的に呼び出し元に投げられる。
   呼び出し元は、全ての例外をcatchするのでコンパイル可。
×c. Exception()
   func()メソッドがthrowするのはIOExceptionとRuntimeException(とそのサブクラス)だけ。
   Excetionオブジェクトはthrow不可。
○d. Error()
   Errorとそのサブクラスは自動的に呼び出し元にthrowされ、catchする必要がないもの。
   コンパイル可。

--------------------------------------------------
Q6 assertを用いたチェックとして(A)に相応しいのは?

public class AssertTest {
  private int value;
  public void func(int i) {
    assert (A);
    ......
  }
}

a. i > 0
b. i++ > 0
c. value > 0
d. value++ > 0

A6

×a. i > 0
   publicなメソッドの引数は、assertでチェックすべきでない。
   引数が不正の場合は、IllegalArgumentException、IndexOutOfBoundsException、NullPointerException等のRuntimeExceptionを発生させるべき。
×b. i++ > 0
   assert文は実行時に-eaオプションをつけないと実行されないため、
   assertの条件式に、変数の値が変更するような式を書くとアサーションのON/OFFで実行結果が変わってしまうため、NG。
○c. value > 0
   privateなインスタンス変数の値チェックはassert利用の一例。
×d. value++ > 0
   assert条件式に、変数の値を変更するような式を書くのはNG。


goto [J2SE1.4] INDEX

Top|Next »

HOME

05 | 2008/06 | 07
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -

QR

name:
mail:
title:
body:

N/A