2017-02-23 16 views
0

Я использую Java ArrayList.Почему одинаковые значения, полученные от ArrayList, меняются на разные?

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

Возвращаемое значение ложно. Я знаю, что это должна быть проблема диапазона, поскольку, когда я использую -128, он возвращает true. Но может ли кто-нибудь сказать мне причину этого?

+1

Вы проверяете ссылочное равенство. Вместо этого используйте '.equals()'. -128 работает, потому что он находится в диапазоне кешированных значений. – shmosel

+0

Если да, то почему -128 верно? –

+0

Целочисленное кэширование - посмотрите на мой ответ. –

ответ

1

Java caches integers в диапазоне -128..127 (подписанные байты). Это экономит много распределений крошечных чисел, что очень часто встречается в большом количестве кода. Если вы используете equals() вместо ==, он будет работать. Проверка == сравнивает то, что два типа int, которые были магически коробочными (т. Е. Преобразованными) в Integer, являются той же ссылкой, что и нет. Но int в подписанном байтовом диапазоне будет одинаковым. equals проверка будет на самом деле сравнивать значение переменных:

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

Это правильный ответ. – Keith

+0

Спасибо большое !!!! –

-1

Если две ссылки указывают на двух различных объектов, то в соответствии с «=», чтобы судить как неодинаково, хотя оба имеют одинаковый ссылочный контент. Как известно, если две ссылки относятся к одному и тому же объекту, то в соответствии с «= =», чтобы судить о двух равных.

Если вы перейдете к Integer. Java, вы обнаружите, что существует внутренний закрытый класс IntegerCache. Java, он кэширует весь объект Integer - от 128 до 127.

Итак, все маленькие целые числа находятся во внутреннем кеше. Если значение находится в диапазоне от 128 до 127, оно будет возвращено из экземпляра кеша, указывается на тот же объект.

0

Когда вы выполните: list.add (-129); list.add (-129);

Создает два отдельных объекта с раздельной ячейкой памяти. Когда вы выполняете ==, он возвращает false. В Java значения от -128 до 127 кэшируются, поэтому возвращаются те же объекты, и вы получите правду.

Для получения дополнительной информации см .: http://www.geeksforgeeks.org/comparison-autoboxed-integer-objects-java/

Смежные вопросы