Java ArrayList contains方法不标识整数数据类型

Java ArrayList contains方法不标识整数数据类型,java,arraylist,contains,Java,Arraylist,Contains,我正在创建一个包含字符串和整数混合数据类型的ArrayList。然后我使用contains方法来识别和打印特定的成员。尽管contains方法标识字符串,但它似乎无法标识列表中的整数值。如何检查混合类型列表中的整数值 代码: 输出: =========== mixArrayList是[Alpha,Beta,Gamma,Delta,1,2,3.0,4.0,ArrayListPractice]。ArrayListClass@b4c966a] 列表中不包含2 列表包含伽马射线 进程已完成,退出代码为0

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

代码:

输出:

===========
mixArrayList是[Alpha,Beta,Gamma,Delta,1,2,3.0,4.0,ArrayListPractice]。ArrayListClass@b4c966a]
列表中不包含2
列表包含伽马射线
进程已完成,退出代码为0

列表是泛型类。见甲骨文

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

List<Object> list = new ArrayList<>();
list.add(2L);
List List=new ArrayList();
列表。添加(2L);
2L
作为一个,而
2
框作为一个
整数


因此
list.contains(2)
会查找一个,因此不会找到您的
2L
条目。

列表是泛型类。见甲骨文

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

List<Object> list = new ArrayList<>();
list.add(2L);
List List=new ArrayList();
列表。添加(2L);
2L
作为一个,而
2
框作为一个
整数


因此,
list.contains(2)
查找一个,因此找不到您的
2L
条目。

这是因为
2
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.contains(Object key)
调用
indexOf(Object key)
并返回true,如果它给出的值大于−1和
indexOf()
依次调用
equals()
,equals()由
key的类(或该类的超类)定义。至少在Java8中是这样;我怀疑它已经改变了

Integer.equals(Object other)
检查
other
是否是
Integer
的实例和
Long.equals(Object other)
检查
other
是否是
Long
的实例。它们都是
Number
的直接子类,因此
equals()
不会将一个实例识别为另一个实例

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

scala> 2 == 2L
res7: Boolean = true

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

我可能很快就会放弃重写JDK的想法,因为我问自己:“我到底需要它做什么?”

我在本地的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.contains(Object key)
调用
indexOf(Object key)
并返回true,如果它给出的值大于−1和
indexOf()
依次调用
equals()
,equals()由
key的类(或该类的超类)定义。至少在Java8中是这样;我怀疑它已经改变了

Integer.equals(Object other)
检查
other
是否是
Integer
的实例和
Long.equals(Object other)
检查
other
是否是
Long
的实例。它们都是
Number
的直接子类,因此
equals()
不会将一个实例识别为另一个实例

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

scala> 2 == 2L
res7: Boolean = true

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

我可能很快就会放弃重写JDK的想法,因为我问自己:“我到底需要它做什么?”

您添加到列表中的是一个
长的
2
,而不是
整数
。当您添加2L(长)并检查2(整数)时,这是显而易见的。您不应使用原始形式的ArrayList或任何集合API来避免运行时问题。您的
mixedArrayList
仍应声明为
List mixedArrayList=new ArrayList()学习对可读代码使用Java命名约定。对象引用变量应该用小写字母命名,而不是
ArrayListObj
。老实说,混合类型列表是一种代码味道。添加到列表中的是一个
Long
,值
2
,而不是
整数
。添加2L(Long)并检查2(Integer)是显而易见的。您不应使用原始形式的ArrayList或任何集合API来避免运行时问题。您的
mixedArrayList
仍应声明为
List mixedArrayList=new ArrayList()学习对可读代码使用Java命名约定。对象引用变量应以小写字母命名,而不是
ArrayListObj
。老实说,混合类型列表是一种代码味道。谢谢。我不知怎么想,这些类型在小数字使用时是可以互换的。但是我错了。你能解释一下为什么我应该使用List mixaraylist=new ArrayList();而不是我使用的ArrayList mixaryList=newArrayList();。看起来是这样的。我可能遗漏了一些东西,但我只是想知道指定一种方式与指定另一种方式的区别。我是Java新手。有时,即使您不遵守推荐的实践,您的代码也可以在Java中工作。线程就是一个很好的例子。看看这个关于为什么不应该使用原始类型的答案。非常感谢。我不知怎么想,这些类型在小数字使用时是可以互换的。但是我错了。你能解释一下为什么我应该使用List mixaraylist=new ArrayList();而不是我使用的ArrayList mixaryList=newArrayList();。这似乎在起作用