【问题标题】:Can you determine the initial capacity of a Java Collection?你能确定 Java 集合的初始容量吗?
【发布时间】:2012-08-30 15:24:22
【问题描述】:

在 Java 中,有什么方法可以确定用于创建 Collection 的初始容量?

所以当这样创建一个集合时:

List<Object> objectList = new ArrayList<Object>(5);

有什么方法可以告诉objectList 是用初始容量 5 创建的?

【问题讨论】:

  • 知道你为什么想要这个可能会很有趣。
  • 如果你想知道ArrayList当前的容量,这个问题可能会很有趣。 stackoverflow.com/questions/3564837/capacity-of-arraylist其中一个答案有一个反射黑客可以获取容量。不过,这并不是一个好主意。
  • @dystroy 我只是想知道为什么您可以设置它但无法检查剩余的分配空间。
  • 原因主要是实现细节。您可以提示您需要多少,但根据封装原则,您不应该知道它的内部情况。

标签: java collections


【解决方案1】:

不,ArrayList 类至少是传入的 originalCapacity 值的does not keep track

如果您担心 ArrayList 上的操作需要调整内部数组的大小,您可以随时致电ArrayList.ensureCapacity(int)

【讨论】:

  • 因此,无法判断您是否“需要”致电ensureCapacity。我想那你就不需要知道了。
  • @Jasper 如果你在内部数组已经足够大的时候调用ensureCapacity,它就什么也做不了。无论如何,这不会比调用一些假设的函数来检查大小更多。
【解决方案2】:

据我在 API 中看到的,不存在这样的方法。

但你可以将 ArrayList 子类化,如下所示:

class MyArrayList<T> extends ArrayList<T> {
    private final int initialCapacity;

    public MyArrayList(final Integer initialCapacity) {
        super(initialCapacity);

        this.initialCapacity = initialCapacity;      
    }

    public Integer getInitialCapacity() {
        return this.initialCapacity;
    }
}

那么你可以这样做:

    final List<Integer> li = new MyArrayList<Integer>(5);
    ((MyArrayList) li).getInitialCapacity();

【讨论】:

    【解决方案3】:

    你不能。即使您将项目添加到集合中,“toArray(...)”生成的数组也只是添加的项目的长度。另外,size() 只会返回添加的元素数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多