JAVA堆,栈的区别和自定义栈

  大家都知道java模拟机在运行时要开辟空间所以它有特定的五个内存划分:

  1.寄存器;

    2.本地方法区;

    3.方法区;

    4.栈内存;

    5.堆内存;

但是我们今天来注重讲一下栈和堆。

         栈区(Stack):

  1.栈的特点在于它是先进后出的线性表FILO(Last in first out),它的操作数据顺序是从上至下的。

         就比如:一包抽巾纸,它放进包装袋时是最底下那一张最先进,但是在我们使用时最先拿出的是最上层的纸巾。

  2.栈在被调用时存放在一级缓存中,调用完毕后就释放。

扫描二维码关注公众号,回复: 6258420 查看本文章

  3.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

  4.每个栈中的数据都是私有的,其他栈不能访问 

 如何自定义栈:

我用的是arraylist集合中去模拟栈的数据结构:

package com.j2ee;
/**
 * 自定义栈
 * @author Administrator
 *
 */
import java.util.ArrayList;
public class Stack {

     ArrayList<Object> list = new ArrayList<Object>(); // 使用集合存储数据

    // 栈是否为null
    public boolean isEmpty() {
        return list.isEmpty();
    }

    // 栈长度
    public int size() {
        return list.size();
    }

    // 取栈顶元素
    public Object stackTop() {
        if (list.size() == 0) {
            return null;
        }
        return list.get(list.size() - 1);
    }
    // 出栈
    public Object pop() {
        if (list.size() == 0) {
            return "栈为null,无法删除";
        }
        Object obj = list.get(list.size() - 1);
        list.remove(list.size() - 1);
        return obj;
    }

    // 压栈
    public void push(Object obj) {
        list.add(obj);
    }

    // toString
    public String toString() {
        return "Stack:" + list.toString();
    }
}、
    // 压栈
    public void push(Object obj) {
        list.add(obj);
    }

    // toString
    public String toString() {
        return "Stack:" + list.toString();
    }
}

//测试类代码:

package com.j2ee;
/**
 * 测试
 * @author Administrator
 *
 */
public class Temp {
public static void main(String[] args) {
    Stack stack=new Stack();
    System.out.println("是否为空:" + stack.isEmpty());
    System.out.println("长度:" + stack.size());        
    System.out.println("顶元素:" + stack.stackTop());
    System.out.println("出栈:" + stack.pop());
    System.out.println("==============我是分割线================");
    stack.push("本是青灯不归客");
    System.out.println("是否为空:" + stack.isEmpty());
    System.out.println("长度:" + stack.size());        
    System.out.println("顶元素" + stack.stackTop());
    System.out.println("出栈" + stack.pop());
}
}

     堆区(heap):

  1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。

      2.堆的特点在于它是先进先出的缓存FIFO(First In First Out)队列,模拟器只有一个堆区(heap)被所有线程共享,堆中只存放对象本身,存放在二级缓存中,生命周期由虚拟机的垃圾回收机制定

  

谢谢观看!

猜你喜欢

转载自www.cnblogs.com/huangting/p/10893169.html