• 内功心法 -- 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

                                                                            

     

  • 相关阅读:
    HTTP协议
    HTTP请求
    scoket
    Git的简绍
    SpringBoot添加“热部署”
    SpringBoot入门(简绍和案例)
    JVisual VM工具使用以及垃圾回收机制
    jstack应用
    Jvm优化(1)
    Spring Data ElasticSearch的使用十个小案例
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/6351295.html
Copyright © 2020-2023  润新知