赞
踩
ArrayList 需要实现下面的接口
/**顺序表的增删改查*/ public interface List<T> { /** 第一个位置插入 */ void addFirst(T data); /** 在最后一个位置插入 */ void addLast(T data); /** 删除index对应位置的节点, 并返回该节点的数据 */ T delete(int index); /** 在index 对应位置加入数据 */ void add(int index, T data); /** 更改index对应位置的数据为data */ void set(int index, T data); /** 查询index对应位置的数据 */ T get(int index); /** 获取data元素第一次出现时候的index */ int getIndex(T data); /**遍历顺序表*/ void traverse(); /**获取顺序表大小*/ int size(); }
ArrayList 底层维护着一个数组对象, 它的最大容量是capacity, size 用来表示ArrayList 插入元素的数目
package com.weinijuan;
public class ArrayList<T> implements List<T>
{
private int size;
private int capacity = 16;
private T[] ar;
public ArrayList()
{
ar = (T[]) new Object[capacity];
}
}
这是ArrayList 类用的最多的方法, 乍一看貌似会数组下标访问越界, 实则不然, capacity才是数组真正的容量, size 是当前对象最后一个元素下标(index - 1)的后面一个位置的下标。
因为插入了一个元素, 所以size需要加一。
这段代码虽然简单,但几乎是ArrayList 最重要的方法
@Override
public void addLast(T data)
{
ar[size] = data;
size++;
}
上面的缺陷就是最多只能有16个元素,可以在size == capacity 的时候进行扩容.
扩容原理:
System.arraycopy 经常出现在ArrayList 中,需要掌握
private void resize(int newCapacity) { T[] temp = (T[]) new Object[newCapacity]; System.arraycopy(ar, 0, temp, 0, size); ar = temp; capacity = newCapacity; } @Override public void addLast(T data) { if (size == capacity) { resize(2*capacity); } ar[size] = data; size++; }
对象游离: 因为通过数组可以访问到最后一个本应该被删除的对象, 所以垃圾回收器不会回收这个对象, 导致对象游离
public T deleteLast(int index)
{
if (size < capacity/4)
{
resize(capacity/2);
}
T retData = ar[size - 1];
size--;
ar[size] = null;
return retData;
}
上面的几个方法非常简单,非常重要,后面的几个方法可能复杂,但是实际中并不是经常使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。