RFR: 8079136: Accessing a nested sublist leads to StackOverflowError (original) (raw)

Ivan Gerasimov ivan.gerasimov at oracle.com
Tue May 5 18:02:31 UTC 2015


Hi Paul

On 05.05.2015 19:56, Paul Sandoz wrote:

Hi Ivan,

ArrayList -- You can simplify SubList with: private final class SubList extends AbstractList implements RandomAccess { private final SubList parent; private final int offset; int size; // Top level sub-list SubList(int offset, int fromIndex, int toIndex) { this.parent = null; this.offset = offset + fromIndex; this.size = toIndex - fromIndex; this.modCount = ArrayList.this.modCount; } // Sub sub-lst SubList(SubList parent, int offset, int fromIndex, int toIndex) { this.parent = parent; this.offset = offset + fromIndex; this.size = toIndex - fromIndex; this.modCount = ArrayList.this.modCount; } ArrayList.subList becomes: public List subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(0, fromIndex, toIndex); } And SubList.subList: public List subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, offset, fromIndex, toIndex); } And SubList. updateSizeAndModCount: private void updateSizeAndModCount(int sizeChange) { int modCount = ArrayList.this.modCount; for (SubList slist = this; slist != null; slist = slist.parent) { slist.size += sizeChange; slist.modCount = modCount; } } Thanks for suggestion! I should have realized this myself, that there's no need to set parent to ArrayList.this. It was a left-over from the previous design, when parent was used in different ways.

AbstractList --

Similar changes can be made as above to ArrayList.SubList etc. The construction of sub-lists does indeed require a second take. A comment is worthwhile. IMO such scoping is not necessary for ArrayList, i have actually found it rare to require such scoping so using it when not necessary is rather jarring. Okay, I'll reorganize it to make SubList classes stand-alone, not inner classes. Let's see, if it makes the things nicer.

NestedSubList --

My preference is you use a testng data provider so you don't have to roll your own failure checking and reporting. Are there any other tests for testing the integrity of sublists?

I found only a few tests that test some parts of the functionality: test/java/util/List/LockStep.java test/java/util/Collection/MOAT.java

I'll post an update on the code and test soon.

Sincerely yours, Ivan



More information about the core-libs-dev mailing list