Примитивный тип и тип 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 используется как первый (и единственный) элемент в результирующем списке.