Следующий код в Java возвращает -1. Я думал, что он должен вернуться 3.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Можете ли вы помочь мне понять, как работает эта функция.
Спасибо
Следующий код в Java возвращает -1. Я думал, что он должен вернуться 3.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Можете ли вы помочь мне понять, как работает эта функция.
Спасибо
Перед Java 5, Arrays.asList используется для принятия Object[]. Когда generics и varargs были введены в язык, это было изменено на
public static <T> List<T> asList(T... arr)
В вашем примере T не может быть int, потому что int является примитивным типом. К сожалению, вместо этого подпись соответствует T, равной int[], которая является ссылочным типом. В результате вы получите List, содержащий массив, а не List целых чисел.
В Java 4 ваш код не был скомпилирован, потому что int[] не является Object[]. Не компиляция предпочтительнее производить странный результат, а в Effective Java Джош Блох говорит, что переоснащение asList как метода varargs было ошибкой.
Arrays.asList ожидать объект (или больше). Ваш массив (array) является единственным объектом, поэтому вызов метода создаст список только одного объекта, который является вашим массивом.
Вызов indexOf в вашем списке будет возвращать -1, потому что 4 никогда не будет найден, так как ваш список содержит объект массива, а не список данных, содержащихся в вашем массиве.
int[] array = {1,2,3,4,5,6};
Arrays.stream(array).boxed().collect(Collectors.toList()).indexOf(4);
должен делать то, что вам нужно, сохраняя исходный int[].
Вы получите IntStream, вставьте его в Stream<Integer>, соберите его до List<Integer> и затем выполните поиск .indexOf().
У вас есть ответы на вопрос о том, что происходит с вашим массивом, когда вы используете Arrays.asList().
Другие вещи, которые следует учитывать:
Arrays.binarySearch()int[] в List<Integer>Пример:
public static void main(String[] args) throws Exception {
int[] array = {1, 2, 3, 4, 5, 6};
System.out.print("Binary Search: ");
System.out.println(Arrays.binarySearch(array, 4));
int[] array2 = {5, 8, 2, 5, 3, 4, 1};
System.out.print("Manual Search: ");
System.out.println(indexOf(array2, 4));
}
public static int indexOf(int[] array, int search) {
for (int i = 0; i < array.length; i++) {
if (array[i] == search) {
return i;
}
}
return -1;
}
Результаты:
Binary Search: 3
Manual Search: 5
Поскольку вы используете массив примитивного типа, это не сработает. Массив имеет тип int. Например, если вы используете тип Integer, это сработает.
-1 означает, что индекс указанного элемента не найден.
Это то, что вы хотите сделать:
Integer[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Вы не можете использовать примитивные типы, такие как int как параметры для общих классов в Java, поскольку int не является классом, вместо этого вы используете Integer:
Integer[] array = {1,2,3,3,4,5};
List Arraylist=Arrays.asList(array);
System.out.println(Arraylist.indexOf(1));
System.out.println(Arraylist.indexOf(4));
выход:
0
4
обратите внимание, что Arraylist.indexOf(i) возвращает индекс первого вхождения элемента i в список:
System.out.println(Arraylist.indexOf(3));
он вернет 2, который является первым вхождением элемента 3, а не 3, поскольку в списке есть 2 элемента из списка.
Потому что, когда вы делаете это с помощью массива первичных данных, он будет рассматриваться как первый элемент в списке.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array));
Вы получите следующее:
[[[email protected]]
int[] array = {1,2,3,4,5,6};
array рассматривается как Objectint[] в особенности Object, а не Object[]Arrays.asList вам понадобится ноль или более ObjectsВаш метод вызывается таким образом,
Arrays.asList((Object)(array));//Yes
Arrays.asList(1,2,3,4,5,6);//No
Итак, у вас будет List<int[]>, а не List<Integer>
Теперь вы могли бы спросить себя, что если
Arrays.asList(1,2,3,4)работает, чем почему бы неArrays.asList(arrayInt)?
В Arrays.asList(1,2,3,4) все значения автобоксируются в Integer, который является только Object, поэтому в приведенном выше случае Integer[] cad делает трюк.