List<Integer> numbers = Arrays.asList(new Integer(1), new Integer(3), new Integer(4), new Integer(2));
- ArrayList对象包含SubList类,可以实现通过ArrayList.subList(int fromIndex, int toIndex)方法取得numbers的子集。
List<Integer> subList = numbers.subList(0, 3);
subList包含三个元素,如果toIndex大于numbers的size,并不会自动的获取所有元素,而是会抛出异常。
List自带一个sort()方法,sort的行为通过java.util.Comparator对象来参数化,在Java 8中,通过lambda表达式可以很轻松的完成排序:
numbers.sort((Integer i1, Integer i2) -> (i1.compareTo(i2)));
可以有多种方式实现对numbers数组的遍历
//第一种迭代方式
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
//第二种迭代方式
numbers.forEach((Integer i) -> System.out.println(i));
//第三种迭代方式
for (Integer i : numbers) {
System.out.println(i);
}
如果使用迭代器,在迭代的过程中对数组做修改,会抛出ConcurrentModificationException。原因是AbstractList使用modCount记录修改的次数,每次的add、remove操作都会+1。在创建迭代器时会将modCount赋值给expectedModCount,每次遍历都会检查这两者是否一致,如果不一致,就会抛出上面说的异常。
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
如果要在遍历过程中删除数组里面的元素,可以使用Iterator#remove方法。ListIterator相比Iterator功能更为丰富,包括add操作等。
ListIterator<Long> listIterator = lists.listIterator();
while (listIterator.hasNext()) {
Long value = listIterator.next();
if (value == 5) {
listIterator.remove();
listIterator.add(5L);
}
}
Iterator<Long> iterator = lists.iterator();
while (iterator.hasNext()) {
Long value = iterator.next();
if (value == 5) {
iterator.remove();
}
}
数组Array和ArrayList可以相互的转换
String[] str = {"zhao", "qian", "sun", "li"};
List<String> stringList = Arrays.asList(str);
String[] strings = (String[])stringList.toArray();
ArrayList使用无参构造器初始化后,指向一个公共空数组。在执行add操作时,才会触发数组的初始化,数组默认大小为10。如果数组非常大,建议提前设置它的大小,免得在插入的过程中不停的resize()。
- ArrayList是非线程安全的数组