/* * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
// call the callback for each recursive subList privatevoid trimmedSubList(final List<Integer> list, final Callback callback) { int size = list.size(); if (size > 1) { // trim 1 element from both ends final List<Integer> subList = list.subList(1, size - 1);
callback.call(subList);
trimmedSubList(subList, callback);
}
}
publicvoid testRemoveUnsupported() { final Iterator iterator = new Iterator() {
@Override publicboolean hasNext() { returnfalse;
}
@Override public Object next() { returnnull;
}
};
try {
iterator.remove();
fail("expected UnsupportedOperationException from remove not thrown");
} catch (UnsupportedOperationException ignore) {
}
}
publicvoid testRemoveOverride() { final IteratorWithRemove iterator = new IteratorWithRemove();
iterator.remove();
assertTrue(iterator.removed);
}
publicvoid testForEach() throws Exception { final Integer[] data = new Integer[1000]; for (int i=0; i < data.length; i++) {
data[i] = i;
} final List<Integer> source = Arrays.asList(data);
for (final String iterableClass : iterableCollectionClasses) { final Iterable<Integer> iterable =
(Iterable<Integer>) Class.forName(iterableClass).newInstance();
((Collection<Integer>) iterable).addAll(source); final Iterator<Integer> iterator = iterable.iterator(); final List<Integer> target = new ArrayList<>(source.size());
iterator.forEachRemaining(target::add); if ("java.util.HashSet".equals(iterableClass)) {
target.sort((x, y) -> x - y);
assertEquals(target, source);
} else {
assertEquals(target, source);
}
// verify that for an iterator that has been advanced via next(), // forEach starts from the current location, not zero finalint OFFSET = 5; final List<Integer> reference2 = new ArrayList<>(source).subList(OFFSET, source.size()); final List<Integer> removed2 = new ArrayList<>(OFFSET); final Iterator<Integer> iterator2 = iterable.iterator(); for (int i=0; i < OFFSET; i++) { // advance the iterator by OFFSET, saving iterated elements
removed2.add(iterator2.next());
} final List<Integer> target2 = new ArrayList<>(reference2.size());
iterator2.forEachRemaining(target2::add); if ("java.util.HashSet".equals(iterableClass)) {
assertEquals(target2.size(), reference2.size());
target2.addAll(removed2);
target2.sort((x, y) -> x - y);
assertEquals(target2, source);
assertEquals(target2.subList(OFFSET, source.size()), reference2);
} else {
assertEquals(target2, reference2);
}
}
}
publicvoid testForEachSubList() throws Exception { final Integer[] data = new Integer[100]; for (int i = 0; i < data.length; i++) {
data[i] = i;
} final List<Integer> source = Arrays.asList(data); final String[] listClasses = { "java.util.ArrayList", "java.util.LinkedList", "java.util.Vector", "java.util.concurrent.CopyOnWriteArrayList"
}; for (final String listClass : listClasses) { final List<Integer> list =
(List<Integer>) Class.forName(listClass).newInstance();
list.addAll(source);
trimmedSubList(list, new Callback() {
@Override publicvoid call(final List<Integer> list) { if (list.size() < 1) { return;
} final List<Integer> target = new ArrayList<>(list.size()); final ListIterator<Integer> iterator = list.listIterator();
assertTrue(iterator.hasNext());
assertFalse(iterator.hasPrevious());
assertEquals(iterator.nextIndex(), 0);
assertEquals(iterator.previousIndex(), -1);
publicvoid testOptimizedForEach() throws Exception { final Integer[] data = new Integer[1000 * 1000]; for (int i=0; i < data.length; i++) {
data[i] = i;
} final List<Integer> source = Arrays.asList(data);
final String[] listClasses = { "java.util.ArrayList", "java.util.LinkedList", "java.util.Vector", "java.util.concurrent.CopyOnWriteArrayList"
};
finalint OFFSET = 3; final List<Integer> target = new ArrayList<>(source); for (final String listClass : listClasses) { final List<Integer> list =
(List<Integer>) Class.forName(listClass).newInstance();
list.addAll(source); final ListIterator<Integer> iterator = list.listIterator();
assertFalse(iterator.hasPrevious()); for (int i=0; i < OFFSET; i++) {
iterator.next();
}
assertTrue(iterator.hasNext());
assertTrue(iterator.hasPrevious());
assertEquals(iterator.nextIndex(), OFFSET);
assertEquals(iterator.previousIndex(), OFFSET - 1);
iterator.forEachRemaining(e -> {
target.set(e, e + 1);
}); for (int i=OFFSET; i < data.length; i++) {
assertEquals(target.get(i).intValue(), source.get(i)+1);
}
// CopyOnWriteArrayList.listIterator().remove() is unsupported if (!"java.util.concurrent.CopyOnWriteArrayList".equals(listClass)) { for (int i = data.length - 1; i >= 0; i--) {
iterator.remove(); // must not throw if (i > 0) {
iterator.previous();
}
}
assertTrue(list.isEmpty());
}
@Test(enabled = false) publicvoid compareSubListForEachPerformance() throws Exception { final Integer[] data = new Integer[1000 * 100]; for (int i = 0; i < data.length; i++) {
data[i] = i;
} final List<Integer> source = Arrays.asList(data);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.