9

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

az DBOpenHelper extends SQLOpenHelper class でメソッドを作成しようとしています。DBに同じ名前のエントリがあるかどうかを評価するはずです。

public boolean existsContact(Contact contact) {

    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {

            String name = cursor.getString(1);
            String cname = contact.getName();
            if (name == cname) {

                cursor.close();
                db.close();
                return true;
            }

        } while (cursor.moveToNext());
    }

    db.close();

    return false;
}

Contact クラスの関連部分は次のとおりです。

 public class Contact {

    String _name;
    public String getName(){
        return this._name;
    }
    }

ここに奇妙なことがあります:

シナリオ A :と が false にif (name == cname)等しい 場合。Eclipse デバッガーは、名前の foo と cname の foo の ID が異なります。コードで前に見たように、両方の変数が埋められました。name = "foo"cname = "foo"

シナリオ B:if(name == cname)変数は次のようにロードされます。

String name = "foo";
String cname = "foo";
         statement equals true as it's supposed to.

シナリオ C: if("foo" == "foo")true に等しい...しかし...デバッガーが窓の外に出ます。LogCat はデバッガーが接続されていることを示していますが、Eclipse のデバッグ パースペクティブにはアクティビティがありません。ブレークポイントは効果がありません。スレッドが表示されません。

4

3 に答える 3

40

Java では、==2 つのオブジェクトで使用する場合、実際には文字列自体を比較していません。を使用する必要があります.equals(String)

==実際には、値ではなく、2 つのオブジェクトの参照を比較します。

string1.equals(String target)文字列内の実際の文字に基づいて 2 つの文字列を比較します。

参照: http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html

于 2012-12-19T02:47:28.190 に答える
8

== 演算子チェック オブジェクト参照は等しいかどうかですが、equals() メソッドのチェック値は同じかどうか

    if (name == cname) 
   {    
    cursor.close();
    db.close();
    return true;
  }

それと変わる

 if (name.equals(cname)){        
    cursor.close();
    db.close();
   return true;
}
于 2012-12-19T02:49:02.933 に答える
2

When comparing objects in java that are not primitive data types (int, char, boolean, etc...), you have to use the method Object#equals(Object), which returns a boolean.

So, when you are comparing two Strings, you are actually checking if the two Objects are the same instance, instead of the actual value.

All you have to do is just change name == cname to name.equals(cname).

于 2012-12-19T02:56:27.800 に答える