Java中的以下代码返回-1。我认为应该返回3。
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
你能帮我理解这个功能是如何运作的。
由于
答案 0 :(得分:13)
在Java 5之前,Arrays.asList
用于接受Object[]
。当泛型和varargs被引入语言时,这被改为
public static <T> List<T> asList(T... arr)
在您的示例中,T
不能是int
,因为int
是基本类型。不幸的是,签名与T
相匹配,而不是int[]
,这是一种参考类型。结果是您最终得到一个包含数组的List
,而不是List
个整数。
在Java 4中,您的代码无法编译,因为int[]
不是Object[]
。不编译比产生奇怪的结果更可取,而在有效Java中,Josh Bloch说将asList
改为varargs方法是错误的。
答案 1 :(得分:9)
Arrays.asList
期待一个对象(或更多)。您的数组(array
)是唯一的对象,因此调用该方法将创建一个只有一个对象的列表,这是您的数组。
在列表中调用indexOf
将返回-1,因为您的列表包含数组对象而不是数组包含的数据列表,因此永远不会找到4
。
答案 2 :(得分:5)
int[] array = {1,2,3,4,5,6};
Arrays.stream(array).boxed().collect(Collectors.toList()).indexOf(4);
应该在保留原始int[]
的同时做你想做的事。
您收到IntStream
个邮件,将其装入Stream<Integer>
,将其收集到List<Integer>
,然后进行.indexOf()
搜索。
答案 3 :(得分:4)
当您使用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
答案 4 :(得分:3)
由于您使用的是基本类型的数组,因此无法使用。该数组的类型为int。如果你使用Integer
类型,那将是有效的。
-1表示未找到指定元素的索引。
这是你想要做的:
Integer[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
答案 5 :(得分:3)
你不能使用原始类型如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个元素为3。
答案 6 :(得分:2)
因为当您使用主数据类型数组执行此操作时,它将被视为List中的第一个元素。
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array));
你会得到这个:
[[I@474e8d67]
答案 7 :(得分:2)
int[] array = {1,2,3,4,5,6};
array
中被视为Object
int[]
特别是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[]
所以在上述情况RDD[(Text, VectorWritable)]
cad中特技。