问题描述
在用Stack类(栈,栈是一种数据类型,详细介绍见上方链接)创建一个字符串的容器时,输出时总会输出null值。
/**
*下方是一个十进制转二进制的类的方法
*但是输出结果总是后缀null值
*/
public class BinaryOperation {
public static Stack<Integer> binayoperation(int i) {
Stack<Integer> stack = new Stack<Integer>();
while(i>0) {
stack.push(i%2);
i/=2;
}
return stack;
}
public static void main(String[] args) {
Stack<Integer> stk = binayoperation(50);
for(Integer n:stk) {
System.out.print(n);
}
}
}
输出结果如下
思考了好久,终于发现是创建的Stack<Item>类中成员变量的初始化问题导致的,有问题的Stack源码如下
public class Stack<Item> implements Iterable<Item>{
//private Node node = new Node();//该链表对象的初始化是问题的根源,不应该初始化
ptivate Node node;
private int N;
//往Stack栈中添加元素的方法push
void push(Item item) {
Node oldNode = node;
node = new Node();//node对象已经被创建出来,所以只需重新赋值即可,不可重新创建对象
node.item = item;
node.next = oldNode;
N++;
}
//从Stack栈中删除并返回元素的方法pop
Item pop() {
Item item = node.item;
node = node.next;
N--;
return item;
}
// 栈中是否有元素
boolean isEmpty() {
return(N==0);
}
//栈中元素的个数
int size() {
return N;
}
//链表
class Node {
Item item;
Node next;
}
//迭代器的实现
public Iterator<Item> iterator(){
return new ListIterator();
}
private class ListIterator implements Iterator<Item>{
private Node current = node;
public boolean hasNext() {return current!=null;}
public Item next() {
Item item=current.item;
current = current.next;
return item;
}
public void remove() {}
}
Node类的对象有两个成员变量,一个是item,一个是next
class Node {
Item item;
Node next;
}
当只创建Node类的对象node,而不初始化时,node为null。
Node node;
但是当创建了Node类的对象并且初始化后,内存为node分配了空间存放其item,next成员
由此可见,虽然其item,next都为null,但是node本身时存在的,可以被处理输出。
链表中仅有两个值,却有三个节点。因此,在本例中,对象应该先创建,需要时再初始化。