今天看书看到了一个非常有意思的代码,源代码在《think in java》弟357页,代码如下:
package B;
public class LinkedStack<T> {
private static class Node<U>{
U item;
Node<U> next;
Node(){
item = null;
next = null;
}
Node(U item, Node<U> next){
this.item = item;
this.next = next;
}
boolean end(){
return item == null&&next == null;
}
}
1. private Node<T> top = new Node<T>();
public void push(T item){
2. top = new Node<T>(item, top);
}
public T pop(){
T result = top.item;
3,。 if(!top.end()){
top = top.next;
}
return result;
}
public static void main(String[] args) {
LinkedStack<String> lss = new LinkedStack<String>();
for(String s : "A B C D".split(" ")){
lss.push(s);
}
String s;
while((s = lss.pop())!=null){
System.out.println(s);
}
}
}
当第一次看这段代码时,没有理解怎么实现的存储功能,经过debug一步一步调试后,最终弄明白了是如何实现的
下面做一些简单的解释:
main方法中创建了类的同时,其内部已经创建了使用泛型的类Node,
在调用push()方法时,这个方法中的代码很重要,首先,会把截取的A保存进标一的那段代码中的top对象,然后把这个top对象赋值保存给自己本身携带的Node属性,也就是
代码的第四行Node<U> next;
此时然后覆盖之前的top对象,此时的top对象即包含之前的top,也就是next,又包含已经赋值的item,值为A。
再看第二次赋值,第二次调用push方法时,会把最新的top对象(此对象中含有item = A 和 next = top(这个top中的item和next皆为Null))再一次传给自己本身,然后产生新包含上一个top对象的top对象,此时最新的top对象的itm=B,依次赋值,实现保存数据的功能,也就是每个被保存的数据都对应一个Node类型的对象。
这样说可能有些抽象,上一张图片表述一下: