java: понимание массивов.метод asList (t...array) для примитивных типов

я написал следующий код и был удивлен, увидев результат:

    Integer a = 211;
    int b = 211;

    int[] array = {210,211,212};

    System.out.println(Arrays.asList(array).contains(a));
    System.out.println(Arrays.asList(array).contains(b));

выход:

false
false

нашел этой вопрос и некоторые другие вопросы, связанные с ним, и узнали, что asList метод не наполняет Autobox. Я проверил возвращаемый тип в Eclipse javadoc preview:

enter image description here

Я не мог понять этот тип возврата. int[] является объектом, а не примитивом, поэтому его штраф. Я уверен, что нет. получение List<Integer> (чего я ожидал), но я не уверен, как использовать вещь, которая возвращается. Мои вопросы:

    1. Как именно я ожидаю, что методы list будут работать, когда я ожидаю список Integer и получаю список int[] ?
    2. В случае строк возвращаемым типом является List of String, а не List of String[]. Какие существуют различия в реализации?
    3. Что хорошего в этом методе для примитивов, если все так неуверенно?

5 ответов


здесь, очевидно, есть 3 вопроса, поэтому давайте решать их один за другим:

  1. как именно я ожидаю, что методы list будут работать, когда я ожидаю список Integer и получаю список int[] ?

Ну List методы будут работать точно так, как ожидалось, a List<T> список типов T. Вот!--7--> это int[] так List<int[]> будет содержать массивы как каждый элемент:

[{1, 2}, {3, 4}, {1, 6}]

так get(i) вернет ith элемент. В случае Arrays.asList the List содержит один элемент, а именно int[] так:

int[] array = {210,211,212};
List<int[]> list = Arrays.asList(array);

будет

[{210, 211, 212}]

и

list.get(0)[0] == 210

в случае строк возвращаемым типом является List of String, а не List of String[]. Какие существуют различия в реализации?

String это Object, не примитивный тип. Разницу следует от этого.

  1. что хорошего в этом методе для примитивов, если все так неопределенно?

вещи не неопределенность. Этот метод приводит к определена и предсказуемым поведение. Это просто не очень полезно для примитивов. Это (еще один) побочный эффект объединения системы типов Java с дженериками.

Примечание с Java 8 преобразование int[] в List<Integer> очень просто:

List<Integer> list = Arrays.stream(array).
        boxed().
        collect(toList());

вы не получаете Lit или список (которого не может быть), вы получаете список массивов integer.

таким образом, ваш список не содержит 211, он содержит массив, который затем содержит 211.

массив не "развернут" в список, он добавляется "как есть" во вновь созданный список.

Так :

System.out.println(Arrays.asList(array).contains(array)); // Will return true
System.out.println(Arrays.asList(a).contains(a)); // Will return true

потому что Arrays.asList() это variadic общая функция. Измените это,

int[] array = {210,211,212};

to

Integer[] array = { 210, 211, 212 };

и выход будет true и true.


массивы.asList принимает объекты как параметры. Поскольку int[] является объектом, Вы получаете список. Если вам нужен список целых чисел, вы должны сделать массивы.asList(211,212,213).


int[] array = {210,211,212};

Arrays.asList(array)

равна

List<int[]> asList = Arrays.asList(array); 

изменить

int[] array = {210,211,212}; to Integer[] array = {210,211,212}; и оно будет работать. и равняется List<Integer> asList = Arrays.asList(array);