1回参考書を読んで、2回目に問題を解いてつまずいたところ

Javaの予約語

const,gotoは、Javaの予約語だが、機能は定義されていない

Javaの識別子

[_$a-zA-Z][_$a-zA-Z0-9]*

Javaの整数型の値の範囲(byte,short,int,long)

マイナスの方が一つ多い

byte  :                 -128 <-> 127
short :               -32768 <-> 32767
int   :          -2147483648 <-> 2147483647
long  : -9223372036854775808 <-> 9223372036854775807
 
理屈:2の補数表現 => 引き算を足し算で出来るようにしたい
                  => 絶対値の同じマイナスの値とプラスの値を足すとオーバーフローして0になるようにすればいい
                  => -1倍するには、ビット反転して00000001Bを足せばいい
                  => 行きがかり上10000000Bが余る
                  => マイナスの方が一つ多い
byte型
                 -128(10000000B)
127(01111111B) + -127(10000001B) = 0(00000000B)
126(01111110B) + -127(10000010B) = 0(00000000B)
              ...
  1(00000001B) +   -1(11111111B) = 0(00000000B)
  0(00000000B)

Char型の範囲

0<->65535

コマンドライン引数

C言語との違いに注意

> java aaa   bbb     ccc     ddd     eee
       クラス名 args[0] args[1] args[2] args[3]

シフト演算子

<<  左シフト

>>  右シフト( 0100 >> 2 → 0001 )
            ( 1000 >> 2 → 1110 ) MSBが1の時1が充填される(=負数の1/(2^n)倍)

>>> 右シフト( 0100 >>> 2 → 0001 )
            ( 1000 >>> 2 → 0010 ) 1が充填されない
 

※シフトされるのは n%32 bit

論理演算子

&& で前半がfalseなら後半は評価されない

int a=1
int b=1
if( (a++ == 2) && (++b == 2) ){
  a=10
}
// ここでは、a=2 b=1

||で前半がtrueになるときも同様

int a=1
int b=1
if( (a++ == 1) || (++b == 2) ){
  a=10
}
// ここでは、a=10 b=1

ビット演算

& AND
| OR
^ XOR <--忘れがち

演算子の優先順位

[ ] .x++ x-- 
++x --x +x ~ ! 
new (型)x 
* / % 
+ - 
<< >> >>> 
< > <= >= instanceof 
== != 
& 
^ 
| 
&& 
|| 
? : 
= += -= *= /= %= &= ^= |= <<= >>= >>>= 

Switch()の()の中身

int型 => int型に暗黙キャストできる byte short char も可

ループのラベル

label:
    while(...){
        for(...){
            if(...){
                break label;
            }else if(...){
                continue label;
            }
            ...
        }
    }

メンバ変数の初期値

byte    (byte)0
short   (short)0
int     0
long    0L
float   0.0F
double  0.0 (=0.0D)
char    \u0000
boolean false       <---- 重要
参照型  null
 

☆ローカル変数は初期化されない
☆配列はメンバ変数・ローカル変数ともに初期化される

アクセス修飾子

public    どこからでもアクセス可
protected パッケージ内と子クラスからのみアクセス可
なし      パッケージ内からのみアクセス可
private   クラス内からにみアクセス可

アクセス修飾子以外の修飾子

final
abstract
native       JNI
synchronized メソッド・ブロックの同期化
volatile     メンバ変数の同期化
transit      Serializeしない
strictfp     float,doubleの修飾子。演算でFPUを使わない。厳密な浮動小数点演算を行いたいとき。

オーバーライト時の修飾子

メソッド・メンバ変数は広く
例外は狭く

どのオーバーライトされたメソッド・メンバ変数が使われるか?

参照の型がどうであろうと、newされたときのメソッド・メンバ変数が使われる。

インタフェースの暗黙のアクセス修飾子

メンバ変数  public final static
メソッド    public abstract

→継承先では、publicのみ(オーバーライト時の修飾子:メソッド・メンバ変数は広く)

Throwableの継承関係と代表例

Object
 |
 +--Throwable
     |
     +-- Error     -- AssertionError,VirtualMachineError etc.
     |                ^^^^^^^^^^^^^^
     +-- Exception -- IOException,InterruptedException etc.
          |
          +-- RuntimeException -- ArithmetricException,SecurityException,
                                  ArrayIndexOutOfBoundException etc.

Throwableのcatch/Throws

catchする必要があるのは、Exceptionだけ。
Error,RuntimeExceptionは、catchする必要はない。

Assertのコンパイルと実行

> javac -source assertSample.java
> java -ec assertSample

Assertの引っかけ問題

assert 条件式;
assert 条件式 : メッセージ;
assert a==b ? false : true;    <-- booleanを返す三項演算子
assert a==b ? "false" : "true" <-- コンパイルエラー

Math

Math.abs()
Math.max()
Math.min()

long   Math.round()  <--小数点以下四捨五入
double Math.rint()   <--小数点以下四捨五入
double Math.ceil()   <--天井。Math.ceil(1.5)=2.0
double Math.floow()  <--床。  Math.ceil(1.5)=1.0

