前言
我们知道ArrayList的底层结构是通过数组来实现的,那么我们试着弄个玩玩!
MyList接口
package com.cxx.list;
import java.util.Collection;
/**
* @Author: cxx
* 实现自己的list 底层原理:数组
* 定义好接口
* @Date: 2018/6/7 16:47
*/
public interface MyList<E> {
//1.获取数据
E get(int index);
//2.新增数据
void add(E e);
//3.移除数据
void remove(int index);
//4.插入数据
void insert(int index,E e);
//5.是否存在数据
boolean contains(Object o);
//6.获取长度
int size();
//7.是否为空
boolean isEmpty();
//8.清空
void clearList();
}
ArrayList实现类
package com.cxx.list;
/**
* @Author: cxx
* @Date: 2018/6/7 16:52
*/
public class MyArrayList<E> implements MyList<E> {
//默认数组长度
private static final int DEFAULT_SIZE=10;
//数组元素
private Object[] elements=null;
//数组大小指针
private int capacity;
//当前游标
private int current;
public MyArrayList(){
this(DEFAULT_SIZE);
}
public MyArrayList(int size){
if (size<0){
throw new RuntimeException("数组大小不能小于0");
}else {
this.elements=new Object[size];
this.current=0;
capacity=size;
}
}
@Override
public E get(int index) {
//判断是否越界
confirmIndex(index);
return (E)this.elements[index];
}
@Override
public void add(E e) {
//判断数组容量是否足够
confirmSize();
this.elements[current]=e;
this.current++;
}
@Override
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];
}
}
this.current--;
}
@Override
public void insert(int index, E 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];
}
}
this.current++;
}
@Override
public boolean contains(Object o) {
for (Object element:this.elements){
if (o.equals(element)){
return true;
}
}
return false;
}
@Override
public int size() {
return this.current;
}
@Override
public boolean isEmpty() {
return this.current>0?true:false;
}
@Override
public void clearList() {
elements = new Object[DEFAULT_SIZE];
}
//确认当前数组容量,如果满足,则不动,否则扩大数组容量
private void confirmSize(){
if (this.current==this.capacity){
this.capacity = this.capacity + this.DEFAULT_SIZE;
Object[] newElements = new Object[this.capacity];
for (int i = 0; i <this.elements.length ; i++) {
newElements[i]=this.elements[i];
}
this.elements=newElements;
}
}
//判断下标是否超界
private void confirmIndex(int index){
if (index>capacity||index<0){
throw new RuntimeException("下标越界");
}
}
}
测试代码
package com.cxx.list;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: cxx
* @Date: 2018/6/7 17:08
*/
public class MyListTest {
public static void main(String[] args) {
MyList<Integer> myList = new MyArrayList();
for (int i = 0; i <10 ; i++) {
myList.add(i);
}
for (int i = 0; i <myList.size() ; i++) {
System.out.println(myList.get(i));
}
}
}
效果截图