2012-04-19 2 views
1

Это часть моей программы Java, которую я извлек и упростил для тестирования. Задача состоит в том, чтобы сравнить два целых числа из ArrayList и указать, являются ли они равными.JAVA: сравнение не работает, если целое число больше 128

Данный код работает для номеров < 128, но любое число> 128, и код не будет работать.

Любая помощь была бы действительно замечательной, спасибо.

import java.util.*; 

public class test 
{ 
public static void main (String[] args) 
{ 

Integer seat1Store = 128; 
Integer seat2Store = 128; 
Integer seat3Store = 0; 
Integer seat4Store = 0; 
Integer seat5Store = 0; 


ArrayList<Integer> proceedArray = new ArrayList<Integer>(); 


if (seat1Store !=0) 
{ 
    proceedArray.add(seat1Store); 
} 
if (seat2Store !=0) 
{ 
    proceedArray.add(seat2Store); 
} 
if (seat3Store !=0) 
{ 
    proceedArray.add(seat3Store); 
} 
if (seat4Store !=0) 
{ 
    proceedArray.add(seat4Store); 
} 
if (seat5Store !=0) 
{ 
    proceedArray.add(seat5Store); 
} 

System.out.println("ArrayList = " + proceedArray); 


boolean proceed = false; 


for(int i = 0; i<proceedArray.size();i++) 
{ 
    for(int p=0; p<proceedArray.size(); p++) 
    { 
     if(i != p) 
     { 
      if(proceedArray.get(i) == proceedArray.get(p)) 
      { 
       System.out.println("DUPLICATE"); 
       System.exit(0); 
      } 
     } 
    } 
    proceed = true; 
} 


if (proceed == true) 
{ 
    System.out.println("PROCEEDED"); 
} 




} 
} 
+0

возможно дубликат [объектов Целые оболочки одни и те же экземпляры только в пределах стоимости 127?] (Http://stackoverflow.com/questions/5117132/integer-wrapper-objects-share-the-same-instances -only-in-the-value-127) – RanRag

ответ

6

Да, это ожидается. Вы не должны сравнивать ссылки на объекты с == или !=. Вместо этого вы должны использовать .equals(..), или лучше - используйте примитив int, а не Integer.

Дело в том, что кешируются значения до 128, а JVM предоставляет вам одни и те же объекты (следовательно, работает эталонное сравнение). Над 128 он создает новый экземпляр. Посмотрите на Javadoc из Integer.valueOf(int) (что происходит за сценой)

Возвращает экземпляр Integer, представляющий указанное значение INT. Если новый экземпляр Integer не требуется, этот метод обычно должен использоваться в предпочтении конструктору Integer (int), так как этот метод может обеспечить значительно лучшую производительность пространства и времени, кэшируя часто запрашиваемые значения.

+0

Спасибо .equals() работал с удовольствием. Спасибо за объяснение тоже :) –

+0

приятное объяснение. –

0

При сравнении объектов в Java вы фактически сравниваете ссылки, а не значения при использовании оператора равенства ==. Вместо этого вы должны использовать метод .equals() для сравнения значений;

Integer a = 2423; 
Integer b = 5455; 

if (a.equals(b)) { ... 
0

Вы используете объект Integer вместо int primitive в качестве переменных типов. Это будет работать только с оператором '=' для значений до 128, потому что java кэширует его. Правильный способ сравнения объекта - это функция .equals().

Но вместо этого используйте примитивные значения.

int i1 = 1; 
int 12 = 2; 
List<Integer> values = ArrayList<Integer>(); 
if (!values.contains(i1)) { 
values.add(i); 
} 
if (!values.contains(i2)) { 
values.add(i2); 
} 
Смежные вопросы