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 减少了一个,但它删除了哪一个?它会删除最后插入的还是最早插入的?

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()被记录为添加到列表的末尾,并且List#remove(Object)被记录为返回它遇到的第一个匹配项,因此您上面的调用将删除最早插入的字符串“hi”实例。

由于列表中三个对象的打印表示都是相同的,因此很难看出行为上的差异。但是,如果您在调试器中查看实例地址,并注意哪个首先进入列表,您将确认它也是第一个(也是唯一一个)要删除的地址。

在您的情况下,鉴于您使用的是字符串文字,它们由编译器(根据JLS 的第 3.10.5 节)进行实习,因此您将在列表中看到三个相同的实例。为了产生不同的实例,请尝试将您的三个插入调用更改为以下内容:String

/* 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,那么这三个串联实际上都将被实习,产生相同的实例被添加到列表中三次。感谢@xehpuk 纠正了我最初关于最终预选赛的错误。h String

于 2011-12-04T19:56:20.953 回答
2

它将删除它遇到的第一个事件,所以你添加的第一个。

于 2011-12-04T19:55:55.830 回答