使用Java的数组中元素的索引

Som*_*tta 18 java arrays

Java中的以下代码返回-1.我认为它应该返回3.

int[] array = {1,2,3,4,5,6}; 
System.out.println(Arrays.asList(array).indexOf(4));
Run Code Online (Sandbox Code Playgroud)

你能帮我理解这个功能是如何工作的吗?

谢谢

Pau*_*ton 13

在Java 5之前,Arrays.asList曾经接受过Object[].当泛型和varargs被引入语言时,这被改为

public static <T> List<T> asList(T... arr)
Run Code Online (Sandbox Code Playgroud)

在您的示例中,T不能int因为int是原始类型.不幸的是,签名匹配T等于int[]相反,这是一个引用类型.结果是你最终得到一个List包含数组,而不是List整数.

在Java 4中,您的代码不会编译,因为int[]它不是Object[].不编译比产生奇怪的结果更可取.在Effective Java中,Josh Bloch说改造asList为varargs方法是一个错误.


Jea*_*ard 9

Arrays.asList期待一个对象(或更多).您的array(array)是唯一的对象,因此调用该方法将创建一个只有一个对象的列表,这是您的数组.

调用indexOf列表将返回-1,因为4您的列表包含数组对象,而不是数组包含的数据列表,因此永远不会找到.


glg*_*lgl 5

int[] array = {1,2,3,4,5,6};
Arrays.stream(array).boxed().collect(Collectors.toList()).indexOf(4);
Run Code Online (Sandbox Code Playgroud)

在保持原件的同时应该做你想做的事int[].

你得到IntStream它,将它装入a Stream<Integer>,将其收集到a List<Integer>然后可以进行.indexOf()搜索.

  • 您可能希望使用`IntStream`而不是将all数组存储到列表中以调用`indexOf` - `OptionalInt index = IntStream.range(0,array.length).filter(i - > array [i] == 4).findFirst();` (2认同)