上图是最最基本的结构,这次我采用数组实现栈。使用数组实现栈,由于java的数组是固定长度的。所以我需要写一个增加长度的方法。然后就是迭代的问题了。使用数组实现栈的话,我们需要写一个迭代器。不过这个迭代器非常容易实现,只需要让其implements Iterator再实现Iterator接口的方法就行。下边来看看源代码吧
import java.util.Iterator;
import java.util.Objects;
public class TestStack {
public static class stack<Item>{
/**
* 创建迭代器
*/
private class ReverseArrayIterator implements Iterator<Item>{
private int i=N;
@Override
public boolean hasNext() {
return i>0;
}
@Override
public Item next() {
return a[--i];
}
@Override
public void remove() {
}
}
private Item a[];
private int N;
public stack(int cap){//定义一个容量
a=(Item[]) new Object[cap];
}
public Iterator<Item> iterator(){ //返回一个迭代器
return new ReverseArrayIterator();
}
public boolean isEmpty(){//判断栈是否为空
return N==0;
}
public int size(){//返回栈的元素数量
return N;
}
public void push(Item item){//添加一个元素
if(N==a.length) resize(2*a.length); //如果数组已满,就增加长度
a[N++]=item;
}
public Item pop(){//删除最近添加的元素
Item item=a[--N];// 删除栈顶元素
a[N]=null;//避免对象游离
if(N>0 && N==a.length/4) resize(a.length/2);
return item;
}
private void resize(int max){//增加数组长度
Item[] temp=(Item[]) new Objects[max];
for(int i=0;i<N;i++){
temp[i]=a[i];
}
a=temp;
}
}
public static void main(String[] args) {
stack<Integer> integerstack = new stack<Integer>(100);
integerstack.push(123);
integerstack.push(1);
integerstack.push(13);
integerstack.push(23);
Iterator<Integer> iterator = integerstack.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
再来讲讲游离的问题吧
java中的垃圾回收策略是回收所有无法被访问的对象的内存。而上边pop()方法中被弹出的元素的引用其实还是存在在数组中。但是这个元素其实已经永远无法被访问了,但是java的垃圾收集器比较“机智”没办法知道这一点,除非该引用被覆盖不然他没办法被访问。所以这种保存一个不需要的对象的引用就是游离。在此避免游离的方法很简单就是给他赋值为null即可,这将覆盖无用的引用并使系统使用例被弹出的元素后回收它的内存。