32

从 Sun 的Java 教程中,我原以为这段代码会将集合转换为数组。

import java.util.*;

public class Blagh {
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();
        set.add("a");
        set.add("b");
        set.add("c");
        String[] array = set.toArray(new String[0]);
        System.out.println(set);
        System.out.println(array);
    }
}

然而,这给

[a, c, b]
[Ljava.lang.String;@9b49e6

我误解了什么?

4

6 回答 6

33

代码工作正常。

代替:

System.out.println(array);

和:

System.out.println(Arrays.toString(array));

输出:

[b,c,a]
[b,c,a]

数组的String表示显示了数组的“文本表示”,通过Object.toString-- 这是类名和数组的哈希码作为十六进制字符串获得。

于 2009-06-14T13:15:08.480 回答
10

为了完整性检查java.util.Arrays.toStringjava.util.Arrays.deepToString

后者在处理嵌套数组(如 Object[][])时特别有用。

于 2009-06-14T13:30:50.423 回答
5

没关系。

您看不到 System.out.println(array) 的数组内容,因为 println 调用 object.toString() 从 Object 获取字节以进行输出。

由于 HashSet 覆盖了默认的 toString() 实现,因此您可以通过 System.out.println(set); 看到设置的内容;

由于数组不会覆盖默认的 toString() (给出类名和某种身份哈希码),因此您将得到模糊的 [Ljava.lang.String;@9b49e6

希望有帮助

于 2009-06-14T13:20:38.110 回答
2

正如 dfa 提到的,您可以替换:

System.out.println(array);

和...

System.out.println(Arrays.toString(array));
于 2009-06-14T14:15:34.217 回答
1

我认为您没有误解任何事情;代码应该可以工作。但是,该数组不够智能,无法在 toString 方法中打印其内容,因此您必须使用

for(String s : array) println(s);

或类似的东西。

于 2009-06-14T13:20:26.613 回答
0

你有正确的结果。不幸的是,数组上的 toString() 方法仍然是原始的 Object.toString(),因此默认情况下输出有些不可用,但这适用于所有数组。

于 2009-06-14T17:13:40.733 回答