首先是集合类的接口:
public interface ICollection<E> {
public int size();//集合大小
public boolean add(E e);//集合中的添加方法
public IIterator<E> iterator();//迭代器
public Object get(int index);//通过下标获得元素
}
集合接口的实现:
public class MyCollection<E> implements ICollection<E>{
private Object array[];//集合中存放内容的数组,必须为 private ,因为不能够被外部访问到
private int position=-1;//用来判断集合中放了多少个元素了, array.length 返回的是容器的大小,无法得到已经存放了多少元素
private int max;//集合的最大容量
public MyCollection(){//无参构造方法,集合大小为10
this(10);
}
public MyCollection(int capacity){//有参构造方法
if(capacity<=0){
throw new IllegalArgumentException("Illegal param : "+capacity);
}
array=new Object[capacity];
this.max=capacity;
}
@Override
public int size() {
return (position+1);
}
@Override
public boolean add(E e) {
if((position+1)>=max){//如果集合中存放的元素个数>=最大容量 ,此时还要放入元素,就必须进行扩容了
max=max/2*3+1;//这个扩容大小是模仿的 ArrayList
enlarge();//扩容
}
array[++position]=e;
return true;
}
private void enlarge(){
//将 array数组的内容拷贝到 array 中 ,并将容量扩充到 max ----Arrays.copyOf 这个方法的底层实现还是 使用的 System.arraycopy 这个方法
array=Arrays.copyOf(array, max);
}
@Override
public IIterator<E> iterator() {//可以用迭代器去对集合进行操作,例如:遍历
return new MyIterator<E>(this);
}
@Override
public Object get(int index) {
return array[index];
}
}
迭代器接口:
public interface IIterator<E> {
public boolean hasNext();//判断是否还有下一个
public Object next();//得到集合下一个元素
}
迭代器接口的实现:
public class MyIterator<E> implements IIterator<E>{
public ICollection<E> collection;
private int top=-1;//下标
public MyIterator(ICollection<E> collection){//通过集合那里的 iterator() 方法将集合 传进来.
this.collection=collection;
}
@Override
public boolean hasNext() {
if(top<collection.size()-1){
return true;
}else{
return false;
}
}
@Override
public Object next() {
return collection.get(++top);
}
}
现在进行测试:
public class Test {
public static void main(String[] args) {
ICollection<String> c=new MyCollection<String>(2);
c.add("xiaofeiji");
c.add("xiaoxiao");
c.add("xiaobaicai");
c.add("1");
IIterator<String> iterator=c.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
结果在控制台按顺序输出.
原先容量只有2,现在它自动扩容了