防止在Java中分配ArrayList迭代器

mak*_*kar 3 java android iterator allocation

因此,我通过在Android上编写我的第一个游戏,并在观看了关于优化游戏的冗长演示后,我一直在检查我的分配.除了为for(Object o:m_arrayList)约定创建隐式迭代器之外,我设法摆脱了所有游戏内分配,而不是我的ArrayList.

由于我的所有游戏对象,ai实体等都存储在这些迭代/分配中以便于使用,因此这些迭代/分配中有很少一部分.

那么我的选择是什么?

  • 我理论上可以指定合理的上边界并使用数组,但我喜欢ArrayList的特性,例如exists和remove,它们保持代码干净简单.

  • 覆盖ArrayList并提供我自己的iterator()实现,它返回一个类成员,而不是每次使用时都分配一个新的迭代器类型.

我更愿意选择2以方便使用,但是我有点偏执并遇到了问题.有没有人有我在上面选项2中描述的例子?我在从泛型类继承时遇到了问题,显然是冲突类型.

那么第二个问题是还有其他选择来避免这些分配吗?

我想作为一个额外的问题,有没有人知道ArrayList是否预先分配了一定数量的内存插槽(在ctor中指定或作为一些可移动值指定),并且只要你保持在内,就永远不需要做任何其他分配那些界限?即使在明确()之后?

在此先感谢,抱歉有那么多,但我认为这些信息可能对很多人有用.

Ale*_*yak 6

使用位置迭代.

for ( int i = 0, n = arrayList.size( ); i < n; ++i )
{
   Object val = arrayList.get( i );
}
Run Code Online (Sandbox Code Playgroud)

这就是在Java 5之前完成的.

用于预分配.

ArrayList arrayList = new ArrayList( numSlots );
Run Code Online (Sandbox Code Playgroud)

或在运行时

arrayList.ensureCapacity( numSlots );
Run Code Online (Sandbox Code Playgroud)

并获得奖金 - > http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

  • @makar.实际上,对于`ArrayLists``get`将比使用迭代器更快或更快.它直接引用底层数组的位置元素. (2认同)