为什么从ArrayList获得的相同值被更改为不同的值?

时间:2017-02-23 03:30:57

标签: java arraylist

我正在使用Java ArrayList。

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

返回值为false。 我知道它必须是一些范围问题,因为当我使用-128时,它返回true。 但有人可以告诉我它的原因吗?

3 个答案:

答案 0 :(得分:1)

Java caches integers,范围为-128..127(带符号字节)。它节省了大量微小数字的分配,这在许多代码中非常常见。如果您使用equals()代替==,则可以使用==int检查比较两个Integer类型,它们已被神奇地加框(即转换)为int是相同的参考 - 它们不是。但是,有符号字节范围内的equals将是相同的。 return (list.get(0).equals(list.get(1))); 检查实际上会比较变量的

public event PropertyChangedEventHandler PropertyChanged;

答案 1 :(得分:0)

执行时: list.add(-129); list.add(-129);

它创建两个具有单独内存位置的独立对象。当您执行==时,它返回false。 在Java中,缓存了从-128到127的值,因此返回相同的对象,您将获得真实。

有关详细信息,请参阅:http://www.geeksforgeeks.org/comparison-autoboxed-integer-objects-java/

答案 2 :(得分:-1)

如果两个引用指向两个不同的对象,则按照&#34; = =&#34;判断两者是不相等的,即使两者具有相同的参考内容。众所周知,如果两个引用引用同一个对象,则按照&#34; = =&#34;判断两者是否平等。

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

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