代码之家  ›  专栏  ›  技术社区  ›  Dónal

默认集合类型

  •  9
  • Dónal  · 技术社区  · 14 年前

    假设您需要在 Collection ,不关心排序,允许重复,什么类型的 收藏 你用过吗?

    默认情况下,我一直使用 ArrayList 但我记得在某个地方读到或听到 Queue 实施可能是更好的选择。一 List 允许在任意位置添加/检索/删除项目,这会导致性能损失。作为一个 排队 不提供该设施,理论上不需要该设施时应更快。

    我意识到,所有关于绩效的讨论都有些毫无意义,唯一真正重要的是衡量。不过,我有兴趣知道别人用什么 收藏 ,如果他们不关心排序,允许重复, 为什么呢? ?

    6 回复  |  直到 9 年前
        1
  •  8
  •   redCube    14 年前

    “视情况而定”。您真正需要首先回答的问题是:“我要将集合用于什么?”

    如果您经常在其中一端(开始、结束)插入/删除项目 Queue 会比 ArrayList . 然而,在许多情况下,您创建一个集合只是为了从中读取。在这种情况下,arraylist的效率要高得多:由于它是作为一个数组实现的,所以可以非常高效地对它进行迭代(同样适用于 LinkedList )但是,LinkedList使用引用将单个项链接在一起。因此,如果不需要随机删除项目(中间),则 阵列列表 更好:一个 阵列列表 将使用较少的内存,因为项目不需要存储空间来引用下一个/上一个项目。

    总而言之:

    阵列列表 =如果插入一次并经常读取(随机访问或顺序访问),则很好

    链表 =很好,如果您经常在随机位置插入/删除,并且只读顺序

    ArrayDeque (仅Java6)=good如果您在开始/结束时插入/删除并随机或连续读取

        2
  •  1
  •   Riduidel    14 年前

    作为违约,我倾向于 LinkedList ArrayList . 显然,我使用它们不是通过 List 接口,而不是通过 Collection 接口。

    随着时间的推移,我确实发现,当我需要一个泛型集合时,或多或少需要放入一些东西,然后对其进行迭代。如果我需要更进一步的行为(比如随机访问、排序或单一性检查),那么我可能会更改使用的实现,但在此之前,我会将使用的接口更改为最合适的。这样,我可以确保在提供特性之前集中于优化和实现。

        3
  •  1
  •   falagar    14 年前

    arraylist基本上在内部包含一个数组(这就是它被称为arraylist的原因)。在任意位置执行addd/remove之类的操作都是以一种简单的方式完成的,所以如果不使用它们,不会对性能造成损害。

        4
  •  0
  •   YoK    14 年前

    如果排序和复制不成问题,并且案例仅用于存储,

    我用 ArrayList ,因为它实现了所有列表操作。从未感觉到这些操作有任何性能问题(也从未影响过我的项目)。实际上,使用这些操作很简单,我不需要关心它的内部管理方式。

    只有当多个线程将访问我使用的列表时 Vector 因为它的方法是同步的。

    此外,arraylist和vector是您首先学习的集合:)。

        5
  •  0
  •   Joeri Hendrickx    14 年前

    这取决于你对它的了解。

    如果我没有线索,我倾向于寻找一个链接列表,因为在末尾添加/删除的惩罚是恒定的。如果我对它的最大大小有一个粗略的概念,我会使用一个具有指定容量的数组列表,因为如果估计良好,它会更快。如果我真的知道确切的大小,我倾向于使用普通数组;尽管这不是真正的集合类型。

        6
  •  0
  •   Stephen C    14 年前

    我意识到,所有关于绩效的讨论都有些毫无意义,唯一真正重要的是衡量。

    这不一定是真的。

    如果您知道应用程序的工作原理 讲述 如果您认为某些集合将非常大,那么最好选择正确的集合类型。但正确的收集类型取决于 至关重要的是 关于集合将如何使用,即算法。

    例如,如果您的应用程序很可能被测试所控制,如果一个集合持有一个给定的对象,那么事实是 Collection.contains(Object) O(N) 两者皆适用 LinkedList<T> ArrayList<T> 可以 意味着两者都不是合适的集合类型。相反,也许您应该将集合表示为 HashMap<T, Integer> ,其中 Integer 表示 T 在“收藏”中。那会给你 O(1) 以更大的空间开销和更低的速度(尽管仍然如此)为代价进行测试和移除 O(1) )插入。

    但要强调的是,如果您可能要处理的是非常大的集合,则不应该存在“默认”集合类型。您需要在算法的上下文中考虑集合。(另一方面,如果集合总是很小的话,那么选择哪种集合类型可能没有什么区别。)