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。也许我只是在粘贴到答案中的代码块中添加了最后的限定符。我更正了我的回答,并感谢你的贡献。