2012-04-23 6 views
0

Я хочу сравнить значения двух массивов типа Integer. Я получаю неправильный ответ, когда я сравниваю их точные значения, и правильный ответ, когда я сравниваю их с Arrays.equals:, сравнивая значения двух целых чисел

Integer a[]=new Integer[2]; 
    Integer b[]=new Integer[2]; 
    a[0]=138; 
    a[1]=0; 
    b[0]=138; 
    b[1]=0; 
    boolean c; 
    c=a[0]==b[0];//c is false 
    c=Integer.valueOf(a[0])==Integer.valueOf(b[0]);//c is false 
    c=Arrays.equals(a, b);//c is true 

ответ

5

Вы ищете intValue, не Integer.valueOf (хотя это легко увидеть, как вы могли бы получить их с толку!):

c = a[0].intValue() == b[0].intValue(); 

Java имеет примитивные типы (int, byte, double, и т.д.) и также ссылочные типы (объекты), соответствующие им для тех ситуаций, где вам нужен объект. Ваш код, делающий a[0] = 138;, является автоматическим боксированием примитивного значения 138 внутри экземпляра Integer.

intValue возвращает примитив int, содержащий экземпляр Integer. Integer.valueOf используется для получения Integer экземпляра (от int или String   — в вашем случае, это будет использовать valueOf(int) автопреобразований Ун-бокс вашей Integer ссылки).

Вы также можете сделать это:

c = (int)a[0] == (int)b[0]; 

... что вызовет автоматическую распаковку.

Подробнее о боксе (включая авто-бокс и распаковку) в the specification.

+0

Спасибо за ваш полный ответ. a и b были значениями хэша, и именно по этой причине они были целыми. – Pegah

+0

@Pegah: Ах, да, повод! :-) Рад, что помогло. –

2

Вы делаете неявное преобразование типа (авто-бокс) в вашем коде.

Линия:

a[0]=138; 

на самом деле переводится как:

a[0] = Integer.valueOf(138); 

создания экземпляра Integer. Уловка заключается в том, что этот метод кэширует целые числа от 0 до 127 и создает новый экземпляр для значений выше 127, поэтому == сравнение возвращает false.

Обратите внимание, что фактический тип а [0] является целое число, так что вы можете написать

c=a[0].equals(b[0]); 

, которая возвращает истину.

0

Из-за массивов, я не думаю, что внутренние значения будут автоматически распаковываться для вас. это может сработать, если у вас есть int[] вместо Integer[]

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