Generics 通用型 a stack class

写这篇目的:因为是一个Stack,用来放东西的

            1》想了解放的东西:计算机是如何保存着些数据的。

            2》保存时间的长短:即一个对象的生命周期

           3》保存的数据和包含它的类之间的关系。

 

1、我们自己写一个 stack :先进后出,像往货车上放(取)东西一样。

    一、对象是一辆车:LinkedStack<T> ,编译后LinkedStack.class

              1>放东西 push 方法

               2>取东西 pop 方法

               3>放的内容:<T>,表示通用,什么都可以放。

              4>LinkedStack:表示一辆货车。

  二、 对象是车上货物(用内部类Node<T> )T:可以随便按需要定义。 编译后LinkedStack$Node.class

            正在(取,放)货物时的位置和货物:

              1>下一个货物位置:next

              2>上一个货物位置:top;

              3>当前正在取(放)的货物:item;

              4>东西(取,放)完的标志:end   方法                    

三、开始放东西

     1、比如全部是衣服,这就是具体货物,但是我们的LinkedStack放的字符串。

             LinkedStack<String> lss = new LinkedStack<String>();

             准备放东西了,应该设置放东西的上一个货物位置,即全部空值。

             这一步需要启动内部类:private Node<T> top = new Node<T>(); // End sentinel              

     2、开始放

          for (String s : "phasers on stun!".split(" ")) //表示按空格分开的数组。
                   lss.push(s); //开始放东西

         1》首先应该定义

四、看看对象保存图


                                                                                                                     the  object pool 

       

 

五、看看常量池javap -c -verbose LinkedStack.class,

       类成员  topchushi:这是一个实例变量(即需要和一个对象连接),默认方法

            Instance initialization (<init) methods may only use flags ACC_PUBLIC, ACC_PRIVATE, and ACC_PROTECTED. 

     private Node<T> top = new Node<T>(); 默认<init>":()V 如下:


   Constant pool:
   #1 = Class              #2             // generics/LinkedStack
   #2 = Utf8               generics/LinkedStack
   #3 = Class              #4             // java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               top
   #6 = Utf8               Lgenerics/LinkedStack$Node;
   #7 = Utf8               Signature
   #8 = Utf8               Lgenerics/LinkedStack$Node<TT;>;
   #9 = Utf8               <init>
  #10 = Utf8               ()V
  #11 = Utf8               Code
  #12 = Methodref          #3.#13         // java/lang/Object."<init>":()V
  #13 = NameAndType        #9:#10         // "<init>":()V
  #14 = Class              #15            // generics/LinkedStack$Node
  #15 = Utf8               generics/LinkedStack$Node
  #16 = Methodref          #14.#13        // generics/LinkedStack$Node."<init>":()V
  #17 = Fieldref           #1.#18         // generics/LinkedStack.top:Lgenerics/LinkedStack$Node;
  #18 = NameAndType        #5:#6          // top:Lgenerics/



public generics.LinkedStack();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0
         1: invokespecial #12    // Method java/lang/Object."<init>":()V
         4: aload_0
         5: new           #14                 // class generics/LinkedStack$Node
         8: dup
         9: invokespecial #16             // Method generics/LinkedStack$Node."<init>":()V
        12: putfield      #17            // Field top:Lgenerics/LinkedStack$Node;
        15: return
      LineNumberTable:
        line 3: 0
        line 23: 4
        line 3: 15
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      16     0  this   Lgenerics/LinkedStack;
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            0      16     0  this   Lgenerics/LinkedStack<TT;>;

  public void push(T);
    descriptor: (Ljava/lang/Object;)V
    flags: ACC_PUBLIC
    Signature: #27                          // (TT;)V
    Code:
      stack=5, locals=2, args_size=2
         0: aload_0
         1: new           #14                 // class generics/LinkedStack$Node
         4: dup
         5: aload_1
         6: aload_0
         7: getfield      #17              // Field top:Lgenerics/LinkedStack$Node;
        10: invokespecial #28  // Method generics/LinkedStack$Node."<init>"(Ljava/lang/Object;Lgenerics/LinkedStack$Node;)V
        13: putfield      #17             // Field top:Lgenerics/LinkedStack$Node;
        16: return
      LineNumberTable:
        line 26: 0
        line 27: 16
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      17     0  this   Lgenerics/LinkedStack;
            0      17     1  item   Ljava/lang/Object;
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            0      17     0  this   Lgenerics/LinkedStack<TT;>;
            0      17     1  item   TT;


package generics;


public class LinkedStack<T> {
private static class Node<T> {
T item;
Node<T> next;


Node() {
item = null;
next = null;
}


Node(T item, Node<T> next) {
this.item = item;
this.next = next;
}


boolean end() {
return item == null && next == null;
}
}


private Node<T> top = new Node<T>(); // End sentinel


public void push(T item) {
top = new Node<T>(item, top);
}


public T pop() {
T result = top.item;
if (!top.end())
top = top.next;
return result;
}


public static void main(String[] args) {
LinkedStack<String> lss = new LinkedStack<String>();
for (String s : "phasers on stun!".split(" "))
lss.push(s);
String s;
while ((s = lss.pop()) != null)
System.out.println(s);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值