はリストの最後List#add()
に追加するように文書化されており、最初に一致するアイテムを返すように文書化されているため、上記の呼び出しは文字列「hi」の最初に挿入されたインスタンスを削除します。List#remove(Object)
リスト内の3つのオブジェクトの印刷された表現はすべて同じであるため、動作の違いを確認するのは困難です。ただし、デバッガーでインスタンスアドレスを確認し、リストに最初に入力されたのはどれかを確認すると、それが最初に削除される唯一のアドレスでもあることが確認できます。
あなたの場合、文字列リテラルを使用しているとすると、それらはコンパイラによってインターンされます( JLSの§3.10.5に従って)。したがって、同じインスタンスが3つリストに表示されます。個別のString
インスタンスを生成するには、3つの挿入呼び出しを次のように変更してみてください。
/* not final */ String h = "h";
list.add(h + "i"); // not interned, instance 1
list.add(h + "i"); // not interned, instance 2
list.add(h + "i"); // not interned, instance 3
これらのステートメントを使用してデバッガーに表示される内容を元のプログラムと比較します。違いがわかりますか?
上記のString
インスタンスがfinalとして宣言されている場合、3つの連結は実際にはすべてインターンされ、同じインスタンスが3回リストに追加されることに注意してください。最終予選に関する私の最初の間違いを訂正してくれた@xehpukに感謝します。h
String