Лучший вариант - использовать то, что проще всего написать и поддерживать.
Если производительность является проблемой, вам следует профилировать приложение впоследствии, а не оптимизировать преждевременно.
Кроме того, я бы использовал фильтрацию из библиотек, таких как google-collection или commons collection, чтобы сделать код более читабельным:
Collection<T> newCollection = Collections2.filter(new Predicate<T>() {
public boolean apply(T item) {
return (...); // apply your test here
}
});
В любом случае, поскольку вы, похоже, оптимизируете производительность, я бы выбрал System.arraycopy
, если вы действительно хотите сохранить большинство оригинальных элементов:
String[] arr = new String[initialList.size()];
String[] src = initialList.toArray(new String[initialList.size()]);
int dstIndex = 0, blockStartIdx=0, blockSize=0;
for (int currIdx=0; currIdx < initialList.size(); currIdx++) {
String item = src[currIdx];
if (item.length() <= 4) {
if (blockSize > 0)
System.arraycopy(src, blockStartIdx, arr, dstIndex, blockSize);
dstIndex += blockSize;
blockSize = 0;
} else {
if (blockSize == 0)
blockStartIdx = currIdx;
blockSize++;
}
}
ArrayList newList = new ArrayList(arr.length + 1);
newList.addAll(Arrays.asList(arr));
}
Кажется, он примерно на 20% быстрее, чем ваш вариант 3. Тем более (40%), если вы можете пропустить новое создание ArrayList в конце.
См .: http://pastebin.com/sDhV8BUL