首页 > 解决方案 > 将“new Integer (any number)”作为参数传递给 ArrayList 的 remove 方法

问题描述

当我像这样创建一个 ArrayList 时:

ArrayList<Integer> arr = new ArrayList
arr.add(1);
arr.add(3);
arr.add(34);
arr.add(13);

然后我尝试删除作为参数传递的元素new Integer(34)

arr.remove(new Integer(34));

这条线是如何工作的?我在创建一个新的整数对象吗?不应删除任何元素,因为在方法中创建的元素与在 ArrayList 中创建的元素存储在不同的内存位置。正确的?

标签: javaarraylist

解决方案


当您调用new Integer(34)YES 时,肯定会创建一个新的 Integer 对象。但是 Integer 类已经覆盖了equalshashCode方法。

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}


public int hashCode() {
    return Integer.hashCode(value);
}

在您的代码中,当您调用Arr.remove(new Integer(34))方法时,从 ArrayListremove(Object o)被调用。

public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

从上面的代码中,你可以看到当o (Object)不为空时,它调用equals检查相等性并从列表中删除对象。因此,您的对象被删除,即使它具有不同的内存位置。

还有一点:

考虑使用Integer.valueOf(34)方法而不是new Integer(34). Integer.valueOf(34)如果已经在其他地方的代码中创建了现有实例,将为您提供现有实例。由于 Integer 是不可变的,因此不会产生任何问题。所以不需要每次使用new关键字都创建新对象。


推荐阅读