2

指定された文字列が回文かどうかを確認するコードを作成しました。しかし、ここでは String オブジェクトを明示的に作成しませんでした。明示的に作成しない場合、「==」も文字列を比較するために機能するはずです。しかし、ここで == を使用すると正しい出力が得られません。私の質問を明確にするために、以下にも別のコードを示しました

コード 1:ここ。「==」が機能していません。

class Palindrome 
{
    public static void main(String[] args) 
    {

        StringBuffer sb1=new StringBuffer();
        sb1.append("anna");
        String s1=sb1.toString();
        StringBuffer sb2=new StringBuffer();
        sb2=sb1.reverse();
        String s2=sb2.toString();
        if(s1.equals(s2))
        {
            System.out.println("The given String is a Palindrome");
        }
        else

            System.out.println("Not a Palindrome");

    }
}

コード 2: ここで == が機能します

class Stringdemo 
{
    public static void main(String[] args) 
    {
        String str1="hello";
        String str2="hello";
        if(str1==str2)
        {
            System.out.println("both strings are same");
        }
        else
        {
            System.out.println("both strings are not Same");
        }
    }
}
4

5 に答える 5

6

StringBuilder/Buffer.toString() を使用すると新しいインスタンスが作成されるため、 equals() が機能するのに == は機能しません。文字列リテラルを使用する場合、文字列リテラルであるすべての文字列がクラスの定数プールに追加されるため、string1 と string2 は単に "hello" の定数プール内の同じ参照を指します。したがって ==それらは同じ参照であるため、真と言えます。

于 2012-06-07T16:42:23.830 に答える
3

「==」はオブジェクト参照値を比較し、「equals()」はオブジェクトの内容を比較します。「==」は、プリミティブを比較する場合にのみ役立ちます。

「sb2.toString()」を呼び出すと、新しい参照値を持つ新しいオブジェクトが作成されます。

于 2012-06-07T16:41:55.920 に答える
2

sb2.toString();新しい文字列を作成します。== ここでは機能しません

ただし、sb2.toString().intern()代わりに使用すると機能します

于 2012-06-07T16:41:44.193 に答える
1

== は、オブジェクトの同一性 (つまり、同じメモリ アドレス) をチェックします。

. equals() は、値が等しいかどうかをチェックします。

新しい文字列リテラルを作成する場合:

 String str1="hello";
 String str2="hello";

Java は String.intern() メソッドを呼び出して新しい String をインターンしますが、最初に同じ String 値が存在するかどうかを確認し、存在する場合はそれを返します (つまり、新しいインスタンスを作成しません)。詳細については、String.intern() に関する Javadoc コメントを参照してください。

intern メソッドが呼び出されたときに、equals(Object) メソッドによって決定されたこの String オブジェクトと等しい文字列がプールにすでに含まれている場合、プールからの文字列が返されます。それ以外の場合は、この String オブジェクトがプールに追加され、この String オブジェクトへの参照が返されます。

これが 2 番目の例が機能する理由ですが、sb2.toString を呼び出すと intern() をバイパスして新しいインスタンスが作成されるため、StringBuilder の例は機能しません。

安全のために、非プリミティブ オブジェクトには .equals() を使用することをお勧めします。

于 2012-06-07T16:56:02.917 に答える
0

==演算子はobject's参照をチェックするだけで、その文字を個別にequals()比較します。strings

不変Stringオブジェクトであるため、オブジェクトが既にメモリ内に作成されている場合、オブジェクトの参照を共有します。

したがって、

String str1 = "hello"; //and
String str2 = "hello"; //are equal

と の両方が の同じ参照str1str2共有しているためです"hello"

于 2012-06-07T16:42:38.233 に答える