为了系统的完成后面的数据结构学习,这里首先参考JDK源码定义了Collection等接口,并在抽象类种提供一些骨架方法,方便后面具体实现类的编写,当然这些灵感都是来自JDK源码,先学习搬运然后再学习创造。
1.顶层接口的定义
1.1 PCollection
public interface PCollection<E> extends PIterable<E> {
public abstract int size();
public abstract boolean isEmpty();
public abstract boolean contains(Object o);
public abstract PIterator<E> iterator();
public abstract Object[] toArray();
public abstract <T> T[] toArray(T[] arrayOfT);
public abstract boolean add(E e);
public abstract boolean remove(Object o);
public abstract boolean containsAll(PCollection<?> collection);
public abstract boolean addAll(PCollection<? extends E> collection);
public abstract boolean removeAll(PCollection<?> collection);
public abstract boolean retainAll(PCollection<?> collection);
public abstract void clear();
public abstract boolean equals(Object o);
public abstract int hashCode();
}
1.2PAbstractCollection抽象类种提供一些骨架方法
public abstract class PAbstractCollection<E> implements PCollection<E> {
private static final int MAX_ARRAY_SIZE = 2147483639;
public abstract PIterator<E> iterator();
public abstract int size();
public boolean isEmpty() {
return (size() == 0);
}
public boolean contains(Object paramObject) {
return false;
}
public Object[] toArray() {
return null;
}
public <T> T[] toArray(T[] arrayOfT) {
return null;
}
public boolean add(E e) {
return false;
}
public boolean remove(Object o) {
return false;
}
public boolean containsAll(PCollection<?> paramCollection) {
return false;
}
public boolean addAll(PCollection<? extends E> paramCollection) {
return false;
}
public boolean removeAll(PCollection<?> paramCollection) {
return false;
}
public boolean retainAll(PCollection<?> paramCollection) {
return false;
}
public void clear() { }
}
2. PArrayList 的实现
2.1定义好了最顶层的Collection接口,我们第一篇就来实现一个比较简单的PArrayList
同样的本着面向接口编程的原则,我们首先定义PList接口,从而规定PList的实现类提供的基础功能。
public interface PList<E> extends PCollection<E> {
//collection 公有方法
public abstract int size();
public abstract boolean isEmpty();
public abstract boolean contains(Object O);
public abstract PIterator<E> iterator();
public abstract Object[] toArray();
public abstract <T> T[] toArray(T[] arrayOfT);
public abstract boolean add(E paramE);
public abstract boolean remove(Object o);
public abstract boolean containsAll(PCollection<?> collection);
public abstract boolean addAll(PCollection<? extends E> collection);
public abstract boolean addAll(int paramInt, PCollection<? extends E> collection);
public abstract boolean removeAll(PCollection<?> collection);
public abstract boolean retainAll(PCollection<?> collection);
public abstract void clear();
public abstract boolean equals(Object o);
public abstract int hashCode();
//list 特有方法
public abstract E get(int index);
public abstract E set(int index, E e);
public abstract void add(int index, E e);
public abstract E remove(int index);
public abstract int indexOf(Object o);
public abstract int lastIndexOf(Object o);
public abstract PListIterator<E> listIterator();
public abstract PListIterator<E> listIterator(int paramInt);
public abstract PList<E> subList(int from, int to);
}
2.2 PAbstractList提供骨架方法实现
public abstract class PAbstractList <E> extends PAbstractCollection<E> implements PList<E> {
protected transient int modCount = 0;
@Override
public boolean containsAll(PCollection<?> collection) {
return false;
}
@Override
public boolean addAll(PCollection<? extends E> collection) {
return false;
}
@Override
public boolean addAll(int index, PCollection<? extends E> collection) {
return false;
}
@Override
public boolean removeAll(PCollection<?> collection) {
return false;
}
@Override
public boolean retainAll(PCollection<?>collection) {
return false;
}
@Override
public E get(int index) {
return null;
}
@Override
public E set(int index, E e) {
return null;
}
@Override
public void add(int index, E e) { }
@Override
public E remove(int paramInt) {
return null;
}
@Override
public int indexOf(Object paramObject) {
return 0;
}
@Override
public int lastIndexOf(Object paramObject) {
return 0;
}
@Override
public PListIterator<E> listIterator() {
return null;
}
@Override
public PListIterator<E> listIterator(int paramInt) {
return null;
}
@Override
public PList<E> subList(int paramInt1, int paramInt2) {
return null;
}
@Override
public PIterator<E> iterator() {
return null;
}
@Override
public int size() {
return 0;
}
}
2.3 PArrList
public class PArrayList<T> extends PAbstractList<T> implements PList<T>{
private static final int Inital_Size =10;
private int size;
private int eleCount;
private float growFactor =0.5F;
private 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 boolean add(Object t) {//添加一个元素
if(capacityIsEnough()){
eleCount+=1;
this.array[eleCount-1]= t;
return true;
}else{
growUp();
add(t);
}
return false;
}
@Override
public boolean remove(Object t) { // 移除一个元素
if (eleCount <= 0 || size <= 0 ) {
return false;
}
int index = indexOf(t);
if (index<0) {//不存在
return false;
}else{
removeByIndex(index);
eleCount-=1;
return true;
}
}
@Override
public int 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;
}
}
public 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;
}
}
2.4 测试评估
public class TestPArrayList {
public static void main(String[] args) {
PList<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