0

ArrayList を作成し、そのスロットを埋めました。

ArrayList<String> tempTable = new ArrayList<String>();

tempTable.add("1");
tempTable.add("12");
tempTable.add("2");
tempTable.add("11");
tempTable.add("5");

ここで、いくつかの値を置き換えたいので、条件を作成しました。

for (int i = 0; i < tempTable.size(); i++)
{
    if (tempTable.get(i) == "11")
    {
        tempTable.set(i, "1st FBS");
    }
    else if (tempTable.get(i) == "12")
    {
        tempTable.set(i, "2nd FBS");
    }
    else if (tempTable.get(i) == "13")
    {
        tempTable.set(i, "3rd FBS");
    }
    else
    {
        // leave as is
    }
}

実行すると、元の値が変更されないため、11 と 12 が置き換えられる代わりに、1、12、2、11、5 が出力されます。ArrayList でテストを行い、動作しましたが、この場合、思い通りに動作させることができません。

私のコードで間違っている可能性のあるヒントはありますか?

4

2 に答える 2

4

文字列の比較には、== の代わりに string equals() を使用します。As equals はコンテンツを比較し、== は参照が同じメモリ位置を指しているかどうかをチェックします。

コードは次のようになります。

for (int i = 0; i < tempTable.size(); i++)
{
    if ("11".equals(tempTable.get(i)))
    {
        tempTable.set(i, "1st FBS");
    }
    else if ("12".equals(tempTable.get(i)))
    {
        tempTable.set(i, "2nd FBS");
    }
    else if ("13".equals(tempTable.get(i)))
    {
        tempTable.set(i, "3rd FBS");
    }
    else
    {
        // leave as is
    }
}
于 2013-06-08T14:39:31.283 に答える
4

equals()Java では、文字列の等価性をテストするために使用する必要があります。

if ("11".equals(tempTable.get(i))) 
{
    tempTable.set(i, "1st FBS");
}

== on objects は、参照の等価性をテストする演算子です。つまり、2 つの参照 (「変数」) がメモリ内の同じインスタンスを指しているということです。

== は文字列でも機能する可能性があります。これは、リテラル文字列が jvm によってキャッシュおよびプリロードされるためですが、動的に作成された文字列は、テキストの内容が同じであっても別のオブジェクトになります。たとえば、コマンド ラインから文字列を読み取る場合、同じ文字を 2 回入力してもStringインスタンスは異なります。

誰かが他の回答へのコメントで指摘したように、文字列をリテラルと比較する通常の方法は次のとおりです。

"literal".equals(ref)

これは、リテラル文字列でメソッドを呼び出すと NullPointerException がスローされることはなくfalse、ref が null の場合に返されるためです。

于 2013-06-08T14:40:50.710 に答える