【问题标题】:Java: Converting a set to an array for String representationJava:将集合转换为数组以进行字符串表示
【发布时间】:2009-06-14 13:12:11
【问题描述】:

来自 Sun 的 Java Tutorial,我原以为这段代码会将集合转换为数组。

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

我误解了什么?

【问题讨论】:

  • "[Ljava.lang.String;@9b49e6" 是一个字符串数组。
  • 这里的元素顺序准确吗?我遇到了类似的情况,订单似乎有自己的想法,而不是按照添加项目的顺序。
  • 集合通常没有定义的顺序,因此您不能依赖将元素放入集合的顺序与取出它们的顺序相同。如果你想要的话,试试 Set 接口的 LinkedHashSet 实现;它增加了这个保证。

标签: java arrays set


【解决方案1】:

代码运行良好。

替换:

System.out.println(array);

与:

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

输出:

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

数组的String 表示显示了数组的“文本表示”,由Object.toString 获得——它是类名和十六进制字符串形式的数组的哈希码。

【讨论】:

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

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

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

【讨论】:

  • 我同意,最好不要说这些方法可能比通过 asList() 创建中间列表更有效,尤其是对于大型数组。请注意,deepToString() 对于多维数组和复杂嵌套最有用。
【解决方案3】:

没关系。

您没有看到 System.out.println(array) 的数组内容,因为 println 调用 object.toString() 从 Object 中获取字节用于输出。

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

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

希望有帮助

【讨论】:

    【解决方案4】:

    正如 dfa 所说,您可以替换:

    System.out.println(array);
    

    与...

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

    【讨论】:

      【解决方案5】:

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

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

      或类似的东西。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-09
          • 2019-06-22
          • 2013-05-23
          • 2010-12-13
          • 1970-01-01
          相关资源
          最近更新 更多