大家都知道java模拟机在运行时要开辟空间所以它有特定的五个内存划分:
1.寄存器;
2.本地方法区;
3.方法区;
4.栈内存;
5.堆内存;
但是我们今天来注重讲一下栈和堆。
栈区(Stack):
1.栈的特点在于它是先进后出的线性表FILO(Last in first out),它的操作数据顺序是从上至下的。
就比如:一包抽巾纸,它放进包装袋时是最底下那一张最先进,但是在我们使用时最先拿出的是最上层的纸巾。
2.栈在被调用时存放在一级缓存中,调用完毕后就释放。
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)被所有线程共享,堆中只存放对象本身,存放在二级缓存中,生命周期由虚拟机的垃圾回收机制定
谢谢观看!