今日の学習 演算子回り

▼オペラント・・・演算対象となる変数やリテラルのこと

 

▼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引数で指定されたインデックスの一つ前までの文字を削除する。

 

▼+演算子で文字列の連結を行うことは可能だが、-演算子で文字列操作をすることはできない(コンパイルエラー)。