如果未指定方法toArray,如何使用toArray()将hash Set转换为数组?

时间:2015-11-08 11:21:25

标签: java collections hashset

查看java api for java collections framework,我在HashSet中找不到toArray()方法,抽象类Set中有toArray()方法。

class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        Set x = new HashSet();
        x.add(4);
        //ArrayList<Integer> y = x.toArray(); this does not work !
        int[] y = x.toArray();//this does not work!

        System.out.println(x.toArray());//this gives some weird stuff printed : Ljava.lang.Object;@106d69c
    }
}

如果没有指定toArray(),如何将hashset转换为数组?

6 个答案:

答案 0 :(得分:30)

当然HashSet实现toArray。它必须实现它,因为它实现了Set接口,它指定了这个方法。实际的实现是AbstractCollection,它是AbstractSet的超类,它是HashSet的超类。

首先,你不应该使用原始类型。

使用:

Set<Integer> x = new HashSet<>();
x.add(4);

然后转换为数组:

Integer[] arr = x.toArray(new Integer[x.size()]);

使用x.toArray()会为您提供Object[]

答案 1 :(得分:4)

确保声明HashSet

的通用名称
Set<Integer> x = new HashSet<>();

并将其转换为如此数组:

int[] y = new int[x.size()];
int c = 0;
for(int x : x) y[c++] = x;

答案 2 :(得分:2)

第一行

  

ArrayList y = x.toArray();这不起作用!

首先,您使用Set x = new HashSet();,即原始类型。编译器不知道它将包含整数对象但是在左侧有上面的行你说它将是整数的arraylist,其实际上是一个数组

第二行

  

int [] y = x.toArray(); //这不起作用!

在左侧的上面一行你说它将是一个整数数组,实际上它是一个对象数组

这将有效

Object[] y = x.toArray();

但这不是正确的方法。你不应该使用原始类型

 Set<Integer> x = new HashSet<>();
 Integer[] intArray= x.toArray(new Integer[x.size()]);
  

System.out.println(x.toArray()); //这会打印一些奇怪的东西   :Ljava.lang.Object; @ 106d69c

它的数组对象的打印toString表示。这就是为什么你把它看作Ljava.lang.Object;@106d69c

如果要打印每个元素,请迭代它然后打印它。

答案 3 :(得分:2)

看起来您最初想要创建一个ArrayList而不是一个简单的Array。所以,试试吧!

class Ideone 
{
        public static void main (String[] args) throws java.lang.Exception   
        {
            Set x = new HashSet();
            x.add(4);
            ArrayList<Integer> y = ArrayList<Integer>(x);
            System.out.println(y);
        }
}

答案 4 :(得分:0)

JDK 7中使用TreeSetArrayListArray对小地图进行排序的比较:

long start  = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
   TreeSet a   = new TreeSet(payloads.keySet());                           
} 
System.out.println("TreeSet: "    + (System.currentTimeMillis()-start) + " ms.");
start       = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
   ArrayList a = new ArrayList(payloads.keySet()); 
   Collections.sort(a);    
} 
System.out.println("ArrayList: "  + (System.currentTimeMillis()-start) + " ms.");
start       = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
   String[] a = payloads.keySet().toArray(new String[payloads.size()]); 
   Arrays.sort(a);    
} 
System.out.println("Array: "  + (System.currentTimeMillis()-start) + " ms.");

收率:

  

TreeSet:1527 ms。
  ArrayList:943毫秒   阵列:485毫秒。

答案 5 :(得分:0)

我们可以遍历循环并将值存储到数组中。

int[] answer = new int[set1.size()];
int i = 0;
for (int num : set1) {
      answer[i++] = num;
}