Java集合-ArrayList略解

什么是集合

集合就是一个容器,把多个对象存起来,方便操作
简单说就是“由若干个确定的元素所构成的整体” 数组ProMax

为什么需要集合

集合高效,方便,快捷,扩展性高,对比数组不限制内存,用过的都说好

如何使用集合

集合的主要父接口是Collection和Map,一切的祖宗。由Collection扩展出了List,Set,Queue接口,本篇主要说List接口。
(Tip:使用集合需要使用import语句 import java.util.*;)
List的实现类是Vector,ArrayList和LinkedList,本篇主要说ArrayList。

1.ArrayList集合

List集合的特点是有序,元素可重复。ArrayList实现了List接口,ArrayList底层是数组,所以集合中每个元素都有一个索引。
优点:每个元素都有索引,元素查询效率快
劣势:底层是数组,不适合做大量增删操作

一.添加元素 使用add()方法在集合末尾追加元素

1
2
List l = new ArrayList();
l.add("Hello,World");

List重载了一个add方法(void add(int index E e)),可以向指定索引处添加元素。(注意:index参数不可大于当前集合的容量)

1
l.add(0,"Hello,World");

2.删除元素 使用remove()方法删除元素

可以使用remove(int index)从指定索引位置删除元素,也可以使用remove(Object o)删除元素。

1
l.remove("Hello,World"); //=l.remove(0);

3.清空元素 使用clear()

1
l.clear();

4.判断集合中是否有此元素 使用contains(Object o)方法。返回true(有此元素)与false(没有此元素)

1
l.contains("Hello,World");//true

二.遍历ArrayList集合

