Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-ArrayList删除重复项_Java_Collections_Scjp_Ocpjp - Fatal编程技术网

Java-ArrayList删除重复项

Java-ArrayList删除重复项,java,collections,scjp,ocpjp,Java,Collections,Scjp,Ocpjp,在以下示例中: 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);

在以下示例中:

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]

}
publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
列表。添加(“hi”);
列表。添加(“hi”);
列表。添加(“hi”);
列表。删除(“hi”);
System.out.println(list);//prints[hi,hi]
}

ArrayList减少了一个,但删除了哪一个?它是删除最后插入的还是最早插入的

从-
中删除此列表中指定元素的第一个匹配项(如果存在)。
它将删除它遇到的第一个匹配项,因此是您添加的第一个匹配项。

因为被记录为添加到列表的末尾,并且被记录为返回它遇到的第一个匹配项,上面的调用将删除字符串“hi”的最早插入实例

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

在您的例子中,如果您使用的是字符串文本,那么编译器(per)会将它们插入,因此您将在列表中看到三个相同的实例。为了生成不同的
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
实例
h
被声明为final,那么这三个连接实际上都将被插入,从而产生相同的
String
实例三次添加到列表中。感谢@xehpuk纠正了我关于最终限定符的初始错误。

请注意,这是所有
List
s的属性,而不仅仅是
ArrayList
:您可以使用不同的列表元素自己测试这一点。你测试过你的代码吗?他们确实被拘留了,因为
最终版
允许编译器将
h
替换为
“h”
,所以同一个字符串实例有三个引用。在我发布答案之前,我测试了代码,这促使我写最后两段。听起来你看到了一些不同的东西。我今天将再次测试,并报告我的发现。今天再次测试,我发现你是正确的,@xehpuk。也许我只是在粘贴到答案中的代码块中添加了最后的限定符。我更正了我的回答,并感谢你的贡献。