Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Arraylist_Integer_Wrapper - Fatal编程技术网

Java 为什么ArrayList能够删除此项?

Java 为什么ArrayList能够删除此项?,java,arraylist,integer,wrapper,Java,Arraylist,Integer,Wrapper,在整数包装类中,每当我们这样比较时 Integer a=546; Integer b=546; System.out.println(a==b); 它返回false,但为什么有集合 ArrayList<Integer> a=new ArrayList<Integer>(); a.add(5); a.add(546); Integer g=546; a.remove(g); ArrayList a=新的ArrayList(); a、 增加(5); a、 增加(546);

在整数包装类中,每当我们这样比较时

Integer a=546;
Integer b=546;
System.out.println(a==b);
它返回false,但为什么有集合

ArrayList<Integer> a=new ArrayList<Integer>();
a.add(5);
a.add(546);
Integer g=546;
a.remove(g);
ArrayList a=新的ArrayList();
a、 增加(5);
a、 增加(546);
整数g=546;
a、 移除(g);

它将其从ArrayList中删除???

因为
ArrayList.remove
不使用引用标识(这是通过
=
获得的)-它使用
等于

从:

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

equals
将返回true:

Integer a = 546;
Integer b = 546;
System.out.println(a.equals(b)); // true
请注意,如果它没有使用
equals
,那么对于
String
之类的东西,它也会非常糟糕:

List<String> list = new ArrayList<>();
list.add("foo");
list.remove(new StringBuilder("f").append("oo").toString()));
System.out.println(list.size()); // 0
List List=new ArrayList();
列表。添加(“foo”);
list.remove(新的StringBuilder(“f”).append(“oo”).toString());
System.out.println(list.size());//0

因为
ArrayList.remove
不使用引用标识(这是通过
=
获得的)-它使用
等于

从:

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

equals
将返回true:

Integer a = 546;
Integer b = 546;
System.out.println(a.equals(b)); // true
请注意,如果它没有使用
equals
,那么对于
String
之类的东西,它也会非常糟糕:

List<String> list = new ArrayList<>();
list.add("foo");
list.remove(new StringBuilder("f").append("oo").toString()));
System.out.println(list.size()); // 0
List List=new ArrayList();
列表。添加(“foo”);
list.remove(新的StringBuilder(“f”).append(“oo”).toString());
System.out.println(list.size());//0

a==b适用于绝对内存位置。如果a、b指向同一内存位置,则返回true。然而,remove()方法在equals实现上起作用。因为根据equal方法,每个值为546的整数实例都等于任何其他实例,所以该值将从列表中删除。

a==b适用于绝对内存位置。如果a、b指向同一内存位置,则返回true。然而,remove()方法在equals实现上起作用。因为根据equal方法,每个值为546的整数实例都等于任何其他实例,所以该值将从列表中删除。

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

Integer a=546;
Integer b=546;
System.out.println(a.equals(b));
这就是ArrayList所使用的


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

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

Integer a=546;
Integer b=546;
System.out.println(a.equals(b));
这就是ArrayList所使用的


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

因为
remove()
equals()
相比,而不是与
==
的文档中的
remove(Object o)
:“从该列表中删除第一个出现的指定元素,如果它存在的话。[…]更正式地说,删除索引i最低的元素,这样(o==null?get(i)==null:o.equals(get(i))“a.equals(b)
打印什么?您告诉过它要删除的。问题是什么?因为
remove()
equals()
相比,而不是与
remove(对象o)
文档中的
=
:“从该列表中删除指定元素的第一次出现,如果它存在。[…]更正式地说,删除索引i最低的元素,以便(o==null?get(i)==null:o.equals(get(i))“
a.equals(b)
打印什么?你让它删除的。问题是什么?当我开始写我的答案时,没有其他答案,Skeet就在一分钟前发布了。当我开始写我的答案时,没有其他答案,Skeet就在一分钟前发布了。