【问题标题】:Why same values got from ArrayList are changed to different ones?为什么从 ArrayList 获得的相同值更改为不同的值?
【发布时间】:2017-02-23 03:30:56
【问题描述】:

我正在使用 Java ArrayList。

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(-129);
list.add(-129);
return (list.get(0) == list.get(1));

返回值为假。 我知道这一定是范围问题,因为当我使用 -128 时,它返回 true。 但是有人能告诉我它的原因吗?

【问题讨论】:

  • 您正在检查引用相等性。请改用.equals()。 -128 有效,因为它在缓存值的范围内。
  • 如果是这样,为什么 -128 给出真值?
  • 整数缓存 - 看看我的答案。
  • Integers caching in Java的可能重复

标签: java arraylist


【解决方案1】:

Java caches integers 在 -128..127 范围内(有符号字节)。它节省了很多小数字的分配,这在很多代码中很常见。如果您使用equals() 而不是==,它将起作用。 == 检查比较两个 int 类型,它们被神奇地装箱(即转换)为 Integer 是相同的引用 - 它们不是。但是有符号字节范围内的int 将是相同的。 equals 检查实际上会比较变量的

return (list.get(0).equals(list.get(1)));

【讨论】:

    【解决方案2】:

    当您执行时: 列表.add(-129); list.add(-129);

    它创建两个具有不同内存位置的独立对象。当您执行 == 时,它返回 false。 在 Java 中,从 -128 到 127 的值被缓存,所以返回相同的对象,你会得到 true。

    更多信息见:http://www.geeksforgeeks.org/comparison-autoboxed-integer-objects-java/

    【讨论】:

      【解决方案3】:

      如果两个引用指向两个不同的对象,那么按照“==”来判断两者是不相等的,即使两者具有相同的引用内容。我们知道,如果两个引用指向同一个对象,按照“==”来判断两者是否相等。

      如果你去整数。 Java类,你会发现内部有一个私有类IntegerCache。 Java,它从所有 Integer 对象中缓存 - 在 128 ~ 127 之间。

      所以问题是,所有的小整数都在内部缓存中。 如果值在 128 ~ 127 之间,则从缓存实例返回,指向同一个对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多