2013-05-03 2 views
3

Может кто-то, возможно, объяснить, почему следующее:Разница в поведении containsAll для Integer и Int массивов (Java)

Integer[] arr1 = {1,2,3,4,5}; 
Collection<?> numbers = Arrays.asList(new Integer[]{1,2,3}); 
System.out.println(Arrays.asList(arr1).containsAll(numbers)); 

печать "истина", а если мы обмениваемся Integer для междунар так:

int[] arr2 = {1,2,3,4,5}; 
Collection<?> numbers2 = Arrays.asList(new int[]{1,2,3}); 
System.out.println(Arrays.asList(arr2).containsAll(numbers2)); 

"false" напечатан?

ответ

9

Во втором случае каждый список состоит из одного элемента. Эти два элемента являются массивами int []. Список, содержащий больший массив, не содержит члена списка, содержащего меньший массив.

Метод Arrays.asList() принимает список аргументов переменных аргумента типа T и возвращает List<T>. С массивом целых чисел T может быть целым и списком типа возвращаемого значения. Но с примитивным массивом T не может быть int, потому что не может быть List<int>.

+0

+1 для того, чтобы быть единственным правильным ответом. –

+1

Я также хотел отметить, что во втором случае все еще остается ложным, даже после замены меньшего массива {1,2,3} на {1,2,3,4,5} и истинного, только когда массивы в двух списки одинаковы с помощью сравнения ссылок (т.е. «==»). –

-1

в соответствии с этим: What is the difference between an int and an Integer in Java and C#?

Integer является объектом и ИНТ является примитивным Тхо они непосредственно не то же самое ...

Так в Java Docs Collection.containsAll (Object о) хочет объект, а не примитив. Может быть, это объясняет различные

http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

Не знал, что это сам, прежде чем большое спасибо за Ваш вопрос.

0

Список представляет собой набор объектов, и он отлично работает, если вы поместите в него объекты. Когда вы пытаетесь создать список с использованием примитивного массива, JVM достаточно любезен, чтобы не генерировать исключение, но он не может создать список по вашему желанию. И, следовательно, вы видите разницу в результатах, когда вы создаете список с массивом Integer, который действителен и когда вы создаете список с массивом int, который синтаксически корректен, но логически против принципа Collections.