final sclass ChunkedIntList extends RandomAccessAbstractList { int chunkShift = 16; // => chunkSize = 65536 new L chunks; int size; public void add(int i) { ensureCapacityInternal(size+1); set(size, i); ++size; } public Int set(int i, Int value) { ret set(i, (int) value); } public void set(int i, int value) { int[] chunk = chunks.get(i >> chunkShift); int idx = i & (chunkSize()-1); int old = chunk[idx]; chunk[idx] = value; ret old; } public bool add(Int i) { add((int) i); true; } public int size() { ret size; } public Int get(int i) { ret getPrimitive(i); } public int getPrimitive(int i) { if (i >= 0 && i < size) ret chunks.get(i >> chunkShift)[i & (chunkSize()-1]; throw new IndexOutOfBoundsException(i + "/" + size); } void ensureCapacityInternal(int minCapacity) { while (l(chunks) << chunkShift < minCapacity) chunks.add(new int[chunkSize()]); } int[] toIntArray() { int[] a = new int[size]; int i = 0; for (int[] chunk : chunks) { System.arraycopy(chunk, 0, a, i, min(chunk.length, size-i)); i += chunk.length; } ret a; } int chunkSize() { ret 1 << chunkShift; } }