gpt4 book ai didi

java - 为什么短对象列表无法检查它是否包含该值

转载 作者:行者123 更新时间:2023-11-30 07:33:07 24 4
gpt4 key购买 nike

我刚刚开始学习集合。当我尝试检查之前添加的值 5 是否存在时,它总是返回 false。

List<Short> shortList = new ArrayList<>();
shortList.add((short) 5);
System.out.println(shortList.contains(5));

输出:错误

我不明白这有什么问题?这是一个很常见的逻辑。

最佳答案

几年前我也遇到过同样的问题。这是我当时发现的。

简短回答:由于自动装箱,值 5 被转换为整数对象。当 ArrayList 检查值时,它会将每个对象与 .equals() 运算符和 Integer、Short 的 .equals 进行比较,仅当两个对象属于相同类型时才会继续比较它们的原始值(.intValue 或 .shortValue) .

长答案:

执行shortList.contains(5)时发生以下情况:

  1. 自动装箱启动,导致 5 转换为整数对象。

    Integer.valueOf(int) line: 830  
  2. ArrayList 的 Contains 方法在内部调用 indexOf API,该 API 会检查正在搜索的对象是否存在索引。

:

 public int indexOf(Object o) {
...
// Here Object "o" is of Type Integer in your case, So It calls Integer.equals
if (o.equals(elementData[i]))
...
// If not equal or not found.
return -1;
}
  • 由于传递的对象是 Integer Wrapper Class 类型,因此它会调用 Integer Class equals() 方法。
  • 整数类 equals 的实现是
  • :

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

    由于此处的对象“obj”的类型为“Short”,instanceof 运算符失败,导致输出为 false。

    关于java - 为什么短对象列表无法检查它是否包含该值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35797430/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com