Java 通行证;新整数(任意数字)";作为ArrayList的remove方法的参数

Java 通行证;新整数(任意数字)";作为ArrayList的remove方法的参数,java,arraylist,Java,Arraylist,当我创建这样的ArrayList时: ArrayList<Integer> arr = new ArrayList arr.add(1); arr.add(3); arr.add(34); arr.add(13); 那条线是怎么工作的? 我正在创建一个新的整数对象吗? 不应删除任何元素,因为在方法中创建的元素存储在与在ArrayList中创建的元素不同的内存位置。对吗?首先,您可以简单地转换为整数。其次,您应该更喜欢Java命名约定。第三,Arrays.asList不那么麻烦。第四

当我创建这样的ArrayList时:

ArrayList<Integer> arr = new ArrayList
arr.add(1);
arr.add(3);
arr.add(34);
arr.add(13);
那条线是怎么工作的? 我正在创建一个新的整数对象吗?
不应删除任何元素,因为在方法中创建的元素存储在与在ArrayList中创建的元素不同的内存位置。对吗?

首先,您可以简单地转换为
整数。其次,您应该更喜欢Java命名约定。第三,
Arrays.asList
不那么麻烦。第四,您可以打印
列表
。最后,(正如你所怀疑的)这里还有更多的工作要做。使用
新整数(int)
时,只能保证缓存
字节范围内的值(因此,您可能应该避免这样做,并强制转换或使用
整数.valueOf(int)

List al=newarraylist(Arrays.asList(1,3,34,13));
系统输出打印项次(al);
al.删除((整数)34);
系统输出打印项次(al);

首先,您可以简单地转换为
整数。其次,您应该更喜欢Java命名约定。第三,
Arrays.asList
不那么麻烦。第四,您可以打印
列表
。最后,(正如你所怀疑的)这里还有更多的工作要做。使用
新整数(int)
时,只能保证缓存
字节范围内的值(因此,您可能应该避免这样做,并强制转换或使用
整数.valueOf(int)

List al=newarraylist(Arrays.asList(1,3,34,13));
系统输出打印项次(al);
al.删除((整数)34);
系统输出打印项次(al);

当您调用
新整数(34)
时,肯定会创建一个新的整数对象。但Integer类重写了
equals
hashCode
方法

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(新整数(34))
方法时,从ArrayList调用
remove(对象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){
如果(o==null){
对于(int index=0;index
从上面的代码中,您可以看到当
o(Object)
不为空时,它调用
equals
检查相等性并从列表中删除该对象。因此,即使对象具有不同的内存位置,也会删除对象

还有一点:


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

当您调用
newinteger(34)
时,肯定会创建一个新的Integer对象。但Integer类重写了
equals
hashCode
方法

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


public int hashCode() {
    return Integer.hashCode(value);
}
According to Arraylist implementation remove method is based on equals().

    For Integer equals is overridden as follow and based on int value but not on object reference
在您的代码中,当您调用
Arr.remove(新整数(34))
方法时,从ArrayList调用
remove(对象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){
如果(o==null){
对于(int index=0;index
从上面的代码中,您可以看到当
o(Object)
不为空时,它调用
equals
检查相等性并从列表中删除该对象。因此,即使对象具有不同的内存位置,也会删除对象

还有一点:

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

According to Arraylist implementation remove method is based on equals().

    For Integer equals is overridden as follow and based on int value but not on object reference
整数等于

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

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

在内部,
java.util.ArrayList
使用
.equals()
在尝试从列表中删除元素时进行比较

在您的情况下,它将删除值为
34
的元素,因为它是
int
的包装类型,而int
对象

但是如果使用原语类型,它将抛出
IndexOutOfBoundException
。 这是因为它将调用另一个接受基元类型的
remove()
方法,该方法将删除索引34中的元素,而该元素在上面的列表中不存在,只有4个元素


顺便说一句,您以后不应该对任何包装类使用构造函数方法,因为自Java9以来,它已经不推荐使用,并且将在Java16中删除。在为基元类型创建包装器对象时,应该使用static
.valueOf()
方法。

在内部,
java.util.ArrayList
使用
.equals()
在尝试从列表中删除元素时进行比较

在您的情况下,它将删除值为
34
的元素,因为它是
int
的包装类型,而int
对象

但是如果使用原语类型,它将抛出
IndexOutOfBoundException
。 这是因为它将调用另一个
remove()