0

重複の可能性:
Java String.equals と ==
の違い ".equals と ==" の違い

public String getName() {
    return new String("foobar");
}

if(getName() != "foobar2") {
    //Never gets executed, it should, wtf!.
}

if(!getName().equals("foobar2")) {
   //This works how it should.
}

ええ、私の質問は簡単です.. なぜaka ( )!=と同じように動作しないのですか?!equals()not Equals

どちらかが失敗する論理的な理由はわかりません。どちらも私の心の中ではまったく同じコードです、WTH。

Java オペレーターを見る http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

平等がはっきりわかる == !=

確かに、私は通常!=、数値に対してのみ使用します..しかし、私の心はさまよい始めました.なぜそれが機能しないのStringですか?

編集: これは実際の問題に似たものです..

    for (ClassGen cg : client.getClasses().values()) {
        final ConstantPoolGen cp = cg.getConstantPool();
        if(cp.lookupInteger(0x11223344) != -1) {
            for (Method m : cg.getMethods()) {  
                System.out.println("lots of class spam");
                if(m.getName() != "<init>") continue;
                System.out.println("NEVER GETS HERE, 100% SURE IT HAS CONSTRUCTOR LOL");
            }
        }
    }
4

4 に答える 4

1
public static void main(String[] args) throws Exception {

    if (getName() != "foobar2") {
        System.out.println("1");
    }

    if (!getName().equals("foobar2")) {
        System.out.println("2");
    }
}

public static String getName() {
    return new String("foobar");
}

私にとって、これは次の出力です。

1
2

しかし、これら2つのチェックは同等ではありません。最初のチェックは、getName()によって返されるオブジェクトが、文字列リテラル「foobar2」に対して作成されたオブジェクトと同じであるかどうかをチェックすることですが、そうではありません。2番目のチェックはおそらく必要なものであり、getName()メソッドによって返されるStringオブジェクトのVALUEが、「foobar2」文字列リテラル用に作成されたStringオブジェクトのVALUEと等しいことをチェックします。

したがって、両方のチェックがtrueを返します。最初のチェックは同じオブジェクトではないため、2番目のチェックは値が同じではないためです。

于 2011-08-16T00:10:12.867 に答える
0

演算子はオブジェクトではなくプリミティブにのみ適用されるためequals、オブジェクト レベルで動作するため、文字列比較を行う必要があります。

- 編集 -

私のコメントは、「オブジェクトの値は、他の言語のように期待される方法で比較することはできません」という意味でした。もちろん、== 記号を使用できますが、テキストの比較には使用できません。これは、誰かがスクリプト言語から Java に移行するたびに、または文字列のテキスト比較の演算子をサポートする別の言語に移行するたびに尋ねられる古典的な質問です。

于 2011-08-15T23:59:56.153 に答える
0

文字列はオブジェクトであり、プリミティブではありません。 ==2 つのプリミティブを!=互いに比較します。文字列を比較するには、各文字をループして順番に比較する必要があります.equals()

Java で OOP を実行する場合は、オブジェクトの等価性チェックを実行するときに equals をオーバーライドする必要があり、Comparable を実装し、.compare()並べ替えなどを実行できるようにする必要があります。

equals の簡単な例を次に示します。

public class Person {
    public name;

    public Person(String name) {
        this.name = name;
    }

    public boolean equals(Object o){
        if(o instanceof Person)
            if(this.name.equals(o.name))
                return true;
        return false;
    }
}

Person は、次のように別の Person と比較できます。

person1.equals(person2)

両方の人が同じ名前を持っている場合にのみ true を返します。2 つのオブジェクトを等しくするものは自由に定義できますが、オブジェクトは、==実際にはメモリ内の同じオブジェクトへの 2 つのポインターにすぎない場合にのみ存在します。

于 2011-08-16T00:01:16.153 に答える