文字列はクラス java.lang.String 型のれっきとしたオブジェクトなのですが、頻繁に使うので、プリミティブ型と同様の記法も許されており、その場合は、equals() と == が、ある程度までは、同じ結果を返すような仕組みを持っています。
オブジェクトは、一般的には次の書式で生成(インスタンス化)します。
// 一般論
クラス名 変数名 = new クラス名(引数);// String型の場合
String str = new String("文字列");文字列は頻繁に使うために特例措置がなされていて、次のように二重引用符で文字列をくくると、自動的に String 型オブジェクトを生成してくれます。
String str = "文字列";この書式が通常のオブジェクト生成と異なるのは、ここで記述した文字列と等価な String 型オブジェクトが既に存在していれば、既存の String 型オブジェクトを参照する ID を代入するということです。内部的には次の手順が踏まれています。
1. 既存の文字列に同じものがないかどうか評価
2. もし既に存在していれば、既存のオブジェクトへの参照を代入
3. もし既存の文字列に等価なものが存在しなければ、新たに生成して、そのオブジェクトへの参照を代入
続きでサンプルをご覧ください...
■サンプル
文字列について、擬似プリミティブ型と、通常のインスタンス化の違いをハイライトするサンプルを紹介します。
StringTest.java:
class StringTest {
public static void main(String[] args) {
//擬似プリミティブ型
String str1 = "Hello";
String str2 = "Hello";
System.out.println("str1 == str2: " + (
str1 == str2));
//オブジェクト
String obj1 = new String("Hello");
String obj2 = new String("Hello");
System.out.println("obj1 == obj2: " + (
obj1 == obj2));
System.out.println("obj1.equals(obj2): " + (
obj1.equals(obj2)));
}
}
実行例:
C:\java>javac StringTest.java
C:\java>java StringTest
str1 == str2: true
obj1 == obj2: false
obj1.equals(obj2): true
擬似プリミティブ型で作った文字列オブジェクト str1/str2 の場合は、プリミティブ型と同様の意味で == で比較できます。これはオブジェクトとしては特殊なことです。文字列は頻繁に使うために、プリミティブ型と同様の操作性を確保するために採用された特例措置によるものです。
通常のオブジェクトの作成と同じ形式で作った文字列オブジェクト obj1/obj2 の場合は、 == では、保持している値自身が比較されるので、別のオブジェクトの参照同士を比較したことになり、 false が戻ります。 equals() では、参照しているオブジェクトの実体が比較されるので、今の場合は true が戻ります。
↓のボタンでこのブログの記事をランダムに表示します。
●Homeへ戻る●