zoukankan      html  css  js  c++  java
  • List集合学习

    Java中常用的List子类主要有:ArrayList、LinkedList、Vector。有序(存储和取出的元素一致),可重复的。

    三者比较

        1:访问:ArrayList和Vector都实现了RandomAccess接口,提供了随机访问功能,查询O(1);LinkedList是链表,查询O(n);

        2:增删:ArrayList和Vector底层是数组,增删容易引起大量的内存操作,效率较慢;LinkedList是链表实现,增加和删除较快;

        3:线程安全性:Vector是线程安全的,大部分的方法都用了syncrhoized关键字修饰。如果是单线程下使用,可以用Arrayist,如果是多线程操作的list,则可以用Vector来保证线程安全。

        4:ArrayList每次扩容增加50%,Vector扩容增加一倍。

      一:ArrayList

       ArrayList实现了List接口,实现了一系列的add()/get()/clear()/remove()等接口中的方法。其底层其实是一个数组,通过对数组上一系列操作的封装来实现list的各种功能的。

       1:ArrayList 实际上是通过一个数组去保存数据的。当我们构造ArrayList时;若使用默认构造函数,则ArrayList的默认容量大小是10
          2:当ArrayList容量不足以容纳全部元素时,ArrayList扩容:新的容量=“(原始容量x3)/2 + 1”。创建新容量大小的数组并把原数组内容复制过去。

       3:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
    底层源码:

      1 package java.util;
      2 
      3 public class ArrayList<E> extends AbstractList<E>
      4         implements List<E>, RandomAccess, Cloneable, java.io.Serializable
      5 {
      6     // 序列版本号
      7     private static final long serialVersionUID = 8683452581122892189L;
      8 
      9     // 保存ArrayList中数据的数组
     10     private transient Object[] elementData;
     11 
     12     // ArrayList中实际数据的数量
     13     private int size;
     14 
     15     // ArrayList带容量大小的构造函数。
     16     public ArrayList(int initialCapacity) {
     17         super();
     18         if (initialCapacity < 0)
     19             throw new IllegalArgumentException("Illegal Capacity: "+
     20                                                initialCapacity);
     21         // 新建一个数组
     22         this.elementData = new Object[initialCapacity];
     23     }
     24 
     25     // ArrayList构造函数。默认容量是10。
     26     public ArrayList() {
     27         this(10);
     28     }
     29 
     30     // 创建一个包含collection的ArrayList
     31     public ArrayList(Collection<? extends E> c) {
     32         elementData = c.toArray();
     33         size = elementData.length;
     34         // c.toArray might (incorrectly) not return Object[] (see 6260652)
     35         if (elementData.getClass() != Object[].class)
     36             elementData = Arrays.copyOf(elementData, size, Object[].class);
     37     }
     38 
     39 
     40     // 将当前容量值设为 =实际元素个数
     41     public void trimToSize() {
     42         modCount++;
     43         int oldCapacity = elementData.length;
     44         if (size < oldCapacity) {
     45             elementData = Arrays.copyOf(elementData, size);
     46         }
     47     }
     48 
     49 
     50     // 确定ArrarList的容量。
     51     // 若ArrayList的容量不足以容纳当前的全部元素,设置 新的容量=“(原始容量x3)/2 + 1”
     52     public void ensureCapacity(int minCapacity) {
     53         // 将“修改统计数”+1
     54         modCount++;
     55         int oldCapacity = elementData.length;
     56         // 若当前容量不足以容纳当前的元素个数,设置 新的容量=“(原始容量x3)/2 + 1”
     57         if (minCapacity > oldCapacity) {
     58             Object oldData[] = elementData;
     59             int newCapacity = (oldCapacity * 3)/2 + 1;
     60             if (newCapacity < minCapacity)
     61                 newCapacity = minCapacity;
     62             elementData = Arrays.copyOf(elementData, newCapacity);
     63         }
     64     }
     65 
     66     // 添加元素e
     67     public boolean add(E e) {
     68         // 确定ArrayList的容量大小
     69         ensureCapacity(size + 1);  // Increments modCount!!
     70         // 添加e到ArrayList中
     71         elementData[size++] = e;
     72         return true;
     73     }
     74 
     75     // 返回ArrayList的实际大小
     76     public int size() {
     77         return size;
     78     }
     79 
     80     // 返回ArrayList是否包含Object(o)
     81     public boolean contains(Object o) {
     82         return indexOf(o) >= 0;
     83     }
     84 
     85     // 返回ArrayList是否为空
     86     public boolean isEmpty() {
     87         return size == 0;
     88     }
     89 
     90     // 正向查找,返回元素的索引值
     91     public int indexOf(Object o) {
     92         if (o == null) {
     93             for (int i = 0; i < size; i++)
     94             if (elementData[i]==null)
     95                 return i;
     96             } else {
     97                 for (int i = 0; i < size; i++)
     98                 if (o.equals(elementData[i]))
     99                     return i;
    100             }
    101             return -1;
    102         }
    103 
    104         // 反向查找,返回元素的索引值
    105         public int lastIndexOf(Object o) {
    106         if (o == null) {
    107             for (int i = size-1; i >= 0; i--)
    108             if (elementData[i]==null)
    109                 return i;
    110         } else {
    111             for (int i = size-1; i >= 0; i--)
    112             if (o.equals(elementData[i]))
    113                 return i;
    114         }
    115         return -1;
    116     }
    117 
    118     // 反向查找(从数组末尾向开始查找),返回元素(o)的索引值
    119     public int lastIndexOf(Object o) {
    120         if (o == null) {
    121             for (int i = size-1; i >= 0; i--)
    122             if (elementData[i]==null)
    123                 return i;
    124         } else {
    125             for (int i = size-1; i >= 0; i--)
    126             if (o.equals(elementData[i]))
    127                 return i;
    128         }
    129         return -1;
    130     }
    131  
    132 
    133     // 返回ArrayList的Object数组
    134     public Object[] toArray() {
    135         return Arrays.copyOf(elementData, size);
    136     }
    137 
    138     // 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型
    139     public <T> T[] toArray(T[] a) {
    140         // 若数组a的大小 < ArrayList的元素个数;
    141         // 则新建一个T[]数组,数组大小是“ArrayList的元素个数”,并将“ArrayList”全部拷贝到新数组中
    142         if (a.length < size)
    143             return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    144 
    145         // 若数组a的大小 >= ArrayList的元素个数;
    146         // 则将ArrayList的全部元素都拷贝到数组a中。
    147         System.arraycopy(elementData, 0, a, 0, size);
    148         if (a.length > size)
    149             a[size] = null;
    150         return a;
    151     }
    152 
    153     // 获取index位置的元素值
    154     public E get(int index) {
    155         RangeCheck(index);
    156 
    157         return (E) elementData[index];
    158     }
    159 
    160     // 设置index位置的值为element
    161     public E set(int index, E element) {
    162         RangeCheck(index);
    163 
    164         E oldValue = (E) elementData[index];
    165         elementData[index] = element;
    166         return oldValue;
    167     }
    168 
    169     // 将e添加到ArrayList中
    170     public boolean add(E e) {
    171         ensureCapacity(size + 1);  // Increments modCount!!
    172         elementData[size++] = e;
    173         return true;
    174     }
    175 
    176     // 将e添加到ArrayList的指定位置
    177     public void add(int index, E element) {
    178         if (index > size || index < 0)
    179             throw new IndexOutOfBoundsException(
    180             "Index: "+index+", Size: "+size);
    181 
    182         ensureCapacity(size+1);  // Increments modCount!!
    183         System.arraycopy(elementData, index, elementData, index + 1,
    184              size - index);
    185         elementData[index] = element;
    186         size++;
    187     }
    188 
    189     // 删除ArrayList指定位置的元素
    190     public E remove(int index) {
    191         RangeCheck(index);
    192 
    193         modCount++;
    194         E oldValue = (E) elementData[index];
    195 
    196         int numMoved = size - index - 1;
    197         if (numMoved > 0)
    198             System.arraycopy(elementData, index+1, elementData, index,
    199                  numMoved);
    200         elementData[--size] = null; // Let gc do its work
    201 
    202         return oldValue;
    203     }
    204 
    205     // 删除ArrayList的指定元素
    206     public boolean remove(Object o) {
    207         if (o == null) {
    208                 for (int index = 0; index < size; index++)
    209             if (elementData[index] == null) {
    210                 fastRemove(index);
    211                 return true;
    212             }
    213         } else {
    214             for (int index = 0; index < size; index++)
    215             if (o.equals(elementData[index])) {
    216                 fastRemove(index);
    217                 return true;
    218             }
    219         }
    220         return false;
    221     }
    222 
    223 
    224     // 快速删除第index个元素
    225     private void fastRemove(int index) {
    226         modCount++;
    227         int numMoved = size - index - 1;
    228         // 从"index+1"开始,用后面的元素替换前面的元素。
    229         if (numMoved > 0)
    230             System.arraycopy(elementData, index+1, elementData, index,
    231                              numMoved);
    232         // 将最后一个元素设为null
    233         elementData[--size] = null; // Let gc do its work
    234     }
    235 
    236     // 删除元素
    237     public boolean remove(Object o) {
    238         if (o == null) {
    239             for (int index = 0; index < size; index++)
    240             if (elementData[index] == null) {
    241                 fastRemove(index);
    242             return true;
    243             }
    244         } else {
    245             // 便利ArrayList,找到“元素o”,则删除,并返回true。
    246             for (int index = 0; index < size; index++)
    247             if (o.equals(elementData[index])) {
    248                 fastRemove(index);
    249             return true;
    250             }
    251         }
    252         return false;
    253     }
    254 
    255     // 清空ArrayList,将全部的元素设为null
    256     public void clear() {
    257         modCount++;
    258 
    259         for (int i = 0; i < size; i++)
    260             elementData[i] = null;
    261 
    262         size = 0;
    263     }
    264 
    265     // 将集合c追加到ArrayList中
    266     public boolean addAll(Collection<? extends E> c) {
    267         Object[] a = c.toArray();
    268         int numNew = a.length;
    269         ensureCapacity(size + numNew);  // Increments modCount
    270         System.arraycopy(a, 0, elementData, size, numNew);
    271         size += numNew;
    272         return numNew != 0;
    273     }
    274 
    275     // 从index位置开始,将集合c添加到ArrayList
    276     public boolean addAll(int index, Collection<? extends E> c) {
    277         if (index > size || index < 0)
    278             throw new IndexOutOfBoundsException(
    279             "Index: " + index + ", Size: " + size);
    280 
    281         Object[] a = c.toArray();
    282         int numNew = a.length;
    283         ensureCapacity(size + numNew);  // Increments modCount
    284 
    285         int numMoved = size - index;
    286         if (numMoved > 0)
    287             System.arraycopy(elementData, index, elementData, index + numNew,
    288                  numMoved);
    289 
    290         System.arraycopy(a, 0, elementData, index, numNew);
    291         size += numNew;
    292         return numNew != 0;
    293     }
    294 
    295     // 删除fromIndex到toIndex之间的全部元素。
    296     protected void removeRange(int fromIndex, int toIndex) {
    297     modCount++;
    298     int numMoved = size - toIndex;
    299         System.arraycopy(elementData, toIndex, elementData, fromIndex,
    300                          numMoved);
    301 
    302     // Let gc do its work
    303     int newSize = size - (toIndex-fromIndex);
    304     while (size != newSize)
    305         elementData[--size] = null;
    306     }
    307 
    308     private void RangeCheck(int index) {
    309     if (index >= size)
    310         throw new IndexOutOfBoundsException(
    311         "Index: "+index+", Size: "+size);
    312     }
    313 
    314 
    315     // 克隆函数
    316     public Object clone() {
    317         try {
    318             ArrayList<E> v = (ArrayList<E>) super.clone();
    319             // 将当前ArrayList的全部元素拷贝到v中
    320             v.elementData = Arrays.copyOf(elementData, size);
    321             v.modCount = 0;
    322             return v;
    323         } catch (CloneNotSupportedException e) {
    324             // this shouldn't happen, since we are Cloneable
    325             throw new InternalError();
    326         }
    327     }
    328 
    329 
    330     // java.io.Serializable的写入函数
    331     // 将ArrayList的“容量,所有的元素值”都写入到输出流中
    332     private void writeObject(java.io.ObjectOutputStream s)
    333         throws java.io.IOException{
    334     // Write out element count, and any hidden stuff
    335     int expectedModCount = modCount;
    336     s.defaultWriteObject();
    337 
    338         // 写入“数组的容量”
    339         s.writeInt(elementData.length);
    340 
    341     // 写入“数组的每一个元素”
    342     for (int i=0; i<size; i++)
    343             s.writeObject(elementData[i]);
    344 
    345     if (modCount != expectedModCount) {
    346             throw new ConcurrentModificationException();
    347         }
    348 
    349     }
    350 
    351 
    352     // java.io.Serializable的读取函数:根据写入方式读出
    353     // 先将ArrayList的“容量”读出,然后将“所有的元素值”读出
    354     private void readObject(java.io.ObjectInputStream s)
    355         throws java.io.IOException, ClassNotFoundException {
    356         // Read in size, and any hidden stuff
    357         s.defaultReadObject();
    358 
    359         // 从输入流中读取ArrayList的“容量”
    360         int arrayLength = s.readInt();
    361         Object[] a = elementData = new Object[arrayLength];
    362 
    363         // 从输入流中将“所有的元素值”读出
    364         for (int i=0; i<size; i++)
    365             a[i] = s.readObject();
    366     }
    367 }
    View Code

     Java中对ArrayList集合的常用操作

    1.list中添加,获取,删除元素;

    2.list中是否包含某个元素;

    3.list中根据索引将元素数值改变(替换);

    4.list中查看(判断)元素的索引;

    5.根据元素索引位置进行的判断;

    6.利用list中索引位置重新生成一个新的list(截取集合);

    7.对比两个list中的所有元素;

    8.判断list是否为空;

    9.返回Iterator集合对象;

    10.将集合转换为字符串;

    11.将集合转换为数组;

    12.集合类型转换;

    备注:内容中代码具有关联性。

    1.list中添加,获取,删除元素;
    添加方法是:.add(e); 
    获取方法是:.get(index);  
    按照索引删除方法是:.remove(index)
    按照元素内容删除方法是:.remove(Object o); List
    <String> person=new ArrayList<>(); person.add("jackie"); //索引为0 //.add(e) person.add("peter"); //索引为1 person.add("annie"); //索引为2 person.add("martin"); //索引为3 person.add("marry"); //索引为4 person.remove(3); //.remove(index) person.remove("marry"); //.remove(Object o) String per=""; per=person.get(1); System.out.println(per); //.get(index) for (int i = 0; i < person.size(); i++) { System.out.println(person.get(i)); //.get(index) } 2.list中是否包含某个元素; 方法:.contains(Object o); 返回true或者false List<String> fruits=new ArrayList<>(); fruits.add("苹果"); fruits.add("香蕉"); fruits.add("桃子"); //for循环遍历list for (int i = 0; i < fruits.size(); i++) { System.out.println(fruits.get(i)); } String appleString="苹果"; //true or false System.out.println("fruits中是否包含苹果:"+fruits.contains(appleString)); if (fruits.contains(appleString)) { System.out.println("我喜欢吃苹果"); }else { System.out.println("我不开心"); } 3.list中根据索引将元素数值改变(替换); 注意 .set(index, element); 和 .add(index, element); 的不同; String a="白龙马", b="沙和尚", c="八戒", d="唐僧", e="悟空"; List<String> people=new ArrayList<>(); people.add(a); people.add(b); people.add(c); people.set(0, d); //.set(index, element); //将d唐僧放到list中索引为0的位置,替换a白龙马 people.add(1, e); //.add(index, element); //将e悟空放到list中索引为1的位置,原来位置的b沙和尚后移一位 //增强for循环遍历list for(String str:people){ System.out.println(str); } 4.list中查看(判断)元素的索引;   注意:indexOf()和lastIndexOf()的不同; List<String> names=new ArrayList<>(); names.add("刘备"); //索引为0 names.add("关羽"); //索引为1 names.add("张飞"); //索引为2 names.add("刘备"); //索引为3 names.add("张飞"); //索引为4 System.out.println(names.indexOf("刘备")); System.out.println(names.lastIndexOf("刘备")); System.out.println(names.indexOf("张飞")); System.out.println(names.lastIndexOf("张飞")); 5.根据元素索引位置进行的判断; if (names.indexOf("刘备")==0) { System.out.println("刘备在这里"); }else if (names.lastIndexOf("刘备")==3) { System.out.println("刘备在那里"); }else { System.out.println("刘备到底在哪里?"); } 6.利用list中索引位置重新生成一个新的list(截取集合); 方法: .subList(fromIndex,toIndex);.size();该方法得到list中的元素数的和 List<String> phone=new ArrayList<>(); phone.add("三星"); //索引为0 phone.add("苹果"); //索引为1 phone.add("锤子"); //索引为2 phone.add("华为"); //索引为3 phone.add("小米"); //索引为4 //原list进行遍历 for(String pho:phone){ System.out.println(pho); } //生成新list phone=phone.subList(1, 4); //.subList(fromIndex, toIndex) //利用索引1-4的对象重新生成一个list,但是不包含索引为4的元素,4-1=3 for (int i = 0; i < phone.size(); i++) { // phone.size() 该方法得到list中的元素数的和 System.out.println("新的list包含的元素是"+phone.get(i)); } 7.对比两个list中的所有元素;
    //两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象 //1.<BR>if (person.equals(fruits)) { System.out.println("两个list中的所有元素相同"); }else { System.out.println("两个list中的所有元素不一样"); } //2. if (person.hashCode()==fruits.hashCode()) { System.out.println("我们相同"); }else { System.out.println("我们不一样"); } 8.判断list是否为空; //空则返回true,非空则返回false if (person.isEmpty()) { System.out.println("空的"); }else { System.out.println("不是空的"); } 9.返回Iterator集合对象; System.out.println("返回Iterator集合对象:"+person.iterator()); 10.将集合转换为字符串; String liString=""; liString=person.toString(); System.out.println("将集合转换为字符串:"+liString); 11.将集合转换为数组; System.out.println("将集合转换为数组:"+person.toArray()); 12.集合类型转换; //1.默认类型 List<Object> listsStrings=new ArrayList<>();   for (int i = 0; i < person.size(); i++) { listsStrings.add(person.get(i)); } //2.指定类型 List<StringBuffer> lst=new ArrayList<>();   for(String string:person){   lst.add(StringBuffer(string)); }

    二:LinkedList

        LinkedList通过另一种方式实现List接口,不仅如此,它还实现了 Queue、Deque接口,使得LinkedList可以作为栈、队列、双端队列来使用

     LinkedList底层是一个双向链表。其对于 List、Queue、Deque接口中的方法都是通过封装在链表上的操作来实现的。查询慢,增删快。线程不安全,效率高。

    底层源码:

      1 package com.chy.collection.core;  
      2       
      3     import java.util.AbstractSequentialList;  
      4     import java.util.Collections;  
      5     import java.util.ConcurrentModificationException;  
      6     import java.util.Deque;  
      7     import java.util.Iterator;  
      8     import java.util.NoSuchElementException;  
      9     import java.util.Queue;  
     10     import java.util.Vector;  
     11       
     12     /** 
     13      * LinkedList实际上是通过双向链表去实现的、整个链表是通过Entry实体类来存储数据的 
     14      */  
     15       
     16     public class LinkedList<E>  
     17         extends AbstractSequentialList<E>  
     18         implements List<E>, Deque<E>, Cloneable, java.io.Serializable  
     19     {  
     20         //链表的表头、表头不包含任何数据、  
     21         //Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值,上一个节点,下一个节点。  
     22         private transient Entry<E> header = new Entry<E>(null, null, null);  
     23           
     24         // LinkedList中元素个数  
     25         private transient int size = 0;  
     26       
     27         /** 
     28          * 构造一个空的LinkedList、只含有表头 
     29          */  
     30         public LinkedList() {  
     31             header.next = header.previous = header;  
     32         }  
     33       
     34         /** 
     35          * 创建一个包含c的LinkedList、先创建默认空、然后将c中所有元素添加到LinkedList中 
     36          */  
     37         public LinkedList(Collection<? extends E> c) {  
     38             this();  
     39             addAll(c);  
     40         }  
     41       
     42         /** 获取链表第一个元素、*/  
     43         public E getFirst() {  
     44             if (size==0)  
     45                 throw new NoSuchElementException();  
     46             //因其是双向链表、这里的header可视为顺序的第一个不含元素的表头、所以第一个是此header的下一个元素  
     47             return header.next.element;  
     48         }  
     49       
     50         /** 获取链表最后一个元素*/  
     51         public E getLast()  {  
     52         if (size==0)  
     53             throw new NoSuchElementException();  
     54             //因其是双向链表、这里的header可视为逆序的第一个不含元素的表头、所以最后一个是此header的上一个元素  
     55             return header.previous.element;  
     56         }  
     57       
     58         /** 删除LinkedList的第一个元素*/  
     59         public E removeFirst() {  
     60             return remove(header.next);  
     61         }  
     62       
     63         /** 删除LinkedList的最后一个元素*/  
     64         public E removeLast() {  
     65             return remove(header.previous);  
     66         }  
     67       
     68         /** 将元素e添加到LinkedList的起始位置*/  
     69         public void addFirst(E e) {  
     70             addBefore(e, header.next);  
     71         }  
     72       
     73         /** 将元素e添加到LinkedList的结束位置*/  
     74         public void addLast(E e) {  
     75             addBefore(e, header);  
     76         }  
     77       
     78         /** 判断是否包含Object o*/  
     79         public boolean contains(Object o) {  
     80             return indexOf(o) != -1;  
     81         }  
     82       
     83         /** 返回LinkedList的大小*/  
     84         public int size() {  
     85             return size;  
     86         }  
     87       
     88         /** 将元素(E)添加到LinkedList中、添加到末尾*/  
     89         public boolean add(E e) {  
     90             addBefore(e, header);  
     91             return true;  
     92         }  
     93       
     94         /** 从LinkedList中删除o、如果存在则删除第一查找到的o并返回true、若不存在则返回false*/  
     95         public boolean remove(Object o) {  
     96             if (o==null) {  
     97                 for (Entry<E> e = header.next; e != header; e = e.next) {  
     98                     if (e.element==null) {  
     99                         remove(e);  
    100                         return true;  
    101                     }  
    102                 }  
    103             } else {  
    104                 for (Entry<E> e = header.next; e != header; e = e.next) {  
    105                     if (o.equals(e.element)) {  
    106                         remove(e);  
    107                         return true;  
    108                     }  
    109                 }  
    110             }  
    111             return false;  
    112         }  
    113       
    114         /** 将c中元素添加到双向链表LinkedList中、从尾部开始添加*/  
    115         public boolean addAll(Collection<? extends E> c) {  
    116             return addAll(size, c);  
    117         }  
    118       
    119         /** 将c中元素添加到双向链表LinkedList中、所有元素添加到index与index+1表示的元素中间*/  
    120         public boolean addAll(int index, Collection<? extends E> c) {  
    121             if (index < 0 || index > size)  
    122                 throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size);  
    123             //将c转换成数组、方便遍历元素和获取元素个数  
    124             Object[] a = c.toArray();  
    125             int numNew = a.length;  
    126             if (numNew==0)  
    127                 return false;  
    128             modCount++;  
    129       
    130             //设置当前要插入节点的下一个节点  
    131             Entry<E> successor = (index==size ? header : entry(index));  
    132             //设置当前要插入节点的上一个节点  
    133             Entry<E> predecessor = successor.previous;  
    134             //将c中元素插入到LinkedList中  
    135             for (int i=0; i<numNew; i++) {  
    136                 Entry<E> e = new Entry<E>((E)a[i], successor, predecessor);  
    137                 predecessor.next = e;  
    138                 predecessor = e;  
    139             }  
    140             successor.previous = predecessor;  
    141             size += numNew;  
    142             return true;  
    143         }  
    144       
    145         /** 删除LinkedList中所有元素*/  
    146         public void clear() {  
    147             Entry<E> e = header.next;  
    148             while (e != header) {  
    149                 Entry<E> next = e.next;  
    150                 e.next = e.previous = null;  
    151                 e.element = null;  
    152                 e = next;  
    153             }  
    154             header.next = header.previous = header;  
    155             size = 0;  
    156             modCount++;  
    157         }  
    158       
    159       
    160         // Positional Access Operations  
    161       
    162         /** 获取index处的元素*/  
    163         public E get(int index) {  
    164             return entry(index).element;  
    165         }  
    166       
    167         /** 设置index处的元素、并将old元素返回*/  
    168         public E set(int index, E element) {  
    169             Entry<E> e = entry(index);  
    170             E oldVal = e.element;  
    171             e.element = element;  
    172             return oldVal;  
    173         }  
    174       
    175         /** 在index前添加节点,且节点的值为element*/  
    176         public void add(int index, E element) {  
    177             addBefore(element, (index==size ? header : entry(index)));  
    178         }  
    179       
    180         /** 删除index位置的节点*/  
    181         public E remove(int index) {  
    182             return remove(entry(index));  
    183         }  
    184       
    185         /**  获取双向链表LinkedList中指定位置的节点、是LinkedList实现List中通过index操作元素的关键*/  
    186         private Entry<E> entry(int index) {  
    187             if (index < 0 || index >= size)  
    188                 throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size);  
    189             Entry<E> e = header;  
    190             if (index < (size >> 1)) {  
    191                 for (int i = 0; i <= index; i++)  
    192                     e = e.next;  
    193             } else {  
    194                 for (int i = size; i > index; i--)  
    195                     e = e.previous;  
    196             }  
    197             return e;  
    198         }  
    199       
    200       
    201         // Search Operations  
    202       
    203         /** 查询o所在LinkedList中的位置的索引、从前向后、不存在返回-1*/  
    204         public int indexOf(Object o) {  
    205             int index = 0;  
    206             if (o==null) {  
    207                 for (Entry e = header.next; e != header; e = e.next) {  
    208                     if (e.element==null)  
    209                         return index;  
    210                     index++;  
    211                 }  
    212             } else {  
    213                 for (Entry e = header.next; e != header; e = e.next) {  
    214                     if (o.equals(e.element))  
    215                         return index;  
    216                     index++;  
    217                 }  
    218             }  
    219             return -1;  
    220         }  
    221       
    222         /** 查询o所在LinkedList中的位置的索引、从后向前、不存在返回-1*/  
    223         public int lastIndexOf(Object o) {  
    224             int index = size;  
    225             if (o==null) {  
    226                 for (Entry e = header.previous; e != header; e = e.previous) {  
    227                     index--;  
    228                     if (e.element==null)  
    229                         return index;  
    230                 }  
    231             } else {  
    232                 for (Entry e = header.previous; e != header; e = e.previous) {  
    233                     index--;  
    234                     if (o.equals(e.element))  
    235                         return index;  
    236                 }  
    237             }  
    238             return -1;  
    239         }  
    240       
    241         // Queue operations.  
    242       
    243         /** 返回第一个节点、若size为0则返回null*/  
    244         public E peek() {  
    245             if (size==0)  
    246                 return null;  
    247             return getFirst();  
    248         }  
    249       
    250         /** 返回第一个节点、若size为0则抛异常NoSuchElementException*/  
    251         public E element() {  
    252             return getFirst();  
    253         }  
    254       
    255         /** 删除并返回第一个节点 、若LinkedList的大小为0,则返回null*/  
    256         public E poll() {  
    257             if (size==0)  
    258                 return null;  
    259             return removeFirst();  
    260         }  
    261       
    262         /** 删除第一个元素、若LinkedList的大小为0,则抛异常*/  
    263         public E remove() {  
    264             return removeFirst();  
    265         }  
    266       
    267         /** 将e添加双向链表末尾*/  
    268         public boolean offer(E e) {  
    269             return add(e);  
    270         }  
    271       
    272         // Deque operations  
    273         /** 将e添加双向链表开头*/  
    274         public boolean offerFirst(E e) {  
    275             addFirst(e);  
    276             return true;  
    277         }  
    278       
    279         /** 将e添加双向链表末尾*/  
    280         public boolean offerLast(E e) {  
    281             addLast(e);  
    282             return true;  
    283         }  
    284       
    285         /**返回第一个节点、若LinkedList的大小为0,则返回null*/  
    286         public E peekFirst() {  
    287             if (size==0)  
    288                 return null;  
    289             return getFirst();  
    290         }  
    291       
    292         /**返回最后一个节点、 若LinkedList的大小为0,则返回null*/  
    293         public E peekLast() {  
    294             if (size==0)  
    295                 return null;  
    296             return getLast();  
    297         }  
    298       
    299         /** 删除并返回第一个、若LinkedList的大小为0,则返回null*/  
    300         public E pollFirst() {  
    301             if (size==0)  
    302                 return null;  
    303             return removeFirst();  
    304         }  
    305       
    306         /** 删除并返回最后一个、若LinkedList的大小为0,则返回null*/  
    307         public E pollLast() {  
    308             if (size==0)  
    309                 return null;  
    310             return removeLast();  
    311         }  
    312       
    313         /** 将e插入到双向链表开头*/  
    314         public void push(E e) {  
    315             addFirst(e);  
    316         }  
    317       
    318         /** 删除并返回第一个节点*/  
    319         public E pop() {  
    320             return removeFirst();  
    321         }  
    322       
    323         /** 从LinkedList中删除o、如果存在则删除第一查找到的o并返回true、若不存在则返回false*/  
    324         public boolean removeFirstOccurrence(Object o) {  
    325             return remove(o);  
    326         }  
    327       
    328         /** 从LinkedList末尾向前查找,删除第一个值为元素(o)的节点*/  
    329         public boolean removeLastOccurrence(Object o) {  
    330             if (o==null) {  
    331                 for (Entry<E> e = header.previous; e != header; e = e.previous) {  
    332                     if (e.element==null) {  
    333                         remove(e);  
    334                         return true;  
    335                     }  
    336                 }  
    337             } else {  
    338                 for (Entry<E> e = header.previous; e != header; e = e.previous) {  
    339                     if (o.equals(e.element)) {  
    340                         remove(e);  
    341                         return true;  
    342                     }  
    343                 }  
    344             }  
    345             return false;  
    346         }  
    347       
    348         /** 返回“index到末尾的全部节点”对应的ListIterator对象(List迭代器)*/  
    349         public ListIterator<E> listIterator(int index) {  
    350             return new ListItr(index);  
    351         }  
    352       
    353         private class ListItr implements ListIterator<E> {  
    354             // 上一次返回的节点  
    355             private Entry<E> lastReturned = header;  
    356             // 下一个节点  
    357             private Entry<E> next;  
    358             // 下一个节点对应的索引值  
    359             private int nextIndex;  
    360             // 期望的改变计数。用来实现fail-fast机制。  
    361             private int expectedModCount = modCount;  
    362               
    363             //构造函数、 从index位置开始进行迭代  
    364             ListItr(int index) {  
    365                 if (index < 0 || index > size)  
    366                     throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size);  
    367                 /* 
    368                  *  若 “index 小于 ‘双向链表长度的一半’”,则从第一个元素开始往后查找; 
    369                  *  否则,从最后一个元素往前查找。 
    370                  */  
    371                 if (index < (size >> 1)) {  
    372                     next = header.next;  
    373                     for (nextIndex=0; nextIndex<index; nextIndex++)  
    374                         next = next.next;  
    375                 } else {  
    376                     next = header;  
    377                     for (nextIndex=size; nextIndex>index; nextIndex--)  
    378                         next = next.previous;  
    379                 }  
    380             }  
    381             // 是否存在下一个元素  
    382             public boolean hasNext() {  
    383                 return nextIndex != size;  
    384             }  
    385             // 获取下一个元素  
    386             public E next() {  
    387                 checkForComodification();  
    388                 if (nextIndex == size)  
    389                 throw new NoSuchElementException();  
    390           
    391                 lastReturned = next;  
    392                 next = next.next;  
    393                 nextIndex++;  
    394                 return lastReturned.element;  
    395             }  
    396       
    397             // 是否存在上一个元素  
    398             public boolean hasPrevious() {  
    399                 return nextIndex != 0;  
    400             }  
    401             // 获取上一个元素  
    402             public E previous() {  
    403                 if (nextIndex == 0)  
    404                 throw new NoSuchElementException();  
    405           
    406                 lastReturned = next = next.previous;  
    407                 nextIndex--;  
    408                 checkForComodification();  
    409                 return lastReturned.element;  
    410             }  
    411       
    412             // 获取下一个元素的索引  
    413             public int nextIndex() {  
    414                 return nextIndex;  
    415             }  
    416           
    417             // 获取上一个元素的索引  
    418             public int previousIndex() {  
    419                 return nextIndex-1;  
    420             }  
    421             // 删除双向链表中的当前节点  
    422             public void remove() {  
    423                     checkForComodification();  
    424                     Entry<E> lastNext = lastReturned.next;  
    425                     try {  
    426                         LinkedList.this.remove(lastReturned);  
    427                     } catch (NoSuchElementException e) {  
    428                         throw new IllegalStateException();  
    429                     }  
    430                 if (next==lastReturned)  
    431                         next = lastNext;  
    432                     else  
    433                 nextIndex--;  
    434                 lastReturned = header;  
    435                 expectedModCount++;  
    436             }  
    437             // 设置当前节点为e  
    438             public void set(E e) {  
    439                 if (lastReturned == header)  
    440                 throw new IllegalStateException();  
    441                 checkForComodification();  
    442                 lastReturned.element = e;  
    443             }  
    444             // 将e添加到当前节点的前面  
    445             public void add(E e) {  
    446                 checkForComodification();  
    447                 lastReturned = header;  
    448                 addBefore(e, next);  
    449                 nextIndex++;  
    450                 expectedModCount++;  
    451             }  
    452             // 判断 “modCount和expectedModCount是否相等”,以此来实现fail-fast机制。  
    453             final void checkForComodification() {  
    454                 if (modCount != expectedModCount)  
    455                     throw new ConcurrentModificationException();  
    456             }  
    457         }  
    458       
    459         /** 
    460          * 内部静态类、是双向链表的节点所对应的数据结构、 
    461          * 此数据结构包含三部分:上一节点、下一节点、当前节点值 
    462          */  
    463         private static class Entry<E> {  
    464             //当前节点值  
    465             E element;  
    466             //下一节点  
    467             Entry<E> next;  
    468             //上一节点  
    469             Entry<E> previous;  
    470       
    471             /** 
    472              * 链表节点构造函数 
    473              * @param element   节点值 
    474              * @param next      下一节点 
    475              * @param previous  上一节点 
    476              */  
    477             Entry(E element, Entry<E> next, Entry<E> previous) {  
    478                 this.element = element;  
    479                 this.next = next;  
    480                 this.previous = previous;  
    481             }  
    482         }  
    483       
    484         //新建节点、节点值是e、将新建的节点添加到entry之前  
    485         private Entry<E> addBefore(E e, Entry<E> entry) {  
    486             //觉得难理解的可以先花个几分钟看一下链式结构资料、最好是图片形式的  
    487             //新建节点实体  
    488             Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);  
    489             //将参照节点原来的上一个节点(即插在谁前面的)的下一个节点设置成newEntry  
    490             newEntry.previous.next = newEntry;  
    491             //将参照节点(即插在谁前面的)的前一个节点设置成newEntry  
    492             newEntry.next.previous = newEntry;  
    493             size++;  
    494             modCount++;  
    495             return newEntry;  
    496         }  
    497       
    498           
    499         //将节点从链表中删除、返回被删除的节点的内容  
    500         private E remove(Entry<E> e) {  
    501             //如果是表头、抛异常  
    502             if (e == header)  
    503                 throw new NoSuchElementException();  
    504       
    505             E result = e.element;  
    506             //下面实际上就是、将e拿掉、然后将e的上下两个节点连接起来  
    507             e.previous.next = e.next;  
    508             e.next.previous = e.previous;  
    509             e.next = e.previous = null;  
    510             e.element = null;  
    511             size--;  
    512             modCount++;  
    513             return result;  
    514         }  
    515       
    516         /** 
    517          * 反向迭代器 
    518          * @since 1.6 
    519          */  
    520         public Iterator<E> descendingIterator() {  
    521             return new DescendingIterator();  
    522         }  
    523       
    524         /** 反向迭代器实现类 */  
    525         private class DescendingIterator implements Iterator {  
    526             final ListItr itr = new ListItr(size());  
    527             public boolean hasNext() {  
    528                 return itr.hasPrevious();  
    529             }  
    530             public E next() {  
    531                 return itr.previous();  
    532             }  
    533             public void remove() {  
    534                 itr.remove();  
    535             }  
    536         }  
    537       
    538         /** 返回LinkedList的克隆对象*/  
    539         public Object clone() {  
    540             LinkedList<E> clone = null;  
    541             try {  
    542                 clone = (LinkedList<E>) super.clone();  
    543             } catch (CloneNotSupportedException e) {  
    544                 throw new InternalError();  
    545             }  
    546       
    547             // Put clone into "virgin" state  
    548             clone.header = new Entry<E>(null, null, null);  
    549             clone.header.next = clone.header.previous = clone.header;  
    550             clone.size = 0;  
    551             clone.modCount = 0;  
    552       
    553             // Initialize clone with our elements  
    554             for (Entry<E> e = header.next; e != header; e = e.next)  
    555                 clone.add(e.element);  
    556       
    557             return clone;  
    558         }  
    559       
    560         /** 将LinkedList中的所有元素转换成Object[]中*/  
    561         public Object[] toArray() {  
    562             Object[] result = new Object[size];  
    563             int i = 0;  
    564             for (Entry<E> e = header.next; e != header; e = e.next)  
    565                 result[i++] = e.element;  
    566             return result;  
    567         }  
    568       
    569         /** 将LinkedList中的所有元素转换成Object[]中、并且完成类型转换*/  
    570         public <T> T[] toArray(T[] a) {  
    571             if (a.length < size)  
    572                 a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);  
    573             int i = 0;  
    574             Object[] result = a;  
    575             for (Entry<E> e = header.next; e != header; e = e.next)  
    576                 result[i++] = e.element;  
    577       
    578             if (a.length > size)  
    579                 a[size] = null;  
    580       
    581             return a;  
    582         }  
    583       
    584         private static final long serialVersionUID = 876323262645176354L;  
    585       
    586         /** 将LinkedList的“容量,所有的元素值”都写入到输出流中 
    587          *  1、将LinkedList的容量写入进去 
    588          *  2、将LinkedList中的所有元素写入进去  
    589          */  
    590         private void writeObject(java.io.ObjectOutputStream s)  
    591             throws java.io.IOException {  
    592             // Write out any hidden serialization magic  
    593             s.defaultWriteObject();  
    594       
    595             // Write out size  
    596             s.writeInt(size);  
    597       
    598             // Write out all elements in the proper order.  
    599             for (Entry e = header.next; e != header; e = e.next)  
    600                 s.writeObject(e.element);  
    601         }  
    602       
    603         /**  
    604          *  将写入的LinkedList读取出来 
    605          *  1、读取写入的LinkedList的容量 
    606          *  2、读取写入的元素  
    607          */  
    608         private void readObject(java.io.ObjectInputStream s)  
    609             throws java.io.IOException, ClassNotFoundException {  
    610             // Read in any hidden serialization magic  
    611             s.defaultReadObject();  
    612       
    613             // Read in size  
    614             int size = s.readInt();  
    615       
    616             // Initialize header  
    617             header = new Entry<E>(null, null, null);  
    618             header.next = header.previous = header;  
    619       
    620             // Read in all elements in the proper order.  
    621             for (int i=0; i<size; i++)  
    622                 addBefore((E)s.readObject(), header);  
    623         }  
    624     }
    View Code

    三:Vector

       Vector也是在底层通过一个数组来保存数据,通过底层数组的一系列操作来实现List接口。同ArrayList一样,Vector底层数组容量不足时会扩容,然后把原有内容复制过去。底层数据结构是数组,查询快,增删慢。线程不安全,效率高。线程安全,效率低。  

    底层源码:

      1 package java.util;
      2 public class Vector<E>
      3     extends AbstractList<E>
      4     implements List<E>, RandomAccess, Cloneable, java.io.Serializable
      5 {
      6 
      7     // 保存Vector中数据的数组
      8     protected Object[] elementData;
      9     // 实际数据的数量
     10     protected int elementCount;
     11     // 容量增长系数
     12     protected int capacityIncrement;
     13     // Vector的序列版本号
     14     private static final long serialVersionUID = -2767605614048989439L;
     15     // Vector构造函数。默认容量是10。
     16     public Vector() {
     17         this(10);
     18     }
     19     // 指定Vector容量大小的构造函数
     20     public Vector(int initialCapacity) {
     21         this(initialCapacity, 0);
     22     }
     23     // 指定Vector"容量大小"和"增长系数"的构造函数
     24     public Vector(int initialCapacity, int capacityIncrement) {
     25         super();
     26         if (initialCapacity < 0)
     27             throw new IllegalArgumentException("Illegal Capacity: "+
     28                                                initialCapacity);
     29         // 新建一个数组,数组容量是initialCapacity
     30         this.elementData = new Object[initialCapacity];
     31         // 设置容量增长系数
     32         this.capacityIncrement = capacityIncrement;
     33     }
     34     // 指定集合的Vector构造函数。
     35     public Vector(Collection<? extends E> c) {
     36         // 获取“集合(c)”的数组,并将其赋值给elementData
     37         elementData = c.toArray();
     38         // 设置数组长度
     39         elementCount = elementData.length;
     40         // c.toArray might (incorrectly) not return Object[] (see 6260652)
     41         if (elementData.getClass() != Object[].class)
     42             elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
     43     }
     44     // 将数组Vector的全部元素都拷贝到数组anArray中
     45     public synchronized void copyInto(Object[] anArray) {
     46         System.arraycopy(elementData, 0, anArray, 0, elementCount);
     47     }
     48     // 将当前容量值设为 =实际元素个数
     49     public synchronized void trimToSize() {
     50         modCount++;
     51         int oldCapacity = elementData.length;
     52         if (elementCount < oldCapacity) {
     53             elementData = Arrays.copyOf(elementData, elementCount);
     54         }
     55     }
     56     // 确认“Vector容量”的帮助函数
     57     private void ensureCapacityHelper(int minCapacity) {
     58         int oldCapacity = elementData.length;
     59         // 当Vector的容量不足以容纳当前的全部元素,增加容量大小。
     60         // 若 容量增量系数>0(即capacityIncrement>0),则将容量增大当capacityIncrement
     61         // 否则,将容量增大一倍。
     62         if (minCapacity > oldCapacity) {
     63             Object[] oldData = elementData;
     64             int newCapacity = (capacityIncrement > 0) ?
     65                 (oldCapacity + capacityIncrement) : (oldCapacity * 2);
     66             if (newCapacity < minCapacity) {
     67                 newCapacity = minCapacity;
     68             }
     69             elementData = Arrays.copyOf(elementData, newCapacity);
     70         }
     71     }
     72     // 确定Vector的容量。
     73     public synchronized void ensureCapacity(int minCapacity) {
     74         // 将Vector的改变统计数+1
     75         modCount++;
     76         ensureCapacityHelper(minCapacity);
     77     }
     78     // 设置容量值为 newSize
     79     public synchronized void setSize(int newSize) {
     80         modCount++;
     81         if (newSize > elementCount) {
     82             // 若 "newSize 大于 Vector容量",则调整Vector的大小。
     83             ensureCapacityHelper(newSize);
     84         } else {
     85             // 若 "newSize 小于/等于 Vector容量",则将newSize位置开始的元素都设置为null
     86             for (int i = newSize ; i < elementCount ; i++) {
     87                 elementData[i] = null;
     88             }
     89         }
     90         elementCount = newSize;
     91     }
     92     // 返回“Vector的总的容量”
     93     public synchronized int capacity() {
     94         return elementData.length;
     95     }
     96     // 返回“Vector的实际大小”,即Vector中元素个数
     97     public synchronized int size() {
     98         return elementCount;
     99     }
    100     // 判断Vector是否为空
    101     public synchronized boolean isEmpty() {
    102         return elementCount == 0;
    103     }
    104     // 返回“Vector中全部元素对应的Enumeration”
    105     public Enumeration<E> elements() {
    106         // 通过匿名类实现Enumeration
    107         return new Enumeration<E>() {
    108             int count = 0;
    109             // 是否存在下一个元素
    110             public boolean hasMoreElements() {
    111                 return count < elementCount;
    112             }
    113             // 获取下一个元素
    114             public E nextElement() {
    115                 synchronized (Vector.this) {
    116                     if (count < elementCount) {
    117                         return (E)elementData[count++];
    118                     }
    119                 }
    120                 throw new NoSuchElementException("Vector Enumeration");
    121             }
    122         };
    123     }
    124     // 返回Vector中是否包含对象(o)
    125     public boolean contains(Object o) {
    126         return indexOf(o, 0) >= 0;
    127     }
    128 
    129     // 从index位置开始向后查找元素(o)。
    130     // 若找到,则返回元素的索引值;否则,返回-1
    131     public synchronized int indexOf(Object o, int index) {
    132         if (o == null) {
    133             // 若查找元素为null,则正向找出null元素,并返回它对应的序号
    134             for (int i = index ; i < elementCount ; i++)
    135             if (elementData[i]==null)
    136                 return i;
    137         } else {
    138             // 若查找元素不为null,则正向找出该元素,并返回它对应的序号
    139             for (int i = index ; i < elementCount ; i++)
    140             if (o.equals(elementData[i]))
    141                 return i;
    142         }
    143         return -1;
    144     }
    145     // 查找并返回元素(o)在Vector中的索引值
    146     public int indexOf(Object o) {
    147         return indexOf(o, 0);
    148     }
    149     // 从后向前查找元素(o)。并返回元素的索引
    150     public synchronized int lastIndexOf(Object o) {
    151         return lastIndexOf(o, elementCount-1);
    152     }
    153     // 从后向前查找元素(o)。开始位置是从前向后的第index个数;
    154     // 若找到,则返回元素的“索引值”;否则,返回-1。
    155     public synchronized int lastIndexOf(Object o, int index) {
    156         if (index >= elementCount)
    157             throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
    158         if (o == null) {
    159             // 若查找元素为null,则反向找出null元素,并返回它对应的序号
    160             for (int i = index; i >= 0; i--)
    161             if (elementData[i]==null)
    162                 return i;
    163         } else {
    164             // 若查找元素不为null,则反向找出该元素,并返回它对应的序号
    165             for (int i = index; i >= 0; i--)
    166             if (o.equals(elementData[i]))
    167                 return i;
    168         }
    169         return -1;
    170     }
    171     // 返回Vector中index位置的元素。
    172     // 若index月结,则抛出异常
    173     public synchronized E elementAt(int index) {
    174         if (index >= elementCount) {
    175             throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
    176         }
    177         return (E)elementData[index];
    178     }
    179     // 获取Vector中的第一个元素。
    180     // 若失败,则抛出异常!
    181     public synchronized E firstElement() {
    182         if (elementCount == 0) {
    183             throw new NoSuchElementException();
    184         }
    185         return (E)elementData[0];
    186     }
    187     // 获取Vector中的最后一个元素。
    188     // 若失败,则抛出异常!
    189     public synchronized E lastElement() {
    190         if (elementCount == 0) {
    191             throw new NoSuchElementException();
    192         }
    193         return (E)elementData[elementCount - 1];
    194     }
    195     // 设置index位置的元素值为obj
    196     public synchronized void setElementAt(E obj, int index) {
    197         if (index >= elementCount) {
    198             throw new ArrayIndexOutOfBoundsException(index + " >= " +
    199                                  elementCount);
    200         }
    201         elementData[index] = obj;
    202     }
    203     // 删除index位置的元素
    204     public synchronized void removeElementAt(int index) {
    205         modCount++;
    206         if (index >= elementCount) {
    207             throw new ArrayIndexOutOfBoundsException(index + " >= " +
    208                                  elementCount);
    209         } else if (index < 0) {
    210             throw new ArrayIndexOutOfBoundsException(index);
    211         }
    212         int j = elementCount - index - 1;
    213         if (j > 0) {
    214             System.arraycopy(elementData, index + 1, elementData, index, j);
    215         }
    216         elementCount--;
    217         elementData[elementCount] = null; /* to let gc do its work */
    218     }
    219     // 在index位置处插入元素(obj)
    220     public synchronized void insertElementAt(E obj, int index) {
    221         modCount++;
    222         if (index > elementCount) {
    223             throw new ArrayIndexOutOfBoundsException(index
    224                                  + " > " + elementCount);
    225         }
    226         ensureCapacityHelper(elementCount + 1);
    227         System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
    228         elementData[index] = obj;
    229         elementCount++;
    230     }
    231     // 将“元素obj”添加到Vector末尾
    232     public synchronized void addElement(E obj) {
    233         modCount++;
    234         ensureCapacityHelper(elementCount + 1);
    235         elementData[elementCount++] = obj;
    236     }
    237     // 在Vector中查找并删除元素obj。
    238     // 成功的话,返回true;否则,返回false。
    239     public synchronized boolean removeElement(Object obj) {
    240         modCount++;
    241         int i = indexOf(obj);
    242         if (i >= 0) {
    243             removeElementAt(i);
    244             return true;
    245         }
    246         return false;
    247     }
    248     // 删除Vector中的全部元素
    249     public synchronized void removeAllElements() {
    250         modCount++;
    251         // 将Vector中的全部元素设为null
    252         for (int i = 0; i < elementCount; i++)
    253             elementData[i] = null;
    254         elementCount = 0;
    255     }
    256     // 克隆函数
    257     public synchronized Object clone() {
    258         try {
    259             Vector<E> v = (Vector<E>) super.clone();
    260             // 将当前Vector的全部元素拷贝到v中
    261             v.elementData = Arrays.copyOf(elementData, elementCount);
    262             v.modCount = 0;
    263             return v;
    264         } catch (CloneNotSupportedException e) {
    265             // this shouldn't happen, since we are Cloneable
    266             throw new InternalError();
    267         }
    268     }
    269     // 返回Object数组
    270     public synchronized Object[] toArray() {
    271         return Arrays.copyOf(elementData, elementCount);
    272     }
    273     // 返回Vector的模板数组。所谓模板数组,即可以将T设为任意的数据类型
    274     public synchronized <T> T[] toArray(T[] a) {
    275         // 若数组a的大小 < Vector的元素个数;
    276         // 则新建一个T[]数组,数组大小是“Vector的元素个数”,并将“Vector”全部拷贝到新数组中
    277         if (a.length < elementCount)
    278             return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());
    279         // 若数组a的大小 >= Vector的元素个数;
    280         // 则将Vector的全部元素都拷贝到数组a中。
    281     System.arraycopy(elementData, 0, a, 0, elementCount);
    282         if (a.length > elementCount)
    283             a[elementCount] = null;
    284         return a;
    285     }
    286     // 获取index位置的元素
    287     public synchronized E get(int index) {
    288         if (index >= elementCount)
    289             throw new ArrayIndexOutOfBoundsException(index);
    290         return (E)elementData[index];
    291     }
    292     // 设置index位置的值为element。并返回index位置的原始值
    293     public synchronized E set(int index, E element) {
    294         if (index >= elementCount)
    295             throw new ArrayIndexOutOfBoundsException(index);
    296         Object oldValue = elementData[index];
    297         elementData[index] = element;
    298         return (E)oldValue;
    299     }
    300     // 将“元素e”添加到Vector最后。
    301     public synchronized boolean add(E e) {
    302         modCount++;
    303         ensureCapacityHelper(elementCount + 1);
    304         elementData[elementCount++] = e;
    305         return true;
    306     }
    307     // 删除Vector中的元素o
    308     public boolean remove(Object o) {
    309         return removeElement(o);
    310     }
    311     // 在index位置添加元素element
    312     public void add(int index, E element) {
    313         insertElementAt(element, index);
    314     }
    315     // 删除index位置的元素,并返回index位置的原始值
    316     public synchronized E remove(int index) {
    317         modCount++;
    318         if (index >= elementCount)
    319             throw new ArrayIndexOutOfBoundsException(index);
    320         Object oldValue = elementData[index];
    321         int numMoved = elementCount - index - 1;
    322         if (numMoved > 0)
    323             System.arraycopy(elementData, index+1, elementData, index,
    324                      numMoved);
    325         elementData[--elementCount] = null; // Let gc do its work
    326         return (E)oldValue;
    327     }
    328     // 清空Vector
    329     public void clear() {
    330         removeAllElements();
    331     }
    332     // 返回Vector是否包含集合c
    333     public synchronized boolean containsAll(Collection<?> c) {
    334         return super.containsAll(c);
    335     }
    336     // 将集合c添加到Vector中
    337     public synchronized boolean addAll(Collection<? extends E> c) {
    338         modCount++;
    339         Object[] a = c.toArray();
    340         int numNew = a.length;
    341         ensureCapacityHelper(elementCount + numNew);
    342         // 将集合c的全部元素拷贝到数组elementData中
    343         System.arraycopy(a, 0, elementData, elementCount, numNew);
    344         elementCount += numNew;
    345         return numNew != 0;
    346     }
    347     // 删除集合c的全部元素
    348     public synchronized boolean removeAll(Collection<?> c) {
    349         return super.removeAll(c);
    350     }
    351     // 删除“非集合c中的元素”
    352     public synchronized boolean retainAll(Collection<?> c)  {
    353         return super.retainAll(c);
    354     }
    355     // 从index位置开始,将集合c添加到Vector中
    356     public synchronized boolean addAll(int index, Collection<? extends E> c) {
    357         modCount++;
    358         if (index < 0 || index > elementCount)
    359             throw new ArrayIndexOutOfBoundsException(index);
    360         Object[] a = c.toArray();
    361         int numNew = a.length;
    362         ensureCapacityHelper(elementCount + numNew);
    363         int numMoved = elementCount - index;
    364         if (numMoved > 0)
    365         System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
    366         System.arraycopy(a, 0, elementData, index, numNew);
    367         elementCount += numNew;
    368         return numNew != 0;
    369     }
    370     // 返回两个对象是否相等
    371     public synchronized boolean equals(Object o) {
    372         return super.equals(o);
    373     }
    374     // 计算哈希值
    375     public synchronized int hashCode() {
    376         return super.hashCode();
    377     }
    378     // 调用父类的toString()
    379     public synchronized String toString() {
    380         return super.toString();
    381     }
    382     // 获取Vector中fromIndex(包括)到toIndex(不包括)的子集
    383     public synchronized List<E> subList(int fromIndex, int toIndex) {
    384         return Collections.synchronizedList(super.subList(fromIndex, toIndex), this);
    385     }
    386     // 删除Vector中fromIndex到toIndex的元素
    387     protected synchronized void removeRange(int fromIndex, int toIndex) {
    388         modCount++;
    389         int numMoved = elementCount - toIndex;
    390         System.arraycopy(elementData, toIndex, elementData, fromIndex,
    391                          numMoved);
    392         // Let gc do its work
    393         int newElementCount = elementCount - (toIndex-fromIndex);
    394         while (elementCount != newElementCount)
    395             elementData[--elementCount] = null;
    396     }
    397     // java.io.Serializable的写入函数
    398     private synchronized void writeObject(java.io.ObjectOutputStream s)
    399         throws java.io.IOException {
    400         s.defaultWriteObject();
    401     }
    402 }
    View Code
  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/huangdabing/p/9249237.html
Copyright © 2011-2022 走看看