Java ArrayList 包含的方法无法识别整数数据类型
Java ArrayList contains method does not identify integer data type
我正在创建一个包含字符串和整数混合数据类型的 ArrayList。然后我使用 contains 方法来识别和打印特定成员。虽然 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
列表是通用的 类。参见 Oracle Tutorial。
因此,当您执行以下操作时:
List<Object> list = new ArrayList<>();
list.add(2L);
2L
boxes as a Long
,而 2
框作为 Integer
。
因此 list.contains(2)
查找 Integer
,因此找不到您的 2L
条目。
因为2
和2L
不一样。
我在本地 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)
和 returns 如果给出的值大于 −1,则为真,并且 indexOf()
依次调用 equals()
由 key
的 class 定义(或 class 的超 class)。至少Java8中是这样;我怀疑它已经改变了。
并且 Integer.equals(Object other)
检查 other
是 Integer
的实例,Long.equals(Object other)
检查 other
是 Long
的实例。它们都是 Number
的直接子 class,因此 equals()
.
不会将一个的实例识别为另一个的实例
我想如果你真的想要,你可以制作自己的 JDK 版本,其中 Number
的每个子 class 都将 equals()
定义为如果 other
是 Number
的任何实例,则拆箱保存的值并将它们作为基元进行比较。毕竟,
scala> 2 == 2L
res7: Boolean = true
scala> /* and... */ 2L == 2
res8: Boolean = true
我可能很快就会放弃重写 JDK 的想法,问问自己:"What do I need this for anyway?"
我正在创建一个包含字符串和整数混合数据类型的 ArrayList。然后我使用 contains 方法来识别和打印特定成员。虽然 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
列表是通用的 类。参见 Oracle Tutorial。
因此,当您执行以下操作时:
List<Object> list = new ArrayList<>();
list.add(2L);
2L
boxes as a Long
,而 2
框作为 Integer
。
因此 list.contains(2)
查找 Integer
,因此找不到您的 2L
条目。
因为2
和2L
不一样。
我在本地 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)
和 returns 如果给出的值大于 −1,则为真,并且 indexOf()
依次调用 equals()
由 key
的 class 定义(或 class 的超 class)。至少Java8中是这样;我怀疑它已经改变了。
并且 Integer.equals(Object other)
检查 other
是 Integer
的实例,Long.equals(Object other)
检查 other
是 Long
的实例。它们都是 Number
的直接子 class,因此 equals()
.
我想如果你真的想要,你可以制作自己的 JDK 版本,其中 Number
的每个子 class 都将 equals()
定义为如果 other
是 Number
的任何实例,则拆箱保存的值并将它们作为基元进行比较。毕竟,
scala> 2 == 2L
res7: Boolean = true
scala> /* and... */ 2L == 2
res8: Boolean = true
我可能很快就会放弃重写 JDK 的想法,问问自己:"What do I need this for anyway?"