大家都知道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());
}
}

 二:用LinkedList集合去模拟栈的数据结构

//用LinkedList集合去模拟栈的数据结构
LinkedList arr=new LinkedList();
public void push(Object obj) {
arr.addFirst(obj);
}
public Object prop() {
Object object= arr.getFirst();
arr.removeFirst();
return object;
}

//测试代码

//栈
MyStarck myStarck=new MyStarck();
myStarck.push();
myStarck.push();
myStarck.push();
myStarck.push();
myStarck.push();
myStarck.push();
for (int i = ; i <myStarck.arr.size(); i++) {
System.out.println(myStarck.prop()); }

     堆区(heap):

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

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

  

谢谢观看!

JAVA堆,栈的区别,用AarrayList、LinkedList自定义栈的更多相关文章

  1. C语言中堆和栈的区别

    原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...

  2. LinkdList和ArrayList异同、实现自定义栈

    //.LinkdList和ArrayList异同 //ArrayList以连续的空间进行存储数据 //LinkedList以链表的结构存储数据 //栈 先进后出 最上面是栈顶元素 arrayLiat自 ...

  3. Java中堆和栈的区别(转)

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.      Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...

  4. Java中的堆和栈的区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...

  5. Java堆和栈的区别和介绍,JVM的堆和栈

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存.   堆:主要用于存储实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. ...

  6. 【转】Java运行时数据区简介及堆与栈的区别

    理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...

  7. java堆和栈的区别

    java 的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这 ...

  8. java堆、栈、堆栈的区别

    1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...

  9. java 堆与栈的区别

    1. 堆与栈的区别? 1-1. 数据存放位置:   数据都存放于RAM (Random Access Memory). 1-2. 存放数据的类型:stack栈中保存方法中的基本数据类型(int, do ...

随机推荐

  1. git只提交修改部分的代码

    思路: 先用git status 查找出哪些文件被修改过了,然后 只git commit odin/code/pom.xml 1. $ git status (查看当前更改的代码) On branch ...

  2. 高性能计算 —— 中国金融服务业创新发展的助推剂 & 微软

    “高性能计算 —— 中国金融服务业创新发展的助推剂“六大盘点 - 微软 - 博客园https://www.cnblogs.com/stbchina/archive/2011/12/02/HPC-in- ...

  3. MAC下快速打开指定目录(转)

    使用了这么长时间MAC,打开文件查找目录总是感觉还是不如windows来的爽快 1.通过快捷键搜索   command + 空格,输入关键词 2.通过控制台打开    1) 跳转到指定路径  cd  ...

  4. FFmpeg 参数详解(二)

    https://blog.csdn.net/yizhizouxiaqu/article/details/52233673 5.参数选项 如果没有特殊声明,所有的数字参数都以一个字符串代表数字的形式作为 ...

  5. 主外键 设置 on update cascade 和on delete cascade 的区别

    on update cascade 和on delete cascade 的区别 这是数据库外键定义的一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的.updat ...

  6. [转][linux][centos]嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  7. shell编程系列3--命令替换

    shell编程系列3--命令替换 命令替换 命令替换总结 方法1 `command` 方法2 $(command) 例子1: 获取系统的所有用户并输出 for循环能以空格.换行.tab键作为分隔符 [ ...

  8. php 微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo

    get_wx_data.php <?php /** * 获取微信用户信息 * @author: Lucky hypo */ class GetWxData{ private $appid = ' ...

  9. 123457123457#0#-----com.tym.PuzzleGame28--前拼后广--日常pt-tym

    com.tym.PuzzleGame28--前拼后广--日常pt-tym

  10. spring 多个切面如何有序执行

    Spring也能支持多个切面.当有多个切面时,它不会存在任何顺序,这些顺序代码会随机生成,但是有时候我们希望它按照指定的顺序运行. 在此之前要先定义一个切点方法,为此新建一个接口——MultiBean ...