Java ArrayList 包含不标识整数数据类型的方法



我正在创建一个包含字符串和整数混合数据类型的 ArrayList。然后我使用包含方法来识别和打印特定成员。尽管 contains 方法标识字符串,但它似乎不标识列表中存在的整数值。如何检查混合类型列表中的整数值?

法典:

public class ArrayListClass {
public static void main(String[] args) {
ArrayList mixArrayList = new ArrayList();
ArrayListClass ArrayListObj = new ArrayListClass();
mixArrayList.add("Alpha");
mixArrayList.add("Beta");
mixArrayList.add("Gamma");
mixArrayList.add("Delta");
mixArrayList.add(1);
mixArrayList.add(2L);
mixArrayList.add(3.0);
mixArrayList.add(4F);
mixArrayList.add(ArrayListObj);
System.out.println("mixArrayList is "+ mixArrayList);
if (mixArrayList.contains(2)) {
System.out.println("List contains 2");
}
else{
System.out.println("List does not contain 2");
}
if ((mixArrayList.contains("Gamma"))) {
System.out.println("List contains Gamma");
}
else{
System.out.println("List does not contain Gamma");
}
}
}

输出:

===========
mixArrayList is [Alpha, Beta, Gamma, Delta, 1, 2, 3.0, 4.0, ArrayListPractice.ArrayListClass@b4c966a]
List does not contain 2
List contains Gamma
Process finished with exit code 0

列表是泛型类。请参阅甲骨文教程。

因此,当您执行以下操作时:

List<Object> list = new ArrayList<>();
list.add(2L);

2L框作为Long,而2框作为Integer

因此,list.contains(2)会寻找Integer,因此找不到您的2L条目。

这是因为22L不同。

我在本地 Scala REPL 中尝试了几件事:

scala> val num = new java.lang.Integer(2)
num: Integer = 2
scala> val sameNum = new java.lang.Long(2)
sameNum: Long = 2
scala> num.equals(sameNum)
res0: Boolean = false
scala> sameNum.equals(num)
res1: Boolean = false

这是相关的,因为ArrayList<E>.contains(Object key)调用indexOf(Object key)并在给出超过 −1 的任何值时返回 true,而indexOf()又调用equals()key类(或该类的超类(定义的。至少在 Java 8 中是这样;我怀疑它已经改变了。

Integer.equals(Object other)检查otherInteger的实例,Long.equals(Object other)检查otherLong的实例。它们都是Number的直接子类,所以一个实例不会被equals()识别为另一个的实例。

我想如果你真的想,你可以制作你自己的JDK版本,其中Number的每个子类都定义equals(),如果otherNumber的任何实例,则取消持有值的包装,并将它们作为原语进行比较。因为,毕竟,

scala> 2 == 2L
res7: Boolean = true
scala> /* and... */ 2L == 2
res8: Boolean = true

我可能很快就会放弃重写JDK的想法,在问自己:"我到底需要这个做什么?

最新更新