次の実験プログラムとその実行結果を確認ください。
public class Test{ public static String s = "ABC"; public static void main(String[] arg){ String []a = new String[] { "ABC" , "123"}; System.out.println(s == "ABC"); System.out.println(a[0] == "ABC"); System.out.println(Test2.func() == "ABC"); Test2.main(new String[] { "ABC", "XYZ" }); } } class Test2{ public static String func() { return "ABC"; } public static void main(String[] arg){ System.out.println(arg[0] == "ABC"); } }
Z:\test>java Test true true true true
"ABC"とたくさん書いていますが全ての==の判定でtrueになっています。
これは何を意味するのでしょうか?
文字列は参照型なので、それの==は 左右が同じオブジェクトを参照しているかの判定になります。
よってこれは、同じ文字列の定数が同じ記憶域になっていることを意味しています。
このようにJavaでは、異なるクラスに書いたものでも、同じ文字並びの文字列の定数を同一の記憶域にすることで、
メモリリソースを余計に使わないように作られています。
しかし キー入力した文字列や演算で作られた文字列、そしてコンストラクタで生成した文字列は、当然ながら異なる記憶域になります。
(異なるオブジェクトになります。)よって、次の2つの出力は、falseの出力になります。
String s = "AB";
s += "C";//連結して、"ABC"にする。
System.out.println(s == "ABC");
s = new String("ABC");
System.out.println(s == "ABC");
上記のsが参照している文字列が、"ABC"の文字並びと一致してしているかを調べるには、
==の「同じオブジェクトを参照しているか?」の方法ではなく、
compreToまたは、equalsなどのメソッドを使うことになります。次の2つの出力は、trueの出力になります。
String s = "AB";
s += "C";//連結して、"ABC"にする。
System.out.println( compreTo.equals("ABC") == 0 );
s = new String("ABC");
System.out.println( s.equals("ABC") );
なお、上記のnew String("ABC")は、文字列を引数にしたコンストラクタですが、 Stringクラスには 次のように たくさんのコンストラクタが存在します。(もっとありますが主なものです)
コンストラクタ引数 | 概要 | 例 |
---|---|---|
なし |
"" の空文字列生成 |
String s = String(); |
文字列 |
引数と同じ並び |
String s = new String("123abc"); |
文字の配列 |
引数の配列に並ぶ文字で |
char []a = new char[] { 'A', 'あ', 'B', 'C' }; |
byte配列 |
引数のbyte配列で |
byte []a = new byte [] {65,-126,-96,66,67}; |
byte配列と |
引数のbyte配列、 |
byte []a = new byte [] {65, -92, -94, 66, 67}; |
main最後のSystem.out.printlnでtrueを表示するように完成させましょう。
public class EqualsArray{ public static boolean equals(String[] a, String[] b){ if (a.length b.length) return false;//一致しない for (int i = 0; i < ; i++){ if ( ) return false; } ;// 一致 } public static void main(String[] arg){ String[] a = { new String("abc"), new String("12"), new String("wxyz") }; String[] b = { "abc","12","wxyz"}; System.out.println(equals(a, b));//trueを表示する } }
←全ての『未選択』の箇所を正しく選択してから評価ボタンをクリックしてください