次のような状況があります。キーを文字列として持つJavaのHashMapがあります。次に、ある段階で、実行時に、そのマップからデータを取得するために、これらのキーに等しい文字列を作成します。文字列は、「for」ループ内で次のように作成されます。
String keyToRetrive = "lights[" + Integer.toString(i) + "]" + ".Intensity";
奇妙なことは、マップを反復してその文字列に等しいキーを見つけると、一致が見つかった場合でも検索がステップオーバーすることです。したがって、この検索ループでは:
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
if (name == entry.getKey()) { ///name- "lights[0].Intesity"
uniformOut = (ICleanable) entry.getValue();
break;
}
}
「lights[0].Intesity」という名前のキーは、マップに含まれている場合でもtrueを返すことはありません.どのように解決したか.比較された両方の文字列値にhashCode()を使用しました.したがって、このバージョンは機能します:
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
if (name.hashCode() == entry.getKey().hashCode()) {
uniformOut = (ICleanable) entry.getValue();
break;
}
}
更新: 「==」がうまく機能せず、「equals()」を使用する必要があるという事実を指摘された後、質問を絞り込みたいと思います:連結ブロック?つまり、比較するキー文字列を単純な単一の文字列として定義すると、次のようになります。
String foo="foo";
このような文字列は、「==」を使用して HashMap キーと比較されます。
私は専門の Java プログラマーではないので、なぜこのように動作するのか誰か説明できますか?