String補足(たくさんのコンストラクタ)

次の実験プログラムとその実行結果を確認ください。

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' };
String s = new String( a );

byte配列

引数のbyte配列で
システムデフォルト
のキャラクタセット
のオブジェクトを生成

byte []a = new byte [] {65,-126,-96,66,67};
String s = new String( a );
System.out.println(s);//AあBCを表示
(システムデフォルトがShift_JISの例)

byte配列と
範囲、
charset指定
(charset省略
もあります)

引数のbyte配列、
byte配列先頭添え字、
byte配列終了添え字、
キャラクタセット、
でオブジェクトを生成

byte []a = new byte [] {65, -92, -94, 66, 67};
String s = new String( a,1,3, "EUC_JP" );
System.out.println(s);//あBを表示
(例外処理の必要性があります)

次は、Stringの配列が一致するか判定するstaticメソッドです。

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を表示する
	}
}

←全ての『未選択』の箇所を正しく選択してから評価ボタンをクリックしてください