zoukankan      html  css  js  c++  java
  • 内功心法 -- 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

  • 相关阅读:
    数据库内连接、外连接与自连接
    安装MySQL容易出现的问题
    安装MySQL时提示3306端口已被占用的解决方案
    Smoke Testing
    冒烟测试与BVT测试
    以操作系统的角度述说线程与进程
    Notepad++配置Python开发环境
    Notepad++使用教程
    Sublime Text 皮肤插件安装
    小狼毫输入法常用设置
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/6370197.html
Copyright © 2011-2022 走看看