private static final Field sizeField;
static {
try {
sizeField = ArrayList.class.getDeclaredField("size");
sizeField.setAccessible(true);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
// 'setSize'
public static <T> void growSize(final ArrayList<T> list, final int maxSize) {
if (maxSize <= list.size())
return;
list.ensureCapacity(maxSize);
try {
sizeField.setInt(list, maxSize);
} catch (Exception ex) {
throw new RuntimeException("Problem while setting private size field of ArrayList", ex);
}
}
Here is the reported issue and here a discussion. When you need decreasing the size too then have a look into Vector.setSize
A less hacky but also less efficient version would be:
public static <T> void growSizeSlower(final ArrayList<T> list, final int maxSize) {
if (maxSize <= list.size())
return;
list.addAll(new AbstractList<T>() {
@Override public Object[] toArray() {
return new Object[maxSize - list.size()];
}
@Override public T get(int index) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override public int size() {
throw new UnsupportedOperationException("Not supported yet.");
}
});
}