我试图将int
array转换为Set<Integer>
。
int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
但是编译器不接受上面的代码。它说:“构造函数HashSet(List)是未定义的。” 好吧,我认为int
应该将其自动装箱。
我稍微修改了代码,更改int
为String
:
String[] arr = {"hello", "world"};
Set<String> s = new HashSet<String>(Arrays.asList(arr));
该代码可以正常工作。
我尝试了以下操作,更改int
为Integer
:
Integer[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
这通过了编译。
我的问题是:为什么Java编译器不接受第一个代码?
您的问题是打给Arrays.asList(arr)
。使用原始数组已使它感到困惑。Java以不同的方式对待原语和对象。
asList仅知道对象数组,在您的情况下,它将整个数组视为单个元素。也就是说,asList(arr)
正在返回Set<int[]>
,因此满足以下条件:
Set<int[]> s = new HashSet<Integer>(ints);
那不是你的意思。
Java中没有自动装箱原始数组的功能。最快的解决方法是对输入数组使用Integer而不是int:
Integer[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3}; // java supports autoboxing when declaring an array
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
否则,您将不得不自己迭代并添加元素。
int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>();
for ( int v : arr ) {
s.add(v); // autoboxing of a single int is supported by Java, and happens here
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句