【问题标题】:Directly setting values for an ArrayList in Java在 Java 中直接设置 ArrayList 的值
【发布时间】:2011-01-21 21:29:03
【问题描述】:

为 Java ArrayList 设置值列表有效:

Integer[] a = {1,2,3,4,5,6,7,8,9};
ArrayList<Integer> possibleValues2 = new ArrayList<Integer>(Arrays.asList(a));

但是,以下内容不起作用,并且出现错误“Illegal start of type”以及其他错误。为什么不?既然第一个代码块的第一行就是简单的赋值,那不应该没有效果吗?

ArrayList<Integer> possibleValues2 = new ArrayList<Integer>(Arrays.asList({1,2,3,4,5,6,7,8,9}));

【问题讨论】:

  • 哇。考虑到没有人真正回答这个问题,给出了很多分数。 OP没有问其他选项是什么,但为什么这不起作用。与stackoverflow.com/questions/3504849/java-weird-array-behavior 重复。
  • @Robin 但答案大多是真实且富有洞察力的。对字面问题的琐碎标准答案通常不是最佳答案。
  • 由于我的回答遭到不公正的否决,我将其删除。但是,这是对类似问题的先前回答:stackoverflow.com/questions/4324633/…
  • @Robin:哎呀,我才意识到我对这个问题读得太多了。看起来它是关于泛型和整数/整数的,我的眼睛只是掩盖了那里花括号的简单问题。

标签: java arraylist


【解决方案1】:

您应该使用Arrays.asList 的可变参数版本,例如

ArrayList<Integer> possibleValues2 =
    new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9));

或显式创建一个数组参数,例如

ArrayList<Integer> possibleValues2 =
    new ArrayList<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9}));

【讨论】:

    【解决方案2】:

    一个奇怪且很少使用的成语,

    List<Integer> ints = new ArrayList<Integer>() {{add(1); add(2); add(3);}}
    

    这是创建一个扩展 ArrayList(外括号)的匿名类,然后实现实例初始化器(内括号)并在那里调用 List.add()。

    Arrays.asList() 相比,它的优势在于它适用于任何集合类型:

    Map<String,String> m = new HashMap<>() {{ 
      put("foo", "bar");
      put("baz", "buz"); 
      ...
    }}
    

    【讨论】:

    • 很高兴知道这一点,而且对于面试来说绝对有价值,因为这是一个常见问题,但我认为创建像 ArrayList 这样的标准类的匿名子类是一种不好的做法。从 OOP 的角度来看,只有当新类具有旧类缺少的功能时,才应该扩展一个类。它会在你的代码库中乱扔子类名称 OuterClass$1.class 或类似名称。
    • 确实如此,但如果您打算重新使用该课程,我只会把它放在心上。匿名类是为了内联方便而不是重用。或者,另一种看待它的方式......我正在创建一个新的 ArrayList 子类型,它将自身初始化为一组静态值。该功能是给定静态值集的初始化。
    • 我仍然更喜欢new ArrayList&lt;Integer&gt;(Arrays.asList(1,2,3))。这很好,很简单,它使类层次结构保持不变
    • Arrays.asList() 适用于列表,但上述成语适用于任何集合类型或任何对象。
    • 它会以某种方式影响性能吗?我已经认为它会影响序列化。
    【解决方案3】:

    另一种选择是使用 Guava(“Google 收藏”),它有一个 Lists.newArrayList(...) 方法。

    您的代码将类似于

    ArrayList<Integer> possibleValues2 = Lists.newArrayList(1,2,3,4,...);
    

    【讨论】:

    • 虽然这个答案非常好(+1),但当使用 int[] 数组调用时,它会失败并出现与 Arrays.asList() 相同的错误
    • 对于int[] 数组,Lists.newArrayList(Ints.asList(intArray)) 可以工作。
    • 很奇怪。我刚刚在我的机器上运行了以下命令: public void testArrayList() { ArrayList list = Lists.newArrayList(3,4); assertEquals("[3, 4]", list.toString());并且没有任何问题,但我可能正在使用更新版本的番石榴。
    • @Uri,@Sean,@ColinD,我认为您需要更仔细地阅读这个问题。没有int[] 数组(它是Integer[]。)问题是大括号。使用不同的方法来创建列表将无济于事。此外,OP 可能是 Java 新手,不会从向他的项目中添加另一个大型库中受益。
    • @finnw:同意,我的错。我看了这个问题,误解它是关于 int 数组和/或泛型的,看到彼得的回答,显然回答错了:)
    【解决方案4】:

    来自 Java 7 SE 文档:

    List<Integer> possibleValues2 = Arrays.asList(1,2,3,4,5,6,7,8,9);
    

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 2020-12-02
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多