double Math.random() <-- 0.0以上1.0未満
double Math.sqrt()   <-- Math.sqrt(-1)=NaN

String

Stringに関するどんな操作もオブジェクトの生成を伴うことを注意

知らなかったメソッド:
String.toUpperCase() <--大文字化(した新たなStringを作成)
String.toLowerCase() <--小文字化(した新たなStringを作成)
String.trim()        <--前後の空白を削除(した新たなStringを作成)
String.concat(String str) <--文字列の連結(した新たなStringを作成)

String.hashCode()

Object.hashCode() オブジェクトのハッシュ値(int型)
String.hashCode() 保持している文字列のハッシュ値(int型)
Object.equals() 参照が同じかどうかを確かめる。
String.equals() 内容が同じかどうかを確かめる。

★Stringの場合、ハッシュ値が衝突する可能性があることに注意

  1. String.equals()がfalseでもハッシュ値が同じになる場合がある
    • 二つのStringが保持している違う内容の文字列が、同一のハッシュ値を持つ
  2. 参照が違ってもハッシュ値が同じになる場合がある
    • 二つのStringが、同じ内容の文字列を持っている場合

Collection

java.util.Collection
 |
 +--Set
 |
 +--List
     |
     +-- ArrayList   null可。同期化されていない
     +-- LinkedList  null可。同期化されていない
     +-- Vector      null可。同期化
     +-- Stack       null可。同期化されていない

java.util.AbstractMap
 |
 +--Hashtable        nullキー不可。null値不可。同期化
 |   |
 |   +--Properties
 |
 +--HashMap          nullキー可能。null値可能。同期化されていない
引っかけ
×どのような型でも入れられる => プリミティブ型は入れられないので×
×エレメントはObject型なので、String型を格納していても取り出してすぐ
  キャストせずに+で接続できない(コンパイルエラー)。

インナークラスの制約

  1. 外部クラスと同じクラス名は不可
  2. Staticメンバは不可

インナークラスのさわれるもの

  1. Staticインナークラスのさわれるもの
    • ○ 外部クラスのStaticメンバ変数
  2. インスタンスインナークラスのさわれるもの
    • ○ 外部クラスのメンバ変数
  3. ローカルクラスがさわれるもの
    • ○ 外部クラスのメンバ変数
    • ○ メソッド内のfinalローカル変数
    • × メソッド内のローカル変数

Threadのstaticメソッド

  1. sleep()
  2. yield()

Threadの割り込み

Thread.interrupt()で、InterruptedExceptionが発生する。

Threadに名前を付ける

class Foo extends Thread{
}

Foo th1 = new Foo( "Thread-1" );
Foo th2 = new Foo();
th2.setName( "Thread-2" );

Threadの状態

■■■■■■■実行状態■■■■■■■
   ↓          ↓↑  
■待機状態■−−−→■実行可能状態■

Threadの優先順位

setPriority(int)

Thread.MIN_PRIORITY  = 0
Thread.NORM_PRIORITY = 5
Thread.MAX_PRIORITY  = 10

★スレッドの初期優先順位は、機動元の優先順位を引き継ぐので
 Thread.NORM_PRIORITYとは限らないことに注意

JavaVMの終了

すべてのスレッドが終了するとJavaVMが終了する。
mainスレッドが終了してもスレッドが残っていればJavaVMが終了しないことに注意。

同期化の仕組み

オブジェクトはロックフラグを1つ持っており、
スレッドはロックフラグのたっているオブジェクトを使うことが出来ない。

あるスレッドが
 synchronizedメソッド
 volatileメンバ変数
 synchronizedブロック( synchronized( obj ){ ... } )
に入ると該当するオブジェクトのロックフラグをたてる。

別のスレッドが同じオブジェクトを使おうとしても、ロックフラグがたっているので
ロックしているスレッドの処理が終わるまで待機状態になる。

Object.wait()

  1. Objectのロックフラグ(実行権限)を持っているスレッドが、別のスレッドにロックフラグ(実行権限)を譲るときに使う
  2. 待ち時間を指定できる
  3. スレッドがObjectのロックフラグを取得している必要がある
    1. つまり、synchronizedメソッドか、synchronizedブロック内でしか使えない
    2. 普通のメソッドで使うとIllegalMonitorStateExceptinが発生する
      • こいつはRuntimeExceptionなので、コンパイル時にはエラーは出ずに、実行時に出る。

Object.notify() , Object.notifyAll()

  1. 別のスレッドからObject.wait()によって、ロックフラグ(実行権限)を譲ってもらったスレッドが、ロックフラグ(実行権限)を返却するときにつかう。
  2. こいつを発行するときもスレッドがObjectのロックフラグを取得している必要がある
    1. つまり、synchronizedメソッドか、synchronizedブロック内でしか使えない
    2. 普通のメソッドで使うとIllegalMonitorStateExceptinが発生する
      • こいつはRuntimeExceptionなので、コンパイル時にはエラーは出ずに、実行時に出る。

Computer


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2006-02-13 (月) 23:35:28 (3952d)
ISBN10
ISBN13
9784061426061