手动实现ArrayList
Java中的ArrayList的原理和线性表实现相同,底层利用数组来存放数据。不过可以扩容,扩容的原理是创建一个新的数组,然后把旧数组copy给新数组。
package com.ct.arraylist;
import java.util.ArrayList;
import java.util.List;
public class MyDefineArrayList<E> {
private Object[] elementDate;
private int size;
private static final int ELEMENT_CAPACITY=10;
//测试功能
public static void main(String[] args) {
MyDefineArrayList<Integer> myDefeineArrayList = new MyDefineArrayList();
for (int i=0;i<20;i++){
if (i<10){
myDefeineArrayList.add(i);
}else {
myDefeineArrayList.add(1);
}
}
System.out.println(myDefeineArrayList.toString());
myDefeineArrayList.remove(10);
System.out.println(myDefeineArrayList.toString());
Integer i=1;
myDefeineArrayList.remove(i);
System.out.println(myDefeineArrayList.toString());
}
public MyDefineArrayList(){
size=0;
elementDate = new Object[ELEMENT_CAPACITY];
}
/**
*
* @param capacity 创建的集合大小,如果输入小于0,抛出异常.如果等于0,创建默认大小集合大小为ELEMENT_CAPACITY=0
*/
public MyDefineArrayList(int capacity){
if (capacity<0){
throw new RuntimeException("容器容量不应该为负数");
}else if (capacity==0){
elementDate = new Object[ELEMENT_CAPACITY];
}else{
elementDate = new Object[capacity];
}
}
/**
* 扩容
* @param minCapacity size+1,判断集合是否满了
*/
public void grow(int minCapacity){
int oldCapacity =elementDate.length;
int newCapacity =oldCapacity+(oldCapacity>>1);
if (newCapacity-minCapacity<0){
newCapacity=minCapacity;
}
Object[] newObject = new Object[newCapacity];
System.arraycopy(elementDate,0,newObject,0,elementDate.length);
elementDate = newObject;
}
/**
* 添加元素
* @param element
*/
public void add(E element){
if (size==elementDate.length){
grow(size+1);
}
elementDate[size++]=element;
}
@Override
public String toString() {
StringBuilder sb =new StringBuilder();
int flag=0;
sb.append("[");
for (Object it:elementDate
) {
if (it!=null){
sb.append(it+",");
}
}
sb.setCharAt(sb.length()-1,']');
return "MyDefineArrayList{"+"elementDate="+sb.toString()+"}";
}
/**
* 检查索引
* @param index
*/
public void checkRange(int index){
if (index>=size||index<0) {
throw new RuntimeException("索引不合法:" + index + "\t" + "请输入区间[0," + size + ")之间的数");
}
}
/**
* 获取指定索引元素
* @param index 索引
* @return 元素
*/
public E get(int index){
checkRange(index);
return (E) elementDate[index];
}
/**
* 设置指定下标元素
* @param element 元素
* @param index 索引
*/
public void set(E element,int index){
checkRange(index);
elementDate[index]=element;
}
/**
* 删除集合指定索引的元素
* @param index 指定索引
* @return 删除的元素
*/
public E remove(int index){
checkRange(index);
int moveNum = size-index-1;
E element = (E) elementDate[index];
if (moveNum>0)
System.arraycopy(elementDate,index+1,elementDate,index,moveNum);
elementDate[--size]=null;
return element;
}
/**
* 删除集合中的指定元素
* @param elemnet 指定元素
* @return 删除元素的索引
*/
public List remove(E elemnet){
List<Integer> list = new ArrayList<>();
int oldsize =size;
int i=0,cot=0;
while(elementDate[i]!=null){
if (elementDate[i].equals(elemnet)){
list.add(cot);
remove(i);
i--;
}
i++;
cot++;
}
return list;
}
//获取容器长度
public int size(){
return size;
}
//获取容器是否为空
public boolean isEmpty(){
return size>0?true:false;
}
}