实现一个简略ArrayList, 提供 add(), remove(), size()
没有考虑太多方面,还请批评指正。
接口定义
import java.io.Serializable;
public interface PArrayListI<T> extends Serializable{
public int add(T t);
public int remove(T t);
public T remove(int index);
public long size();
public T get(int index);
}
List类的实现
public class PArrayList<T> implements PArrayListI<T>{
private static final int Inital_Size =10;
private transient int size;
private transient int eleCount;
private transient float growFactor =0.5F;
private transient Object[] array;
public PArrayList() {
this.array = new Object[Inital_Size];
this.size = this.array.length;
}
public PArrayList( int size) {
this.size = size;
this.array = new Object[size];
}
public PArrayList( int size, float growFactor) {
this.size = size;
this.growFactor = growFactor;
this.array = new Object[size];
}
@Override
public int add(Object t) {//添加一个元素
if(capacityIsEnough()){
eleCount+=1;
this.array[eleCount-1]= t;
return 1;
}else{
growUp();
add(t);
}
return 0;
}
@Override
public int remove(Object t) { // 移除一个元素
if (eleCount <= 0 || size <= 0 ) {
return 0;
}
int index = indexOf(t);
if (index<0) {//不存在
return 0;
}else{
removeByIndex(index);
eleCount-=1;
return 1;
}
}
@Override
public long size() {
return eleCount;
}
@Override
public T get(int index) { //根据坐标获取
T t = (T) this.array[index];
return t;
}
@Override
public T remove(int index) { //对外暴露的根据坐标移除
T t = get( index);
removeByIndex(index);
eleCount--;
return t;
}
private boolean capacityIsEnough(){ //是否需要扩容
if (eleCount<this.array.length) {
return true;
}
return false;
}
private void growUp(){ //扩容执行函数
int newSize= Math.round(this.size*(1+growFactor));
Object[] newArrya = new Object[newSize];
int i=0;
for (Object object : this.array) {
newArrya[i++] = object;
}
}
private int indexOf(Object t){ // 获取对象的坐标
int index = -1;
if (t==null) {
int i = 0;
for (Object object : array) {
i++;
if (object == null) {
if (i <0 || i >eleCount)
return -1;
return i;
}
}
}else{
int i = 0;
for (Object object : array) {
if (t.equals(object)) {
if (i <0 || i >eleCount)
return -1;
return i;
}
i++;
}
}
return index ;
}
int removeByIndex(int index){ //根据坐标移除
if (index == eleCount-1) {//最后一个元素
array[index]=null;
}
System.arraycopy(array, index+1, array,index , eleCount-index);//-1
return 1;
}
}
测试类
public class TestSystemArrayCopy {
public static void main(String[] args) {
PArrayListI<User> list = new PArrayList<User>();
User user1 = new User(1);
list.add(user1);
list.add(new User(2));
list.add(new User(3));
list.add(new User(4));
list.add(new User(5));
list.add(new User(6));
User user7 = new User(7);
list.add(user7);
System.out.println("removed user:: "+list.remove(0));
list.remove(user7);
for (int i =0;i<list.size() ; i++) {
System.out.println(list.get(i).toString());
}
System.out.println("size: "+list.size());
}
}
输出结果:
removed user:: User [id=1, name=null, age=0, money=0.0, gender=0]
User [id=2, name=null, age=0, money=0.0, gender=0]
User [id=3, name=null, age=0, money=0.0, gender=0]
User [id=4, name=null, age=0, money=0.0, gender=0]
User [id=5, name=null, age=0, money=0.0, gender=0]
User [id=6, name=null, age=0, money=0.0, gender=0]
size: 5