Примитивный тип и тип Wrapper для Arrays.asList
У меня следующий простой тестовый пример
@Test
public void testArraysAsList() {
Character[] chars1 = new Character[]{'a', 'b'};
System.out.println(Arrays.asList(chars1).size());
char[] chars2 = new char[]{'a', 'b'};
System.out.println(Arrays.asList(chars2).size());
}
Результат:
2
1
Я не понимаю Arrays.asList(chars2)
, почему Arrays.asList(char[])
создает один список размеров, причем элемент char [].
Ответы
Ответ 1
Как поясняет @Andy, дженерики работают только со ссылочными типами. Это означает, что List<char>
не разрешено (поэтому Arrays.asList
не может вернуть List<char>
). Вместо этого Arrays.asList
интерпретирует свой вход как один объект и возвращает список с этим единственным элементом.
Character[] chars1 = new Character[]{'a', 'b'};
List<Character> list1 = Arrays.asList(chars1);
char[] chars2 = new char[]{'a', 'b'};
List<char[]> list2 = Arrays.asList(chars2);
Сравните Arrays.asList(chars2)
с этим примером String
(где вход также является одним элементом):
String test = "test";
List<String> asList = Arrays.asList(test);
Возвращает список с размером() == 1
Ответ 2
Коллекции могут содержать только объекты, а не примитивные типы.
java.util.Arrays.asList(T... a) здесь T может быть объектом, не примитивным.
И в случае Arrays.asList(char []) он будет рассматривать char [] как объект (T). поэтому вы увидите неожиданные символы при печати ниже:
System.out.println(Arrays.asList(chars2));
Выход:
[[С @15db9742]
И размер будет всегда для массивов примитивных типов.
Ответ 3
Это потому, что List принимает только объекты, а не примитивы. Поэтому, когда вы передаете массив объектов, он принимает эти объекты и создает их список. Но когда вы передаете массив примитивов, он принимает сам массив (который является объектом) и создает список.
В первом случае было 2 объекта, поэтому длина списка была 2. Если во втором случае существует только один объект (т.е. Сам массив), поэтому длина будет теперь 1.
Следующий код очистит его
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.testArraysAsList();
}
public void testArraysAsList() {
Character[] chars1 = new Character[]{'a', 'b'};
System.out.println(Arrays.asList(chars1).size());
char[] chars2 = new char[]{'a', 'b'};
System.out.println(Arrays.asList(chars2).size());
Integer[] int1 = new Integer[]{1, 2};
System.out.println(Arrays.asList(int1));
int[][] int2 = new int[][]{{1,2},{1,2} };
System.out.println(Arrays.asList(int2));
}
}
Теперь посмотрим на результат, полученный при запуске вышеуказанного кода на моей машине.
2
1
[1, 2]
[[[email protected], [[email protected]]
Поскольку массив int2
является двумерным массивом, он имеет в нем 2 массива. Таким образом, в нем есть 2 объекта. В этом случае длина равна 2. Вы можете увидеть его на выходе, [[[email protected]
и [[email protected]]
- это 2 объекта массива на этот раз.
Надеюсь, это даст понять.
Ответ 4
Поскольку chars2 является объектом, а 'a' и 'b' являются символами, а char является примитивным типом, а не типом объекта. Поэтому chars2 используется как первый (и единственный) элемент в результирующем списке.