前言
本章讲解顺序存储结构ArrayList的底层实现
方法
1.概念
我们知道,线性表的顺序存储结构的实现在Java中是以ArrayList来实现的。那么我们用了这么久的ArrayList,如果不知道ArrayList的底层实现岂不是十分的滑稽,让我们来揭开它神秘的面纱。
2.实现思路
1)构建我们自己的List接口
我们可以尝试写出最基本的抽象方法。比如求集合中元素的个数方法等。
package cn.edu.ccut;
/**
* 模仿List接口
* @author wangjian
*
* @param <E>
*/
public interface List<E> {
public int size();//获得集合长度
public boolean add(E e);//新增对象
public E get(int index);//获得对象
public E remove(int index);//删除对象
public boolean isEmpty();//判断集合是否为空
public int indexOf(Object obj);//判断元素在集合中的位置
public boolean contains(Object obj);//判断元素是否在集合中
}
2)编写具体的实现类ArrayList
package cn.edu.ccut;
import java.util.Arrays;
/**
* 模仿ArrayList实现类
* @author wangjian
*
* @param <E>
*/
public class ArrayList<E> implements List<E>{
private Object [] datas;//底层使用数组实现
private int size;//集合数据个数
public ArrayList() {
this.datas = new Object[]{};//初始化数组,长度为0
}
@Override
public int size() {
return size;
}
@Override
public boolean add(E e) {
grow(size+1);
datas[size++] = e;
return true;
}
/**
* 判断数组是否需要扩容
* @param newLength 新的长度
*/
private void grow(int newLength){
if(newLength > datas.length){//需要扩容
datas = Arrays.copyOf(datas, newLength);
}
}
@Override
public E get(int index) {
//判断索引是否在数组允许的范围内
checkIndexOfArray(index);
E data = (E)datas[index];
return data;
}
private void checkIndexOfArray(int index){
if( index < 0 || index > size-1){
String error = "index: "+index+",size: "+size;
throw new ArrayIndexOutOfBoundsException(error);
}
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public E remove(int index) {
//判断索引是否在数组允许的范围内
checkIndexOfArray(index);
E old = (E)datas[index];
int afterNum = size - (index + 1);//获取删除节点后的数据个数
if(afterNum > 0){
System.arraycopy(datas, index+1, datas, index, afterNum);//前移
}
datas[--size] = null;
return old;
}
@Override
public int indexOf(Object obj) {
if(obj == null){
for (int i = 0; i < size; i++) {
if(datas[i] == null)
return i;
}
}else {
for (int i = 0; i < size; i++) {
if(datas[i].equals(obj))
return i;
}
}
return -1;
}
@Override
public boolean contains(Object obj) {
return indexOf(obj)>=0;
}
}
这样我们就通过自己的代码实现了Java中的ArrayList,代码读起来还算可以,希望大家仔细消化。