内功心法 -- java.util.ArrayList<E> (6)

写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对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>

Java中的标记接口   迭代器模式   Java中的深拷贝和浅拷贝  java.util.Arrays

原文地址:https://www.cnblogs.com/xinhuaxuan/p/6370197.html