- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
例如:
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/
我可以使用ArrayList.trimToSize()吗?动态 arrayList 中的方法? 如果我使用它,会发生什么? 我可以在动态 ArrayList 上使用此方法获得任何好处吗? 在这种情况下
我有一个数组列表,它的代码是: ArrayList recentdata=new ArrayList(); 我想将 ArrayList 的大小限制为特定大小,即在我的情况下为 5,当它达到该数字时。这
来自 a recently posted question我遇到了ArrayList#trimToSize()这会将支持数组的大小减小到当前集合的大小。 引用javadoc Trims the cap
我正在运行以下代码,但出现错误 The method trimToSize() is undefined for the type List public class ListPerformance
The capacity of a Queue is the number of elements the Queue can hold. As elements are added to a Que
有没有一种方法可以像通过 ArrayList 的 trimToSize() 方法一样压缩 HashMap? 我能想到的一种方法是遍历当前映射中的所有条目并填充一个新条目,然后用新条目替换原始条目。 有
我认为trimToSize() Java 的 ArrayList 中的方法是不必要的。我的理解是: 让我们取一个整数数组: int[] a = new int[10]; //This allocate
假设我有一个字符串数组列表。我使用了 Function ensureCapacity() 并将其容量设置为 50。 但我只添加了 10 个字符串元素,剩下的 40 个内存被浪费了。 现在我使用 tri
任何想要访问 java.util.ArrayList 工具的用户都必须遵守 java.util.List 中提供的使用契约(Contract)。 但是可以轻松打破这种使用契约并访问方法 trimToS
例如: public void trimToSize() { modCount++; if (size < elementData.length) { elementD
我是一名优秀的程序员,十分优秀!