为什么List可以删除未实例化的新对象

时间:2018-10-31 20:29:45

标签: java collections

List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases, 47, 48, 49, 50);
useCases.remove(new Integer(47));

为什么新实例的整数对象与useCase中的int值47相匹配?

如果实例化47的多个整数类型,它们是否都与useCase中的47值相对应,并且它们都可以引导列表删除47的值吗?

3 个答案:

答案 0 :(得分:6)

首先,当您传递原始整数(例如47)时,它将被“自动装箱”到值为47的Integer。其次,Integer.equals()方法将比较原始值。

答案 1 :(得分:3)

为进一步说明别人所说的内容,此代码:

Collections.addAll(useCases, 47, 48, 49, 50);

实际上是这个的简写:

Collections.addAll(useCases,
    Integer.valueOf(47),
    Integer.valueOf(48),
    Integer.valueOf(49),
    Integer.valueOf(50));

因为列表不能包含基元,只能包含对象。当编译器自动将基元转换为等效的包装器类值时,我们说编译器将它们“自动装箱”。

此行:

useCases.remove(new Integer(47));

并不意味着“仅删除该确切参数”。它的意思是“删除与该参数相同的第一个对象。”

根据Integer类的new Integer(47)方法,

Integer.valueOf(47)等于equals,因此Integer.valueOf(47)是要删除的对象。

顺便说一下,new Integerdeprecated。 Integer.valueOf和自动装箱是其替代品。

答案 2 :(得分:0)

正如Steve11235所说,equals()方法比较两个对象。

public class Animal {

String name;
int live;

public Animal(String name, int live) {
this.name = name;
this.live = live;
}

}

现在:

Animal animal = new Animal("Monkey",15);
Animal animal2 = new Animal("Cat",15);
List<Animal> animals = new ArrayList<Animal>();
Collections.addAll(animals, animal,animal2);
animals.remove(new Animal("Cat",15);

这是行不通的,因为equals方法不比较对象,而只是比较引用。