当数组足够时使用Java List

时间:2011-02-15 10:25:55

标签: java arrays list collections

在您事先知道列表大小并且还可以在那里使用数组的情况下,建议使用Java Collections List吗?有任何性能缺陷吗?

是否可以使用单个语句中的元素(如数组)(用逗号分隔的所有元素的列表)初始化列表?

7 个答案:

答案 0 :(得分:4)

集合/列表更灵活,并提供更多实用方法。在大多数情况下,任何性能开销都可以忽略不计。

对于这个单语句初始化,请使用:

Arrays.asList(yourArray);

来自the docs

  

返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)此方法与Collection.toArray结合,充当基于数组的API和基于集合的API之间的桥梁。返回的列表是可序列化的,并实现RandomAccess。

我的猜测是,这是转换为列表的最佳性能方式,但我可能错了。

答案 1 :(得分:4)

  

在您事先知道列表大小并且还可以在那里使用数组的情况下,建议使用Java Collections List吗?

在某些(可能是大多数)情况下,无论如何都绝对建议使用收藏品,在某些情况下这是不可取的。

赞成方:

  • 如果您使用的是List而不是数组,那么您的代码可以使用containsinsertremove等方法。
  • 很多库类都需要收集类型的参数。
  • 您无需担心代码的 next 版本可能需要更加动态调整的数组...这会使基于数组的初始方法成为一种负担。

另一方面:

  • 集合 有点慢,如果数组的基类型是基本类型,则更多。
  • 集合 do 占用更多内存,尤其是在数组的基本类型是基本类型的情况下。

但是,性能很少是一个关键问题,在许多情况下,性能差异与大局无关。

实际上,在计算数组大小应该是什么时,性能和/或代码复杂性通常会有成本。 (考虑一下您使用char[]来保存系列串联的假设情况。可以计算出数组需要多大的数据;例如,通过将组件字符串大小相加。但它很乱!)

答案 2 :(得分:2)

  

在您事先知道列表大小并且还可以在那里使用数组的情况下,建议使用Java Collections List吗?性能缺陷???

如果数组足够,则使用数组。只是为了让事情变得简单。你甚至可以获得更好的性能。请记住,如果你...

  • 需要将生成的数组传递给采用Collection
  • 的方法
  • 如果您需要使用List - .contains.lastIndexOf或其他方法,或
  • 如果您需要使用Collections方法,例如reverse ...

然后可以从一开始就选择Collection / List类。

  

如何使用单个语句中的元素初始化列表,例如array = {以逗号分隔的所有元素的列表}?

你可以做到

List<String> list = Arrays.asList("foo", "bar");

List<String> arrayList = new ArrayList<String>(Arrays.asList("foo", "bar"));

List<String> list = new ArrayList<String>() {{ add("foo"); add("bar"); }};

答案 3 :(得分:2)

1)Collection是最基本的类型,只暗示有一组对象。如果没有订单或重复使用java.util.Set,如果有可能重复并使用java.util.List订购,是否有订单但没有重复使用java.util.SortedSet

2)实例化数组的Curly括号,Arrays.asList()加上类型推断的泛型

List<String> myStrings = Arrays.asList(new String[]{"one", "two", "three"});

还有一个使用匿名类型的技巧,但我个人并不是一个大粉丝:

List<String> myStrings = new ArrayList<String>(){
// this is the inside of an anonymouse class
{
    // this is the inside of an instance block in the anonymous class
    this.add("one");
    this.add("two");
    this.add("three");
}};

答案 4 :(得分:2)

是的,这是可取的。

一些不同的列表构造函数(如ArrayList)甚至采用参数,因此您可以“预分配”足够的后备存储,从而减少了在添加元素时列表“增长”到适当大小的需要。

答案 5 :(得分:2)

需要考虑不同的事情:数组的类型是否已知?谁访问阵列? 数组有几个问题,例如:

  • 您无法创建通用数组
  • 数组是协变的:如果A扩展B - > A []扩展B [],可以导致ArrayStoreExceptions
  • 您无法使数组的字段成为不可变的
  • ...

另请参阅有效Java书的第25项“首选列表到数组”。

也就是说,有时阵列很方便,例如新的Object ...参数语法。

  

如何使用单个语句中的元素初始化列表,例如array = {以逗号分隔的所有元素的列表}?

Arrays.asList():http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

答案 6 :(得分:1)

  

使用Java是否可取   收藏列表中的情况   事先了解清单的大小   你还可以在那里使用数组?   性能缺点?

使用List而不是数组是完全可以接受的,即使您事先知道了大小。

  

如何使用初始化列表   单个语句中的元素就像一个   array = {所有元素的列表   用逗号分隔}?

请参阅Arrays.asList()