java - 将“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 中创建的元素存储在不同的内存位置。正确的?
解决方案
当您调用new Integer(34)
YES 时,肯定会创建一个新的 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);
}
在您的代码中,当您调用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
关键字都创建新对象。
推荐阅读
- c++ - 什么是两台机器之间时间戳的最佳 c++ chrono 函数
- android - 如何在同一活动中为两个不同的回收视图设置两个不同的 onClick 侦听器
- sql - Oracle SQL 根据计数附加字符
- reactjs - 平面列表的实现
- powershell - 使用 Powershell 从文件重命名范围
- java - 连续输入(输入/扫描)两个相同的数字以打破循环“while”Java
- c# - “输入字符串的格式不正确” RFID 卡通过 USB 读取
- r - R/闪亮的变化选项卡和点击动态生成的链接上的输入
- java - 使用 Retrofit 2 在 android 中面临转换器问题
- javascript - 如何要求 Stripe Elements 字段中的信用卡字段?