1. 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的子集。
    1. List<Integer> subList = numbers.subList(0, 3);

    subList包含三个元素,如果toIndex大于numbers的size,并不会自动的获取所有元素,而是会抛出异常。

    • List自带一个sort()方法,sort的行为通过java.util.Comparator对象来参数化,在Java 8中,通过lambda表达式可以很轻松的完成排序:

      1. numbers.sort((Integer i1, Integer i2) -> (i1.compareTo(i2)));
    • 可以有多种方式实现对numbers数组的遍历

      1. //第一种迭代方式
      2. Iterator<Integer> iterator = numbers.iterator();
      3. while (iterator.hasNext()) {
      4. System.out.println(iterator.next());
      5. }
      6. //第二种迭代方式
      7. numbers.forEach((Integer i) -> System.out.println(i));
      8. //第三种迭代方式
      9. for (Integer i : numbers) {
      10. System.out.println(i);
      11. }

      如果使用迭代器,在迭代的过程中对数组做修改,会抛出ConcurrentModificationException。原因是AbstractList使用modCount记录修改的次数,每次的add、remove操作都会+1。在创建迭代器时会将modCount赋值给expectedModCount,每次遍历都会检查这两者是否一致,如果不一致,就会抛出上面说的异常。

      1. public E next() {
      2. checkForComodification();
      3. int i = cursor;
      4. if (i >= size)
      5. throw new NoSuchElementException();
      6. Object[] elementData = ArrayList.this.elementData;
      7. if (i >= elementData.length)
      8. throw new ConcurrentModificationException();
      9. cursor = i + 1;
      10. return (E) elementData[lastRet = i];
      11. }
      12. final void checkForComodification() {
      13. if (modCount != expectedModCount)
      14. throw new ConcurrentModificationException();
      15. }

    如果要在遍历过程中删除数组里面的元素,可以使用Iterator#remove方法。ListIterator相比Iterator功能更为丰富,包括add操作等。

    1. ListIterator<Long> listIterator = lists.listIterator();
    2. while (listIterator.hasNext()) {
    3. Long value = listIterator.next();
    4. if (value == 5) {
    5. listIterator.remove();
    6. listIterator.add(5L);
    7. }
    8. }
    9. Iterator<Long> iterator = lists.iterator();
    10. while (iterator.hasNext()) {
    11. Long value = iterator.next();
    12. if (value == 5) {
    13. iterator.remove();
    14. }
    15. }
    • 数组Array和ArrayList可以相互的转换

      1. String[] str = {"zhao", "qian", "sun", "li"};
      2. List<String> stringList = Arrays.asList(str);
      3. String[] strings = (String[])stringList.toArray();
    • ArrayList使用无参构造器初始化后,指向一个公共空数组。在执行add操作时,才会触发数组的初始化,数组默认大小为10。如果数组非常大,建议提前设置它的大小,免得在插入的过程中不停的resize()。

    • ArrayList是非线程安全的数组