在java中将数组转换为Set时编译错误

时间:2014-09-24 09:37:48

标签: java arrays set

我试图将int数组转换为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编译器不接受第一个代码?

3 个答案:

答案 0 :(得分:3)

int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));

由于您的Set类型为Integer(对象),array类型为int(原始)。

阅读Arrays.asList()

Arrays.asList() // takes in put as Generics

Java中的泛型不适用于primitive中的int类型。这就是您收到此错误的原因。

答案 1 :(得分:2)

您的问题是致电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
}

答案 2 :(得分:1)

在java容器中想要&#34;对象&#34;和原始人不是从对象派生的。泛型允许你假装没有包装,但你仍然支付拳击的性能价格。这对许多程序员来说非常重要。

列表清单;这也是为什么有原始类型的包装类的原因:

int -> Integer

boolean -> Boolean

double -> Double

byte -> Byte etc...