今日の学習 演算子回り
▼オペラント・・・演算対象となる変数やリテラルのこと
▼String型の変数に対し、==演算子を使用した場合
- 文字列宣言の仕方によって結果が異なる
- 「String s2 = new String("Hallo");」のようにString型の文字列をnewキーワードを使用して作成するとnewキーワードを使って文字列を作成して、個別に文字列が作成される。newを使用していない場合は、プール上に同じ文字列がすでに存在していれば、既存の文字列を参照
- 参照先が同じときにはtrueとなるが、参照先が異なればfalseとなるため、文字列の比較において保持する内容が同じかどうかの比較はequals()メソッドを使用するとよい
▼internメソッド
internメソッドが呼び出されたときに、equals(Object)メソッドによってこのStringオブジェクトに等しいと判定される文字列がプールにすでにあった場合は、プール内の該当する文字列が返される。
同一内容の文字列なら、プールにあるものを使う。すなわち、メモリ領域の節約という観点からでは、intern()を使えば、効果的なのではと考えられる
▼StringとStringBuilderでの注意点
- 参照している文字列に+演算子を使用して文字列結合をした場合、Stringクラスが保持している文字列を書き換えることはできないから、新たに文字列が生成される
- concat()メソッドも同様の振る舞い
- しかし、StringBuilderクラスのappendメソッドを使用すると、appendメソッドは、既存のStringBuilder型の変数が参照する文字列に対し追加(更新される)を行うため、新に文字列が作成されることがない。
ex1)
String s1 = "X";
String s2 = s1 + "Y";
ex2)
String s3 = "X";
String s4 = s3.concat("Y");
ex3)
StringBuilder s5 = new StringBuilder("X");
StringBuilder s6= s5.append("Y");
⇒s1="X", s2="XY", s3="X", s4="XY", s5="XY"(更新されている), s6="XY"(s5==s6)
▼nullについて
int array1 = null;
int array2 = new int[1];
System.out.println(array1 != null);
System.out.println(array2 != null);
⇒false
true
point)
- array1は配列の宣言のみで領域の確保が行われていない
- array2配列は領域の確保が行われている
▼暗黙型型変換
byte ⇒ short ⇒ int ⇒ long ⇒ float ⇒ double
char ⇒ int ⇒ long…
- 型変換で算術演算子を使用している場合は注意が必要
- インクリメント(デクリメント)を使用している場合は型変換が行われないため問題ない
- 一方、オペラントがdouble型である場合、演算前に他方のオペラントはdouble型に変換される
- 一方のオペラントがfloat型であり他方のオペラントがdouble型ではない場合、演算前に他方のオペラントはfloat型に変換される
- 一方のオペラントがlong型であり他方のオペラントがfloat型、double型ではない場合、演算前に他方のオペラントはlong型に変換される
- 両方のオペラントがlong型、float型、double型のいずれでもない場合、演算前に双方のオペランドはint型に変換される
(double>float>long>int)
▼ラッパークラスとBoxing/Unboxing
- 基本データ型の値を参照型として扱う専用のクラスがあり、それをラッパークラスという。また、基本データ型とラッパークラス間の変換は自動で行われる。
- 基本データ型からラッパークラスへの自動変換をBoxingと呼び、ラッパークラスから基本データ型への自動変換をUnboxingと呼ぶ。
- なお、Boxingでは暗黙の型変換は行われない。
double d1 = 10; //OK:基本データ型の暗黙の型変換
Double d2 = 10; //NG:コンパイルエラー
▼switch文の式の結果は、データ型としてbyte、char、short、int、およびそのラッパークラス、enum、Stringのいずれかのデータ型の値である必要がある。
▼StringBuilderクラスで文字列内の文字を削除するには、delete()メソッドを使用。delete()メソッドは第1引数で指定された位置から第2引数で指定されたインデックスの一つ前までの文字を削除する。
▼+演算子で文字列の連結を行うことは可能だが、-演算子で文字列操作をすることはできない(コンパイルエラー)。