写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>中的其他操作和数组操作进行介绍,主要内容包括:
1、其他操作
2、数组操作
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1、ArrayList的其他操作和数组操作
其他操作和数组操作
(1)Object clone() , 关于java中的深拷贝和浅拷贝可以看看这里的介绍
功能: 返回此列表实例的浅复制
示例代码:
1 import java.util.ArrayList; 2 3 public class ArrayListTest { 4 public static void main(String[] args) { 5 ArrayList<Integer> list = new ArrayList<Integer>(); 6 list.add(22); 7 list.add(33); 8 list.add(44); 9 list.add(11); 10 list.add(15); 11 list.add(12); 12 list.add(7); 13 list.add(3); 14 System.out.println("list1 :" + list); 15 //测试ArrayList的'Object clone()'方法的使用 16 ArrayList<Integer> list2 = (ArrayList<Integer>) list.clone(); 17 System.out.println("list2 :" + list2); 18 System.out.println("-----------------"); 19 list2.set(1, 3333); 20 System.out.println("list1 :" + list); 21 System.out.println("list2 :" + list2); 22 } 23 } 24 25 运行结果: 26 list1 :[22, 33, 44, 11, 15, 12, 7, 3] 27 list2 :[22, 33, 44, 11, 15, 12, 7, 3] 28 ----------------- 29 list1 :[22, 33, 44, 11, 15, 12, 7, 3] 30 list2 :[22, 3333, 44, 11, 15, 12, 7, 3]
源代码如下:
1 public Object clone() { 2 try { 3 @SuppressWarnings("unchecked") 4 //进行浅拷贝 5 ArrayList<E> v = (ArrayList<E>) super.clone(); 6 //为拷贝的新对象设置属性值 7 v.elementData = Arrays.copyOf(elementData, size); 8 v.modCount = 0; 9 return v; 10 } catch (CloneNotSupportedException e) { 11 // this shouldn't happen, since we are Cloneable 12 throw new InternalError(); 13 } 14 }
(2) void ensureCapaCity(int minCapacity)
功能:如有必要,增加此列表实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数
源代码如下:
1 /* 2 确保列表容量足够 3 */ 4 public void ensureCapacity(int minCapacity) { 5 //如果参数minCapacity>0,则调用内部方法ensureCapacityInternal 6 if (minCapacity > 0) 7 ensureCapacityInternal(minCapacity); 8 } 9 10 /* 11 内部私有方法,确保列表容量足够 12 */ 13 private void ensureCapacityInternal(int minCapacity) { 14 //fast-fail机制标识加1 15 modCount++; 16 // overflow-conscious code 17 //参数minCapacity比当前列表容量大,则调用私有方法grow 18 if (minCapacity - elementData.length > 0) 19 grow(minCapacity); 20 } 21 22 /* 23 内部私有方法, 24 */ 25 private void grow(int minCapacity) { 26 // overflow-conscious code 27 //记录当前列表容量大小 28 int oldCapacity = elementData.length; 29 //计划扩容大小为原列表容量大小的1.5倍 30 int newCapacity = oldCapacity + (oldCapacity >> 1); 31 //如果计划扩容的值 比 参数minCapacity小,则用minCapacity的值作为扩展的大小 32 if (newCapacity - minCapacity < 0) 33 newCapacity = minCapacity; 34 35 //检查扩容的容量是否大于 列表允许的最大容量 36 if (newCapacity - MAX_ARRAY_SIZE > 0) 37 newCapacity = hugeCapacity(minCapacity); 38 // minCapacity is usually close to size, so this is a win: 39 //调用java.util.Arrays的copyOf方法对原数组elementData进行复制,复制的长度为newCapacity 40 elementData = Arrays.copyOf(elementData, newCapacity); 41 } 42 43 private static int hugeCapacity(int minCapacity) { 44 if (minCapacity < 0) // overflow 45 throw new OutOfMemoryError(); 46 return (minCapacity > MAX_ARRAY_SIZE) ? 47 Integer.MAX_VALUE : 48 MAX_ARRAY_SIZE; 49 }
(3)void trimToSize()
功能:将此列表的容量调整为列表的当前元素个数
源代码如下:
1 public void trimToSize() { 2 //fast-fail机制标识加1 3 modCount++; 4 //记录原列表容量大小 5 int oldCapacity = elementData.length; 6 //如果列表中元素个数 小于 列表容量带下,则对列表容量进行缩小 7 if (size < oldCapacity) { 8 elementData = Arrays.copyOf(elementData, size); 9 } 10 }
(4)Object[] toArray()
功能:按适当顺序返回包含此列表中所有元素的数组
源代码如下:
1 public Object[] toArray() { 2 return Arrays.copyOf(elementData, size); 3 }
(5)<T> T[] toArray(T[] a)
功能:按适当顺序返回包含此列表中所有元素的数组
源代码如下:
1 @SuppressWarnings("unchecked") 2 public <T> T[] toArray(T[] a) { 3 if (a.length < size) 4 // Make a new array of a's runtime type, but my contents: 5 return (T[]) Arrays.copyOf(elementData, size, a.getClass()); 6 System.arraycopy(elementData, 0, a, 0, size); 7 if (a.length > size) 8 a[size] = null; 9 return a; 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>