线性表在Java类库中的顺序表示及实现——ArrayList
2015-05-23 20:15
543 查看
ArrayList用数组实现了线性表。它用数组存储线性表的元素:
它也存储了线性表中元素的个数:
接下来讲讲线性表的常见操作在ArrayList中的实现。
(1)查询线性表中是否包含某一个元素
contains(Object o)调用indexOf(Object o)来判断线性表是否包含某个元素,indexOf(Object o)的实现如下:
查询是否包含某一个元素需要遍历整个线性表,所以时间复杂度是O(n)。
(2)向线性表中插入元素
可以直接把一个元素添加到线性表的尾部:
也可以向线性表的指定位置添加元素:
(3)从线性表删除元素
删除指定位置的元素:
elementData(int index)实现如下:
删除指定元素:
fastRemove(int index)实现如下:
两种删除元素的方式的时间复杂度都是O(n),时间开销主要还是移动元素。
transient Object[] elementData;
它也存储了线性表中元素的个数:
private int size;
接下来讲讲线性表的常见操作在ArrayList中的实现。
(1)查询线性表中是否包含某一个元素
public boolean contains(Object o) { return indexOf(o) >= 0; }
contains(Object o)调用indexOf(Object o)来判断线性表是否包含某个元素,indexOf(Object o)的实现如下:
public int indexOf(Object o) { // 分o等于和不等于null两种情况 if (o == null) { // 遍历数组中的所有线性表元素,索引范围是[0,size) 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; } // 如果不包含指定元素就返回-1 return -1; }
查询是否包含某一个元素需要遍历整个线性表,所以时间复杂度是O(n)。
(2)向线性表中插入元素
可以直接把一个元素添加到线性表的尾部:
public boolean add(E e) { // 保证数组的容量不小于线性表的长度 ensureCapacityInternal(size + 1); // Increments modCount!! // 把元素添加到线性表最后一个元素的后面,并把线性表的长度加1 elementData[size++] = e; return true; }
也可以向线性表的指定位置添加元素:
public void add(int index, E element) { // 保证index大于等于0,小于等于size rangeCheckForAdd(index); // 保证数组容量不小于线性表长度 ensureCapacityInternal(size + 1); // Increments modCount!! // 把elementData中index及后面的所有元素都移动一个位置 System.arraycopy(elementData, index, elementData, index + 1, size - index); // 把待插入元素放到index处 elementData[index] = element; size++; }把元素放到指定位置的操作的时间复杂度为O(n),只要开销是移动元素。
(3)从线性表删除元素
删除指定位置的元素:
public E remove(int index) { // 保证index小于size rangeCheck(index); modCount++; // 返回index处的元素 E oldValue = elementData(index); // 需要移动的元素数目 int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); // 线性表长度减1,并把size处的元素设置为null,让gc回收 elementData[--size] = null; // clear to let GC do its work return oldValue; }
elementData(int index)实现如下:
E elementData(int index) { return (E) elementData[index]; }
删除指定元素:
public boolean remove(Object o) { // 分o等于和不等于null两种 if (o == null) { // 遍历线性表,如果找到与指定元素相等的元素,就将它删除 for (int index = 0; index < size; index++) if (elementData[index] == null) { // 因为可以保证index合法,所以可以调用fastRemove(int index) fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
fastRemove(int index)实现如下:
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 }fastRemove(int index)和remove(int index)相比,只是少了边界验证和返回值。
两种删除元素的方式的时间复杂度都是O(n),时间开销主要还是移动元素。
相关文章推荐
- 栈在Java类库中的顺序表示及实现——Stack
- 线性表在Java类库中链式表示及的实现——LinkedList
- java自己实现顺序线性表ArrayList
- ArrayList线性表Java实现
- 顺序线性表 ---- ArrayList 源码解析及实现原理分析
- C_线性表(ADT)-顺序表的表示和实现
- Java,数据结构,线性表,顺序实现
- 线性表顺序表示的C#实现(参考数据结构(C语言版))
- JAVA数据结构 线性表顺序是实现
- 线性表【02】线性表的顺序表示与实现 推荐
- 今天学了线性表顺序表示,自己写了一段代码!实现了 插入和删除!这也是第一次写博客
- 线性表java实现之顺序存储源码
- 数据结构 线性表 顺序表示和实现
- 数据结构—顺序表(自己实现Java的ArrayList)
- Java实现顺序线性表
- Java实现线性表(顺序表)
- 顺序线性表表示一元多项式C++实现
- 线性表 顺序存储 链式存储 ---java实现
- JAVA采用数组结构实现一个线性表,可以增删改查,类似于ArrayList
- java中的线性表的内部实现(ArrayList、LinkedList)