gpt4 book ai didi

java - ArrayList.remove 在称为 Collection.remove 时会给出不同的结果

转载 作者:IT老高 更新时间:2023-10-28 20:50:44 29 4
gpt4 key购买 nike

这段代码:

    Collection<String> col = new ArrayList<String>();    
col.add("a");
col.add("b");
col.add("c");
for(String s: col){
if(s.equals("b"))
col.remove(1);
System.out.print(s);

}

打印:abc

同时这个:

    ArrayList<String> col = new ArrayList<String>();    
col.add("a");
col.add("b");
col.add("c");
for(String s: col){
if(s.equals("b"))
col.remove(1);
System.out.print(s);

}

打印:ab

但是它应该打印相同的结果...有什么问题?

最佳答案

Collection 只有 boolean remove(Object o) 方法,如果找到则删除传递的对象。

ArrayList还有public E remove(int index),可以通过索引删除一个元素。

您的第一个代码段调用 boolean remove(Object o),它不会删除任何内容,因为您的 ArrayList 不包含 1 .您的第二个片段调用 public E remove(int index) 并删除索引为 1 的元素(即它删除 "b")。

不同的行为是由于方法重载决议发生在编译时发生的,并且取决于您为其调用方法的变量的编译时类型。当 col 的类型为 Collection 时,只有 Collection 接口(interface)的 remove 方法(以及该接口(interface)继承的方法) ) 被考虑用于重载决议。

如果将 col.remove(1) 替换为 col.remove("b"),则两个片段的行为相同。

正如 Tamoghna Chowdhury 所评论的,由于 int 的自动装箱,boolean remove(Object o) 可以接受原始参数 - int 在您的情况下 到一个 Integer 实例。对于第二个片段,选择 public E remove(int index) 而不是 boolean remove(Object o) 的原因是方法重载解析过程首先尝试找到匹配方法不做自动装箱/拆箱转换,所以它只考虑 public E remove(int index).

关于java - ArrayList.remove 在称为 Collection.remove 时会给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35680624/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com