首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ArrayList能够删除这个?

为什么ArrayList能够删除这个?
EN

Stack Overflow用户
提问于 2014-05-01 12:21:24
回答 3查看 75关注 0票数 0

在Integer包装器类中,每当我们像这样进行比较时

代码语言:javascript
复制
Integer a=546;
Integer b=546;
System.out.println(a==b);

它返回false,但是当有一个集合时,为什么

代码语言:javascript
复制
ArrayList<Integer> a=new ArrayList<Integer>();
a.add(5);
a.add(546);
Integer g=546;
a.remove(g);

它将其从ArrayList中删除?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-01 12:22:54

因为ArrayList.remove不使用引用标识(这是您在==中得到的)--它使用equals

来自documentation

如果指定元素存在,则从此列表中移除指定元素的第一个匹配项。如果列表不包含元素,则它将保持不变。更正式地说,删除具有最低索引i的元素,以便使(o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含指定的元素,则返回true (如果此列表因调用而发生更改,则为等效)。

equals将返回true:

代码语言:javascript
复制
Integer a = 546;
Integer b = 546;
System.out.println(a.equals(b)); // true

请注意,如果它不使用equals,那么对于像String这样的东西,它也会非常糟糕:

代码语言:javascript
复制
List<String> list = new ArrayList<>();
list.add("foo");
list.remove(new StringBuilder("f").append("oo").toString()));
System.out.println(list.size()); // 0
票数 6
EN

Stack Overflow用户

发布于 2014-05-01 12:23:56

因为比较对象的正确方法是使用equals:

代码语言:javascript
复制
Integer a=546;
Integer b=546;
System.out.println(a.equals(b));

这正是ArrayList所使用的。

顺便说一句,如果您创建了一个新的类,您必须编写自己的equals方法才能正常工作。

票数 1
EN

Stack Overflow用户

发布于 2014-05-01 12:23:49

a==b工作在绝对内存位置上。如果a,b指向它返回的相同内存位置,则返回true。但是,remove()方法可以在等于实现上工作。由于根据equal方法,值546的每个Integer实例都等于其他实例,因此该值将从列表中删除。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23407558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档