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:
Я не мог понять этот тип возврата. int[]
является объектом, а не примитивом, поэтому его штраф. Я уверен, что нет. получение List<Integer>
(чего я ожидал), но я не уверен, как использовать вещь, которая возвращается. Мои вопросы:
- 1. Как именно я ожидаю, что методы list будут работать, когда я ожидаю список Integer и получаю список int[] ?
- 2. В случае строк возвращаемым типом является List of String, а не List of String[]. Какие существуют различия в реализации?
- 3. Что хорошего в этом методе для примитивов, если все так неуверенно?
5 ответов
здесь, очевидно, есть 3 вопроса, поэтому давайте решать их один за другим:
- как именно я ожидаю, что методы 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
, не примитивный тип. Разницу следует от этого.
- что хорошего в этом методе для примитивов, если все так неопределенно?
вещи не неопределенность. Этот метод приводит к определена и предсказуемым поведение. Это просто не очень полезно для примитивов. Это (еще один) побочный эффект объединения системы типов 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);