1回参考書を読んで、2回目に問題を解いてつまずいたところ
const,gotoは、Javaの予約語だが、機能は定義されていない
[_$a-zA-Z][_$a-zA-Z0-9]*
マイナスの方が一つ多い
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)
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 == != & ^ | && || ? : = += -= *= /= %= &= ^= |= <<= >>= >>>=
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のみ(オーバーライト時の修飾子:メソッド・メンバ変数は広く)
Object | +--Throwable | +-- Error -- AssertionError,VirtualMachineError etc. | ^^^^^^^^^^^^^^ +-- Exception -- IOException,InterruptedException etc. | +-- RuntimeException -- ArithmetricException,SecurityException, ArrayIndexOutOfBoundException etc.
catchする必要があるのは、Exceptionだけ。
Error,RuntimeExceptionは、catchする必要はない。
> javac -source assertSample.java > java -ec assertSample
assert 条件式; assert 条件式 : メッセージ; assert a==b ? false : true; <-- booleanを返す三項演算子 assert a==b ? "false" : "true" <-- コンパイルエラー
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.toUpperCase() <--大文字化(した新たなStringを作成) String.toLowerCase() <--小文字化(した新たなStringを作成) String.trim() <--前後の空白を削除(した新たなStringを作成) String.concat(String str) <--文字列の連結(した新たなStringを作成)
Object.hashCode() オブジェクトのハッシュ値(int型) String.hashCode() 保持している文字列のハッシュ値(int型)
Object.equals() 参照が同じかどうかを確かめる。 String.equals() 内容が同じかどうかを確かめる。
★Stringの場合、ハッシュ値が衝突する可能性があることに注意
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型を格納していても取り出してすぐ キャストせずに+で接続できない(コンパイルエラー)。
Thread.interrupt()で、InterruptedExceptionが発生する。
class Foo extends Thread{ } Foo th1 = new Foo( "Thread-1" ); Foo th2 = new Foo(); th2.setName( "Thread-2" );
■■■■■■■実行状態■■■■■■■ ↓ ↓↑ ■待機状態■−−−→■実行可能状態■
setPriority(int) Thread.MIN_PRIORITY = 0 Thread.NORM_PRIORITY = 5 Thread.MAX_PRIORITY = 10 ★スレッドの初期優先順位は、機動元の優先順位を引き継ぐので Thread.NORM_PRIORITYとは限らないことに注意
すべてのスレッドが終了するとJavaVMが終了する。 mainスレッドが終了してもスレッドが残っていればJavaVMが終了しないことに注意。
オブジェクトはロックフラグを1つ持っており、 スレッドはロックフラグのたっているオブジェクトを使うことが出来ない。 あるスレッドが synchronizedメソッド volatileメンバ変数 synchronizedブロック( synchronized( obj ){ ... } ) に入ると該当するオブジェクトのロックフラグをたてる。 別のスレッドが同じオブジェクトを使おうとしても、ロックフラグがたっているので ロックしているスレッドの処理が終わるまで待機状態になる。