【问题标题】:Initialize an Array of ArrayList [duplicate]初始化一个ArrayList数组[重复]
【发布时间】:2012-04-30 21:58:53
【问题描述】:

如何初始化ArrayArrayList<String>

我试过这个语法,但没有用:

ArrayList<String>[] subsection = new ArrayList<String>[4];

【问题讨论】:

  • ArrayList array[] = new ArrayList[4];
  • @SamirMangroliya 它不适用于泛型

标签: java arrays string arraylist initialization


【解决方案1】:

你可以这样定义:

ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10];
    lists[0] = new ArrayList<String>();
    lists[0].add("Hello");
    lists[0].add("World");
    String str1 = lists[0].get(0);
    String str2 = lists[0].get(1);
    System.out.println(str1 + " " + str2);

【讨论】:

    【解决方案2】:

    该语法适用于非泛型 ArrayList(ideone)

    但它不会适用于通用ArrayList&lt;E&gt;(ideone)

    这段代码:

    ArrayList<String>[] subsection = new ArrayList<String>[4];
    

    给出编译器错误:

    Main.java:8:通用数组创建 ArrayList[] 小节 = new ArrayList[4];

    对于通用版本,请使用 ArrayList&lt;ArrayList&lt;E&gt;&gt;:

    ArrayList<ArrayList<String>> subsection = new ArrayList<ArrayList<String>>();
    

    【讨论】:

    • 但是 OP 最终会得到一个 ArrayLists 的 ArrayList,而不是一个 ArrayLists 的数组。几乎是一样的,但有区别。
    • 如果首选泛型版本,最好使用接口List&lt;List&lt;String&gt;&gt; subsection = new ArrayList&lt;ArrayList&lt;String&gt;&gt;();作为变量类型。
    • 重点是泛型和数组不能很好地结合在一起。
    【解决方案3】:

    好的,经过评论,我想得很好……你说得对,为什么不呢。

    想通了。

    ArrayList[] test = new ArrayList[4];
    
    test[3] = new ArrayList<String>();
    test[3].add("HI");
    
    System.out.println(test[3].get(0));
    

    虽然我会说实话,但我不确定为什么会这样。

    一旦将 test 的第一项分配为新的 Collection,它将只允许数组中的所有其他项为该类型。所以你做不到

    test[3] = new ArrayList<String>();
    test[2] = new HashSet<String>();
    

    【讨论】:

    • 你确定吗?为什么不能你有一个集合数组?
    • 在戴夫的评论之后,我想出了 OP 的答案。
    【解决方案4】:

    将泛型视为类型澄清过程,您可以将类型化的值分配给原始类型的变量,反之亦然。在核心泛型中,程序员可以避免过多地进行类型转换,这也有助于在编译时捕获一些逻辑错误。 在最基本的情况下,ArrayList 将始终隐式包含 Object 类型的项目。

    所以

    test[i] = new ArrayList<String>(); because test[i] has type of ArrayList.
    

    test[3] = new ArrayList<String>();
    test[2] = new HashSet<String>();
    

    没有工作 - 正如预期的那样,因为 HashSet 根本不是 ArrayList 的子类。泛型在这里无关。去掉泛型,你就会看到明显的原因。

    然而,

    test[2] = new ArrayList<String>();
    test[3] = new ArrayList<HashSet>(); 
    

    会很好地工作,因为这两个项目都是 ArrayLists。

    希望这是有道理的......

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2011-02-15
      • 2018-09-04
      • 2013-01-23
      • 1970-01-01
      • 2012-10-03
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多