0

次の例では:

public static void main(String[] args){

        List<String> list = new ArrayList<String>();

        list.add("hi");
        list.add("hi");
        list.add("hi");

        list.remove("hi");

        System.out.println(list); //prints [hi, hi]

}

ArrayListは1つ減りますが、どれを削除しますか?最後に挿入されたもの、または最初に挿入されたものを削除しますか?

4

3 に答える 3

7

ドキュメントから-Removes the first occurrence of the specified element from this list, if it is present.

于 2011-12-04T19:53:39.970 に答える
4

はリストの最後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

于 2011-12-04T19:56:20.953 に答える
2

最初に発生したものが削除されるため、最初に追加したものが削除されます。

于 2011-12-04T19:55:55.830 に答える