Java:将集合转换为数组用于字符串表示

32

这段代码本来是从Sun的Java教程中获取而来。我原以为它可以将一个Set转换成数组。

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

我哪里理解错了?


2
"[Ljava.lang.String;@9b49e6" 是一个字符串数组。 - Fredrik
这里的元素顺序准确吗?我遇到了类似的情况,其中顺序似乎有自己的意识,并不按照添加项的顺序。 - electrichead
通常情况下,集合没有定义的顺序,因此您不能依赖于将元素放入集合中的顺序与取出它们的顺序相同。如果您需要这个保证,请尝试使用Set接口的LinkedHashSet实现。 - Frans
6个回答

33

这段代码运行正常。

替换为:

System.out.println(array);

使用:

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

输出:

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

String表示数组时会显示一个“文本表示”,该表示通过 Object.toString 方法获得,它由数组的类名和哈希码组成的十六进制字符串。


Java 的某些部分可能会有些不太友善。 - coobird
他应该替换 System.out.println(set); 而不是 System.out.println(array);。 - dfa
@coobird 我知道这已经超过3年了,但最好使用Arrays.toString而不是Arrays.asList后跟List.toString :-) - obataku
2
请注意,当调用“toArray”方法时,不应构造零长度数组。这是一种浪费,因为它将在内部创建一个新数组来适应您的数据。如果您这样做:set.toArray(new String [set.size()]),您可以节省一个数组分配,因为“toArray”方法将看到传递的数组足够大以容纳数据。直接从javadocs中获取:如果集合适合指定的数组,则返回其中。否则,将使用指定数组的运行时类型和此集合的大小分配新数组。 - Matt

10

我同意,不使用asList()通过这些方法直接操作数组可能比创建中间列表更有效,特别是对于大型数组。请注意,deepToString()最适合多维数组和复杂嵌套。 - Quinn Taylor

5

没问题。

你没有通过System.out.println(array)看到数组内容是因为println调用object.toString()从对象中获取字节进行输出。

由于HashSet重写了默认的toString()实现,所以你可以通过System.out.println(set)看到集合的内容。

由于数组没有重写默认的toString()(它只返回类名和某种标识哈希码),所以你得到模糊的[Ljava.lang.String;@9b49e6。

希望这有所帮助。


2
如dfa所提到的,您可以直接替换以下内容:
System.out.println(array);

with...

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

1

我认为你没有误解任何东西。代码应该可以运行。然而,该数组在 toString 方法中并不足够智能化以打印其内容,因此您需要使用以下方法打印它的内容:

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

或者类似于这样的东西。


0
您得到了正确的结果。不幸的是,数组上的toString()方法仍然是原始的Object.toString(),因此默认情况下输出有点无用,但对所有数组都适用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接