String基本

class StringDump {
public static void main(String[] args) {
String str = "問題の発生している文字列";
System.out.println(str);
char[] buf = str.toCharArray();
for (int i = 0; i < buf.length; i++) {
System.out.print(Integer.toString(buf[i], 16) + " ");
//Integer.toString(buf[i], 16).toUpperCase()
}
}
}

/*
>>javac StringDump.java
>>java StringDump

問題の発生している文字列
554f 984c 306e 767a 751f 3057 3066 3044 308b 6587 5b57 5217

>>


カノニカライゼーション
一般に、メソッド equals() が true を返す等価なオブジェクトを、演算子 == が true
を返す一意なオブジェクトで置き換えることを、カノニカライゼーション (Canonicalization)
と呼びます。オブジェクトの種類ごとに生成されるインスタンスの個数を一つに制限するので、
インスタンス化の回数を減らし、データの一意化を促します。
String 型オブジェクトの生成は、JVMの実行時コンスタント・プール
で低レベルに実装されているものの一つです。
事象
次のコードでは、同じ文字列オブジェクトが参照されます。
String str1 = "Hello";
String str2 = "Hello"; // str1 == str2 is true

次のコードは別の文字列オブジェクトを生成して参照します。
String str1 = "Hello";
String str2 = new String("Hello"); // str1 == str2 is false

str1 == str2 は、前者の例では true を返しますが、後者の例では false を返します。== は変数に代入されている値を比較するものなので、別のオブジェクトへの参照を保持していれば、false が返るのです。文字列オブジェクトに保持されている文字列が等価であることを評価する場合は equals() を使います。次のコードは、いずれの場合でも true を返します。
boolean bln = str1.equals(str2); // bln is true

class CanonicalStringDemo {
public static void main(String[] args) {
String str1 = args[0];
String str2 = "こんにちは";
String str3 = new String("こんにちは");

// 非カノニカル表現
System.out.println("Not Canonical representation:");
System.out.println("\t" + (str1 == str2));
System.out.println("\t" + (str1 == str3));

// カノニカル表現
System.out.println("Canonical representation:");
System.out.println("\t" + (str1.intern() == str2.intern()));
System.out.println("\t" + (str1.intern() == str3.intern()));
}
}


>javac CanonicalStringDemo.java
>java CanonicalStringDemo "こんにちは"
Not Canonical representation:
false
false
Canonical representation:
true
true
*/

0 コメント: