要实现ArrayList,首先理解ArrayList的底层数据结构是数组,是一个动态数组,其容量能够自动增长,据此特性来实现ArrayList。
实现代码:
public class MyArrayList<O>{
/**
* 数组默认长度
*/
private static final int DEFAULT_SIZE = 10;
/**
* 存储队列中的元素
*/
private Object[] elements = null;
/**
*数组大小指针
*/
private int capacity;
/**
* 当前游标
*/
private int current;
/**
* 构造数组函数
*/
public MyArrayList(){
this(10);
}
/**
* 指定容量构造函数
*/
public MyArrayList(int size){
if(size < 0){
throw new RuntimeException("数组大小不能小于0");
}else{
this.elements = new Object[size];
this.current = 0;
capacity = size;
}
}
/**
* 获取指定位置数据
*/
public Object get(int index) {
confirmIndex(index);
return elements[index];
}
/**
* 增加数据e
*/
public void add(O e) {
confirmSize();
this.elements[current] = e;
this.current++;
}
/**
* 删除指定下标数据
*/
public void remove(int index) {
confirmIndex(index);
for (int i = index; i < elements.length; i++) {
if(i + 1 < elements.length){
elements[i] = elements[i+1];
}
}
current--;
}
/**
* 确定位置插入数据e
*/
public void insert(int index,O e) {
confirmIndex(index);
for (int i = 0; i < elements.length; i++) {
if(i >= index && i+2 < elements.length){
elements[i] = e;
elements[i+1] = elements[i+2];
}
}
current++;
}
/**
* 给定下标替换为val值
*/
public void set(int index,O val) {
confirmIndex(index);
@SuppressWarnings("unused")
Object oldval = elements[index];
elements[index] = val;
}
/**
* 判断数组内是否包含val数据
*/
public boolean contains(Object val) {
for (Object element : this.elements) {
if(val.equals(element)){
return true;
}
}
return false;
}
/**
* 获取数组大小
*/
public int size() {
return this.current;
}
/**
* 判断数组是否为空
*/
public boolean isEmpty() {
if(this.current > 0){
return false;
}
return true;
}
/**
* 判断当前数组的容量是否满足,如果满足,则不操作,如果不满足,则增加空间
*/
private void confirmSize(){
if(this.current == this.capacity){
this.capacity = this.capacity + MyArrayList.DEFAULT_SIZE;
Object[] newElemets = new Object[this.capacity];
for (int i = 0; i < this.elements.length; i++) {
newElemets[i] = this.elements[i];
}
this.elements = newElemets;
}
}
/**
* 判断下标是否越界
*/
private void confirmIndex(int index){
if(index > capacity || index < 0){
throw new RuntimeException("下标越界");
}
}
/**
* 打印数组数据
*/
public void show() {
for (int i = 0; i < size() ; i++) {
System.out.print(get(i)+" ");
}
System.out.println();
}
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.remove(2);
list.set(1,"k");
list.show();
}
}