内功心法 -- java.util.ArrayList<E> (2)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>的构造方法和5个修改操作进行介绍,主要内容包括:
1、ArrayList构造方法介绍
2、ArrayList常用5个修改操作介绍
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1. ArrayList三个构造方法
1.1 ArrayList构造方法(提供了三种构造方法)
1 //第一种: 无参数构造方法 2 public ArrayList() { 3 //调用带初始化列表大小参数的构造方法 4 this(10); 5 } 6 7 //第二种: 带初始化列表大小参数的构造方法 8 public ArrayList(int initialCapacity) { 9 super(); 10 11 //如果初始化列表大小参数小于0,则抛出异常 12 if (initialCapacity < 0) 13 throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity); 14 15 //创建一个大小为initialCapacity参数的Object类型数组 16 this.elementData = new Object[initialCapacity]; 17 } 18 19 //第三种: 带子列表参数的构造方法 20 public ArrayList(Collection<? extends E> c) { 21 elementData = c.toArray(); 22 size = elementData.length; 23 // c.toArray might (incorrectly) not return Object[] (see 6260652) 24 if (elementData.getClass() != Object[].class) 25 elementData = Arrays.copyOf(elementData, size, Object[].class); 26 }
下面通过默认的构造方法来创建一个java.util.ArrayList<E>的实例
1 ArrayList<Integer> list = new ArrayList<Integer>();
2. ArrayList中5个常用的修改操作
2.1 ArrayList常用方法
修改操作:
(1) public boolean add(E e)
功能: 向ArrayList列表中添加一个元素e
示例代码:
1 ArrayList<Integer> list = new ArrayList<Integer>(); 2 //测试ArrayList的add(E e)方法的使用,向列表中添加5个元素 3 list.add(1); 4 list.add(11); 5 list.add(8); 6 list.add(99); 7 list.add(12); 8 //输出ArrayList列表中的元素 9 System.out.println("list :" + list); 10 11 12 输出结果为: 13 list :[1, 11, 8, 99, 12]
源代码如下:
1 public boolean add(E e) { 2 //列表容量检查,如果需要扩容,则进行扩容 3 ensureCapacityInternal(size + 1); 4 //将元素e放置在集合的size位置,size的值加1 5 elementData[size++] = e; 6 //此方法添加元素成功则返回true 7 return true; 8 }
(2) void add(int index,E element)
功能: 向ArrayList列表中的index位置添加一个元素element
示例代码:
ArrayList<Integer> list = new ArrayList<Integer>(); //测试ArrayList的add(int index,E element)方法的使用,向列表中添加5个元素 list.add(0,44);//将元素44添加到列表中的第0个位置 list.add(1,33);//将元素33添加到列表中的第1个位置 list.add(2,22);//将元素22添加到列表中的第2个位置 list.add(1,66);//将元素66添加到列表中的第1个位置 list.add(4,99);//将元素99添加到列表中的第4个位置 System.out.println("list :" + list); list.add(9,88);//将元素88添加到列表中的第9个位置(此方法将会抛出抛出) 运行结果: list :[44, 66, 33, 22, 99] Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 9, Size: 5 at java.util.ArrayList.rangeCheckForAdd(Unknown Source) at java.util.ArrayList.add(Unknown Source) at ArrayListTest.main(ArrayListTest.java:14)
源代码如下:
1 public void add(int index, E element) { 2 //检查index参数是否合法 3 rangeCheckForAdd(index); 4 //检查是否需要扩容,如果有必要则进行扩容处理 5 ensureCapacityInternal(size + 1); // Increments modCount!! 6 //将列表中的元素从Index位置往后移动 7 System.arraycopy(elementData, index, elementData, index + 1,size - index); 8 //将元素element放置在列表的index位置上 9 elementData[index] = element; 10 //列表中元素个数加1 11 size++; 12 }
(3) E remove(int index)
功能: 删除列表中index位置的元素,并且返回被删除的元素
示例代码:
1 ArrayList<Integer> list = new ArrayList<Integer>(); 2 list.add(0,44); 3 list.add(1,33); 4 list.add(2,22); 5 list.add(1,66); 6 list.add(4,99); 7 System.out.println("list :" + list); 8 //测试ArrayList的remove(Object o)方法的使用 9 list.remove(2);//删除下标索引为2的元素 10 System.out.println("list :" + list); 11 list.remove(29);//删除下标索引为29的元素(此方法将会抛出异常) 12 13 运行结果: 14 list :[44, 66, 33, 22, 99] 15 list :[44, 66, 22, 99] 16 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 29, Size: 4 17 at java.util.ArrayList.rangeCheck(Unknown Source) 18 at java.util.ArrayList.remove(Unknown Source) 19 at ArrayListTest.main(ArrayListTest.java:16)
源代码如下:
1 public E remove(int index) { 2 //对参数index进行合法性检查,如果不合法则抛出异常 3 rangeCheck(index); 4 //fast-fail机制标识加1 5 modCount++; 6 //用临时变量来记录列表index位置的元素值 7 E oldValue = elementData(index); 8 //计算列表中元素需要移位的数量 9 int numMoved = size - index - 1; 10 if (numMoved > 0) 11 System.arraycopy(elementData, index+1, elementData, index, numMoved); 12 //将列表中size除的元素设置为null,便于GC回收 13 elementData[--size] = null; // Let gc do its work 14 //返回被删除的元素 15 return oldValue; 16 } 17
(4) boolean remove(Object o)
功能: 删除列表中的o元素
示例代码:
1 ArrayList<Integer> list = new ArrayList<Integer>(); 2 list.add(0,44); 3 list.add(1,33); 4 list.add(2,22); 5 list.add(1,66); 6 list.add(4,99); 7 System.out.println("list :" + list); 8 //测试ArrayList的remove(Object o)方法的使用 9 list.remove(new Integer(22)); 10 System.out.println("list :" + list); 11 list.remove(new Integer(88)); 12 System.out.println("list :" + list); 13 14 运行结果: 15 list :[44, 66, 33, 22, 99] 16 list :[44, 66, 33, 99] 17 list :[44, 66, 33, 99]
源代码如下:
1 public boolean remove(Object o) { 2 if (o == null) { 3 //如果元素o为null,则循环在列表中查询null 4 for (int index = 0; index < size; index++) 5 6 if (elementData[index] == null) { 7 //在列表中找到对象为null的index位置后,调用fastRemove()方法进行删除 8 fastRemove(index); 9 return true; 10 } 11 } else { 12 //如果元素o不为null,则循环在列表中查询元素o 13 for (int index = 0; index < size; index++) 14 if (o.equals(elementData[index])) { 15 //在列表中找到对象o的index位置后,调用fastRemove()方法进行删除 16 fastRemove(index); 17 return true; 18 } 19 } 20 return false; 21 } 22 23 //私有方法 : 快速删除列表index位置上的元素 24 private void fastRemove(int index) { 25 //fast-fail机制标识加1 26 modCount++; 27 //计算出列表需要移位的数量 28 int numMoved = size - index - 1; 29 //进行移位操作 30 if (numMoved > 0) 31 System.arraycopy(elementData, index+1, elementData, index,numMoved); 32 //将列表中size位置的元素置为null,方便GC回收 33 elementData[--size] = null; // Let gc do its work 34 }
(5)E set(int index,E element)
功能: 将列表中index位置的元素替换为element,并且返回老值
示例代码:
1 ArrayList<Integer> list = new ArrayList<Integer>(); 2 list.add(0,44); 3 list.add(1,33); 4 list.add(2,22); 5 list.add(1,66); 6 list.add(4,99); 7 System.out.println("list :" + list); 8 //测试ArrayList的set(int index,E element)方法的使用 9 list.set(3, 123); 10 System.out.println("list :" + list); 11 list.set(31, 333);//此方法将会抛出异常 12 System.out.println("list :" + list); 13 14 运行结果: 15 list :[44, 66, 33, 22, 99] 16 list :[44, 66, 33, 123, 99] 17 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 31, Size: 5 18 at java.util.ArrayList.rangeCheck(Unknown Source) 19 at java.util.ArrayList.set(Unknown Source) 20 at ArrayListTest.main(ArrayListTest.java:16)
源代码如下:
1 public E set(int index, E element) { 2 //检查index参数是否合法 3 rangeCheck(index); 4 //用临时变量记录列表中原index位置的值 5 E oldValue = elementData(index); 6 //将列表index位置的值设置为element 7 elementData[index] = element; 8 //返回原来的老值 9 return oldValue; 10 }
---------------------------------------------------------------------------
java.util.ArrayList系列文章
java.util.ArrayList<E>(1) java.util.ArrayList<E>(2) java.util.ArrayList<E>(3)
java.util.ArrayList<E>(4) java.util.ArrayList<E>(5) java.util.ArrayList<E>(6)
相关知识
java.util.Collection<E> java.util.AbstractCollection<E> java.util.List<E>
java.util.AbstractList<E> java.util.Iterator<E> java.util.ListIterator<E>
Java中的标记接口 迭代器模式 Java中的深拷贝和浅拷贝 java.util.Arrays