遍历集合有两种常用方法:

  • Iterator迭代器遍历
  • foreach遍历

    Iterator迭代器遍历

    Iterator有next()与hasNext()两种方法。前者是取出集合下一个元素(Iterator初始指向集合第一个元素的前面),后者是判断是否有下一个元素。
    使用集合的iterator()方法获取与当前集合关联的迭代器对象
    1
    2
    3
    4
    5
    6
    7
    8
    List list = new ArrayList();
    list.add("hexo");
    list.add("theme");
    list.add("anzhiyu");
    Iterator i = list.iterator();
    while(i.hasNext()){
    System.out.println(i.next());
    }
    结果:
    1
    2
    3
    hexo
    theme
    anzhiyu

    foreach遍历

    使用一个临时变量来取出集合中每一个元素。
    1
    2
    3
    4
    5
    6
    List list = new ArrayList();
    list.add("hexo");
    list.add("theme");
    list.add("anzhiyu");
    for(Object o : list){
    System.out.println(o);
    结果:
    1
    2
    3
    hexo
    theme
    anzhiyu
    这里给出ArrayList的源码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    package java.util;

    public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    {
    // 序列版本号
    private static final long serialVersionUID = 8683452581122892189L;

    // 默认容量大小
    private static final int DEFAULT_CAPACITY = 10;

    // 空数组
    private static final Object[] EMPTY_ELEMENTDATA = {};

    // 用于保存ArrayList中数据的数组
    private transient Object[] elementData;

    // ArrayList中所包含元素的个数
    private int size;

    // 带初始容量参数的构造函数
    public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
    throw new IllegalArgumentException("Illegal Capacity: "+
    initialCapacity);
    this.elementData = new Object[initialCapacity];
    }

    // 默认构造函数,其默认初始容量为10
    public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;
    }

    // 带Collection参数的构造函数
    public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
    elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

    // 将此 ArrayList 实例的容量调整为列表的当前大小(实际元素个数)
    public void trimToSize() {
    modCount++;
    if (size < elementData.length) {
    elementData = Arrays.copyOf(elementData, size);
    }
    }

    // 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所
    // 指定的元素数
    public void ensureCapacity(int minCapacity) {
    int minExpand = (elementData != EMPTY_ELEMENTDATA)
    // any size if real element table
    ? 0
    // larger than default for empty table. It's already supposed to be
    // at default size.
    : DEFAULT_CAPACITY;

    if (minCapacity > minExpand) {
    ensureExplicitCapacity(minCapacity);
    }
    }

    private void ensureCapacityInternal(int minCapacity) {
    if (elementData == EMPTY_ELEMENTDATA) {
    minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
    }

    private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
    grow(minCapacity);
    }

    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;


    private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
    newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
    }

    private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
    throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
    Integer.MAX_VALUE :
    MAX_ARRAY_SIZE;
    }

    // 返回ArrayList中的元素个数
    public int size() {
    return size;
    }

    // 判断ArrayList是否为空
    public boolean isEmpty() {
    return size == 0;
    }

    // 判断ArrayList是否包含Object(o)
    public boolean contains(Object o) {
    return indexOf(o) >= 0;
    }

    // 返回ArrayList中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1
    public int indexOf(Object o) {
    if (o == null) {
    for (int i = 0; i < size; i++)
    if (elementData[i]==null)
    return i;
    } else {
    for (int i = 0; i < size; i++)
    if (o.equals(elementData[i]))
    return i;
    }
    return -1;
    }

    // 返回ArrayList中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1
    public int lastIndexOf(Object o) {
    if (o == null) {
    for (int i = size-1; i >= 0; i--)
    if (elementData[i]==null)
    return i;
    } else {
    for (int i = size-1; i >= 0; i--)
    if (o.equals(elementData[i]))
    return i;
    }
    return -1;
    }

    // 返回此 ArrayList 实例的浅表副本
    public Object clone() {
    try {
    @SuppressWarnings("unchecked")
    ArrayList<E> v = (ArrayList<E>) super.clone();
    // 将当前ArrayList的全部元素拷贝到v中
    v.elementData = Arrays.copyOf(elementData, size);
    v.modCount = 0;
    return v;
    } catch (CloneNotSupportedException e) {
    // this shouldn't happen, since we are Cloneable
    throw new InternalError();
    }
    }

    // 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组
    public Object[] toArray() {
    return Arrays.copyOf(elementData, size);
    }

    // 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a) {
    if (a.length < size)
    // Make a new array of a's runtime type, but my contents:
    return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
    a[size] = null;
    return a;
    }

    // 位置访问操作
    @SuppressWarnings("unchecked")
    E elementData(int index) {
    return (E) elementData[index];
    }

    // 返回ArrayList中指定位置上的元素
    public E get(int index) {
    rangeCheck(index);

    return elementData(index);
    }

    // 用指定的元素替代ArrayList中指定位置上的元素,并返回替代前的元素
    public E set(int index, E element) {
    rangeCheck(index);

    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
    }

    // 将指定的元素添加到ArrayList的尾部
    public boolean add(E e) {
    ensureCapacityInternal(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
    }

    // 将指定的元素插入ArrayList中的指定位置
    public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1); // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
    size - index);
    elementData[index] = element;
    size++;
    }

    // 移除ArrayList中指定位置上的元素,并返回该位置上的元素
    public E remove(int index) {
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);

    int numMoved = size - index - 1;
    if (numMoved > 0)
    System.arraycopy(elementData, index+1, elementData, index,
    numMoved);
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
    }

    // 移除ArrayList中首次出现的指定元素(如果存在则移除并返回true,否则返回false)
    public boolean remove(Object o) {
    if (o == null) {
    for (int index = 0; index < size; index++)
    if (elementData[index] == null) {
    fastRemove(index);
    return true;
    }
    } else {
    for (int index = 0; index < size; index++)
    if (o.equals(elementData[index])) {
    fastRemove(index);
    return true;
    }
    }
    return false;
    }

    // 私有方法,用于快速移除
    private void fastRemove(int index) {
    modCount++;
    int numMoved = size - index - 1;
    if (numMoved > 0)
    System.arraycopy(elementData, index+1, elementData, index,
    numMoved);
    elementData[--size] = null; // clear to let GC do its work
    }

    // 移除ArrayList中的所有元素
    public void clear() {
    modCount++;

    // clear to let GC do its work
    for (int i = 0; i < size; i++)
    elementData[i] = null;

    size = 0;
    }

    // 按照指定 collection 的迭代器所返回的元素顺序,
    // 将该 collection 中的所有元素添加到ArrayList的尾部
    public boolean addAll(Collection<? extends E> c) {
    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityInternal(size + numNew); // Increments modCount
    System.arraycopy(a, 0, elementData, size, numNew);
    size += numNew;
    return numNew != 0;
    }

    // 从指定的位置开始,将指定 collection 中的所有元素插入到ArrayList中
    public boolean addAll(int index, Collection<? extends E> c) {
    rangeCheckForAdd(index);

    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityInternal(size + numNew); // Increments modCount

    int numMoved = size - index;
    if (numMoved > 0)
    System.arraycopy(elementData, index, elementData, index + numNew,
    numMoved);

    System.arraycopy(a, 0, elementData, index, numNew);
    size += numNew;
    return numNew != 0;
    }

    // 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素
    protected void removeRange(int fromIndex, int toIndex) {
    modCount++;
    int numMoved = size - toIndex;
    System.arraycopy(elementData, toIndex, elementData, fromIndex,
    numMoved);

    // clear to let GC do its work
    int newSize = size - (toIndex-fromIndex);
    for (int i = newSize; i < size; i++) {
    elementData[i] = null;
    }
    size = newSize;
    }

    // 私有方法,用于范围检测
    private void rangeCheck(int index) {
    if (index >= size)
    throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

    // 私有方法,用于add和addAll
    private void rangeCheckForAdd(int index) {
    if (index > size || index < 0)
    throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }


    private String outOfBoundsMsg(int index) {
    return "Index: "+index+", Size: "+size;
    }

    // 移除ArrayList中Collection所包含的所有元素
    public boolean removeAll(Collection<?> c) {
    return batchRemove(c, false);
    }

    // 保留所有ArrayList和Collection共有的元素
    public boolean retainAll(Collection<?> c) {
    return batchRemove(c, true);
    }

    private boolean batchRemove(Collection<?> c, boolean complement) {
    final Object[] elementData = this.elementData;
    int r = 0, w = 0;
    boolean modified = false;
    try {
    for (; r < size; r++)
    if (c.contains(elementData[r]) == complement)
    elementData[w++] = elementData[r];
    } finally {
    // Preserve behavioral compatibility with AbstractCollection,
    // even if c.contains() throws.
    if (r != size) {
    System.arraycopy(elementData, r,
    elementData, w,
    size - r);
    w += size - r;
    }
    if (w != size) {
    // clear to let GC do its work
    for (int i = w; i < size; i++)
    elementData[i] = null;
    modCount += size - w;
    size = w;
    modified = true;
    }
    }
    return modified;
    }

    // java.io.Serializable的写入函数
    // 将ArrayList的“容量,所有的元素值”都写入到输出流中
    private void writeObject(java.io.ObjectOutputStream s)
    throws java.io.IOException{
    // Write out element count, and any hidden stuff
    int expectedModCount = modCount;
    s.defaultWriteObject();

    // Write out size as capacity for behavioural compatibility with clone()
    s.writeInt(size);

    // Write out all elements in the proper order.
    for (int i=0; i<size; i++) {
    s.writeObject(elementData[i]);
    }

    if (modCount != expectedModCount) {
    throw new ConcurrentModificationException();
    }
    }

    // java.io.Serializable的读取函数:根据写入方式读出
    // 先将ArrayList的“容量”读出,然后将“所有的元素值”读出
    private void readObject(java.io.ObjectInputStream s)
    throws java.io.IOException, ClassNotFoundException {
    elementData = EMPTY_ELEMENTDATA;

    // Read in size, and any hidden stuff
    s.defaultReadObject();

    // Read in capacity
    s.readInt(); // ignored

    if (size > 0) {
    // be like clone(), allocate array based upon size not capacity
    ensureCapacityInternal(size);

    Object[] a = elementData;
    // Read in all elements in the proper order.
    for (int i=0; i<size; i++) {
    a[i] = s.readObject();
    }
    }
    }

    // 返回一个从指定位置开始遍历的ListIterator迭代器
    public ListIterator<E> listIterator(int index) {
    if (index < 0 || index > size)
    throw new IndexOutOfBoundsException("Index: "+index);
    return new ListItr(index);
    }

    // 返回一个ListIterator迭代器
    public ListIterator<E> listIterator() {
    return new ListItr(0);
    }

    // 返回一个Iterator迭代器
    public Iterator<E> iterator() {
    return new Itr();
    }

    // 返回一个指定范围的子List列表
    public List<E> subList(int fromIndex, int toIndex) {
    subListRangeCheck(fromIndex, toIndex, size);
    return new SubList(this, 0, fromIndex, toIndex);
    }
    }