In message <201008041456.o74eunho004...@d12av03.megacenter.de.ibm.com>, Mark Hindess writes: > > I've now refactored the exception code to the start of the methods and > shuffled some of the if else cases around a little. > > Next I plan to look at: > > 1) remove the following from addAll(...): > > if (this == collection) { > collection = (ArrayList)clone(); > } > > since it is immediately followed by a call to collection.toArray() so > it should be unnecessary.
Done in r982377. I also checked in the review comments we made to make it easier to track them. > 2) Change the fields to firstIndex and size. I've now done this and checked it in at r982498. I also made a minor change (below) to ensureCapacity that Oliver observed does (accidentally) fix a bug that caused us to call a grow method with 0 growSize and do a pointless array copy shuffling the entire list. public void ensureCapacity(int minimumCapacity) { - if (array.length < minimumCapacity) { + int required = minimumCapacity - array.length; + if (required > 0) { // REVIEW: Why do we check the firstIndex first? Growing // the end makes more sense if (firstIndex > 0) { - growAtFront(minimumCapacity - array.length); + growAtFront(required); } else { - growAtEnd(minimumCapacity - array.length); + growAtEnd(required); } } } My initial (dacapo) benchmark runs on the original ArrayList, the version with exception refactoring, the version without the spurious clone and the version with the size changes seem to show that the exception handling change was a bad idea but that we get back the lost performance with the size change. I'm just re-running the benchmarks on a quiet(er) machine to confirm. Will post details when they've finished. Regards, Mark.