【问题标题】:What is the default capacity of collection framework classes?集合框架类的默认容量是多少?
【发布时间】:2018-10-03 13:01:03
【问题描述】:

我知道java中Vector类的默认容量是10,同样ArrayList也有它的默认容量10。但是以下类的默认容量是多少:

  1. 矢量
  2. 数组列表
  3. 链表
  4. 哈希映射
  5. LinkedHashMap
  6. ConcurrentHashMap
  7. 哈希集
  8. LinkedHashSet
  9. 树集

或者有没有其他方法可以获取java中所有集合框架类的默认容量?

【问题讨论】:

  • 不是大小,capacity。新创建的空集合的大小为 0。对于所有提到的类,您可以查看源代码
  • 被标记为过于宽泛。这可以通过研究来回答。
  • 这可能因 JDK 的具体实现而异。您可以查看 OpenJDK 源代码。无论如何,你为什么想知道?在任何情况下,您的应用都不应该依赖于这个值。
  • @m0skit0 在某些非常特殊的情况下,应用程序的性能可以通过预设集合的初始大小来受益,但要正确执行此操作,您还需要了解和理解每个集合类使用的算法专门用于确定如何以及何时增加底层数据存储。
  • @jwenting 然而,这些是这些类的内部细节,将来可能会改变,或者如果您使用另一个 JDK,这就是为什么您的优化不应该依赖于任何类的内部实现。这在 OOP 范式中称为 encapsulation

标签: java


【解决方案1】:

这里没有一个正确的答案,因为它取决于 Java 版本。例如 RFR JDK-7143928 : (coll) Optimize for Empty ArrayList and HashMap 在 Java 8 中默认将 ArrayListHashMap 设为空。

您必须检查 JDK 中每个提到的类的默认构造函数。理论上,这也可能因 JDK 构建(例如 Oracle、IBM、Azul...)而异,因为默认的 ArrayList 容量不是 Java 语言规范的一部分。

【讨论】:

  • 那么在 java 1.x 版本中可能会有所不同?
  • @SudhirOjha 绝对!这是一个可能会发生变化的实现细节
  • @Karol Dowbecki 非常感谢。
【解决方案2】:
 1. Vector = 10
 2. ArrayList = 10
 3. LinkedList - does not have a capacity
 4. HashMap = 16 (but with the default load factor of 0.75, only 12 can be populated before a resize will happen)
 5. LinkedHashMap = 16 (read above)  
 6. ConcurrentHashMap = 16
 7. HashSet = 16 (it's  based on a HashMap)
 8. LinkedHashSet = 16
 9. TreeSet = does not have one

请注意,其中一些是惰性的,并且所有这些都可能随着版本的发布而变化。

【讨论】:

  • 堆栈的大小如何? @尤金
【解决方案3】:
ArrayList = 10

LinkedList = no intial capacity

HashMap,LinkedHashMap,ConcurrentHashMap,HashSet,LinkedHashSet = 16

TreeSet = empty

【讨论】:

    【解决方案4】:

    如果您查看 JDK 文件夹,您将看到一个名为 src.zip 的文件,其中包含 API 的源代码。

    ArrayList的源码,好像默认容量是10。

    【讨论】:

    • 问题的最佳答案
    • @NickProzee 在这种情况下,SO 上至少 30% 的问题应该说阅读文档,而不是引用和解释它
    • @NickProzee 不,这回答了您安装的特定 JDK 的问题。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2015-01-02
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多