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就在一分钟前发布了。