英文:
Why collections.reverse() is not returning reverse value for primitive int[] array?
问题
考虑以下代码片段:
public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5,6,7};
Collections.reverse(Arrays.asList(arr));
System.out.println("The value contained in the array is : " + Arrays.toString(arr));
Integer[] arr1 = new Integer[] {1,2,3,4,5,6,7};
Collections.reverse(Arrays.asList(arr1));
System.out.println("The value contained in the array is : " + Arrays.toString(arr1));
String[] strings = new String[] {"tom", "cat", "bob", "boss"};
Collections.reverse(Arrays.asList(strings));
System.out.println("The value contained in the array now is : " + Arrays.toString(strings));
}
对于 Integer[]
和 String[]
,它返回了预期的结果:
The value contained in the array is : [1, 2, 3, 4, 5, 6, 7]
The value contained in the array is : [7, 6, 5, 4, 3, 2, 1]
The value contained in the array now is : [boss, bob, cat, tom]
但是它没有反转 int[]
。我真的不明白为什么。我参考了这个 Stack Overflow 的问题(https://stackoverflow.com/questions/50557566/collections-reverse-doesnt-work-correctly),但对于为什么基本类型没有被反转并填充回传递的原始 int[]
,它没有真正帮助我理解。
英文:
Consider the following snippet,
public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5,6,7};
Collections.reverse(Arrays.asList(arr));
System.out.println("The value contained in the array is : " + Arrays.toString(arr));
Integer[] arr1 = new Integer[] {1,2,3,4,5,6,7};
Collections.reverse(Arrays.asList(arr1));
System.out.println("The value contained in the array is : " + Arrays.toString(arr1));
String[] strings = new String[] {"tom", "cat", "bob", "boss"};
Collections.reverse(Arrays.asList(strings));
System.out.println("The value contianed the the array now is : " + Arrays.toString(strings));
}
It's returning me the expected result for Integer[]
and String[]
as
The value contained in the array is : [1, 2, 3, 4, 5, 6, 7]
The value contained in the array is : [7, 6, 5, 4, 3, 2, 1]
The value contianed the the array now is : [boss, bob, cat, tom]
but it does not reverse the int[]
. I didn't understand why really. I referred to this SO question (https://stackoverflow.com/questions/50557566/collections-reverse-doesnt-work-correctly) but it didn't help me really to understand why primitives are not reversed back and populated on original int[] passed.
答案1
得分: 3
Your Arrays.asList
for the int[]
array is not producing the result you think. There is no way to create a List<int>
in Java so, you are simply creating a List<int[]>
, i.e. a list of a single item, where that item is your original int[]
array. If you reverse that single item, well, you get that item back, and that's why it appears to you as if nothing had happened when you print its reversed contents.
The confusion seems to come from the expectation that when you call List.asList(int[])
you should be getting back a boxed array of integers, i.e. List<Integer>
, but that is not the case. There is no such thing as aggregated auto boxing in Java and as explained in the other answer, the compiler makes the assumption that what you want is to create a list of a single element for that int[]
array.
英文:
Your Arrays.asList
for the int[]
array is not producing the result you think. There is no way to create an List<int>
in Java so, you are simply creating a List<int[]>
, i.e. a list of a single item, where that item is your original int[]
array. If you reverse that single item, well, you get that item back, and that's why it appears to you as if nothing had happened when you print its reversed contents.
The confusion seems to come from the expectation that when you call List.asList(int[])
you should be getting back a boxed array of integers, i.e. List<Integer>
, but that is not the case. There is no such thing as aggregated auto boxing in Java and as explained in the other answer, the compiler makes the assumption that what you want is to create a list of a single element for that int[]
array.
答案2
得分: 1
Arrays.asList(arr)
返回一个 List<int[]>
,其唯一元素是您的原始数组。当您反转仅包含一个元素的 List
时,结果仍然是相同的 List
。
这种行为的原因在于 <T> List<T> asList(T... a)
接受一个某种泛型类型参数 T
的数组,而且 T
必须是引用类型,不能是原始类型。因此,当您传递一个 int[]
时,T
是一个 int[]
(这是引用类型),而不是原始类型 int
。
对于 Integer[]
和 String[]
,行为是不同的,因为 Integer
和 String
都是引用类型,所以 Arrays.asList()
会返回一个 List<Integer>
(对于 Integer[]
)和一个 List<String>
(对于 String[]
)。
英文:
Arrays.asList(arr)
returns a List<int[]>
whose only element is your original array. When you reverse a List
of a single element, the result is the same List
.
The reason of this behavior is that <T> List<T> asList(T... a)
accepts an array of some generic type parameter T
, and T
must be a reference type. It cannot be a primitive. Therefore, when you pass an int[]
, T
is an int[]
(which is a reference type) and not the primitive int
.
The behavior for Integer[]
and String[]
is different, because both Integer
and String
are reference types, so Arrays.asList()
returns a List<Integer>
for Integer[]
and a List<String>
for String[]
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论