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

How to convert hash Set into array using toArray() if the method toArray is not specified?

查看 java api 的 java 集合框架,我在 HashSet 中找不到 toArray() 方法,抽象中有 toArray() 方法 class 放。

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 转换为数组?

当然 HashSet 实现了 toArray。它必须实现它,因为它实现了指定此方法的 Set 接口。实际实现在 AbstractCollection 中,它是 AbstractSet 的超级 class,它是 HashSet 的超级 class。

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

使用:

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

然后转换为数组:

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

使用 x.toArray() 会给你 Object[]

确保为 HashSet

声明泛型
Set<Integer> x = new HashSet<>();

并将其转换为数组,如下所示:

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

第一行

ArrayList y = x.toArray(); this does not work !

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

第二行

int[] y = x.toArray();//this does not work!

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

这行得通

Object[] y = x.toArray();

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

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

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

它打印 toString 数组对象的表示。这就是为什么您将其视为 Ljava.lang.Object;@106d69c

如果你想打印每个元素,迭代它然后打印它。

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

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

比较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 ms.
Array: 485 ms.

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

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