gpt4 book ai didi

java - 在 ArrayList.trimToSize() 中,如果实际上没有发生结构变化,为什么 modCount 会增加

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:08 25 4
gpt4 key购买 nike

例如:

public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = Arrays.copyOf(elementData, size);
}
}

为什么 modCount 不在 if 中递增?

似乎modCount统计的是结构修改意图,而不是有效的结构修改。

最佳答案

查看 ArrayList 的实现,我不明白为什么 trimToSize()ensureCapacity() 都递增 modCount 。即使 elementData 数组实际重新分配,它们也不会更改列表的逻辑 View 。

modCount 用于确保在列表上具有 View (迭代器、子列表)的对象可以检测到对列表的修改(添加、删除、设置)底层列表。

在单线程环境中,什么场景可以通过调用 ensureCapacity() 实际使列表中的迭代器无效?因为迭代器正在存储在调用 trimToSize()ensureCapacity()不会更改的逻辑索引。

ensureCapacity() 递增 modCount 的一个原因(根据我对源代码的理解,我猜测)是它被所有 add() 调用 系列方法(add() 中甚至有注释 not to do modCount++ since it由 ensureCapacity() 完成。

我可能错了——这两种方法有可能使迭代器无效——但如果不是这种情况,一些评论者提出的理由是标记一个打算修改该列表不包含:

  • trimToSize() 调整内部数组的大小以移除未使用的。这些永远不会被迭代器或子列表使用,并且用户/调用者无意修改列表内容。唯一的目的是节省一些内存。
  • ensureCapacity() 的情况完全相同:不可能收缩一个列表。如果用户调用此方法,它是为了优化并在添加元素之前进行一些适当的调整。

作为最后的想法,我会更进一步:用户在调用这些方法中的任何一个时,不应期望在迭代中出现一些 ConcurrentMdificationException

关于java - 在 ArrayList.trimToSize() 中,如果实际上没有发生结构变化,为什么 modCount 会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com