大家都知道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. make 实例 二 V56

    ######################################################################### # # Makefile used for buil ...

  2. useState 的介绍和多状态声明(二)

    useState的介绍 useState是react自带的一个hook函数,它的作用是用来声明状态变量. 那我们从三个方面来看useState的用法,分别是声明.读取.使用(修改).这三个方面掌握了, ...

  3. vue入门|ElementUI使用指南

    vue入门|ElementUI使用指南 1.开发前务必熟悉的文档: vue.js2.0中文,项目所使用的js框架 vue-router,vue.js配套路由 vuex 状态管理 Element UI框 ...

  4. C#随机挑选某一个用户或者几个用户信息

    && u.EnabledMark == ).OrderBy(_=>Guid.NewGuid()).Take(); && u.EnabledMark == ).Or ...

  5. MySQL 权限管理 用户管理

    我使用的是 MariaDB 数据库 查看 MySQL 所有用户: select distinct concat('User: \'',user, '\'@\'', host, '\'') as que ...

  6. leetcode 290. Word Pattern 、lintcode 829. Word Pattern II

    290. Word Pattern istringstream 是将字符串变成字符串迭代器一样,将字符串流在依次拿出,比较好的是,它不会将空格作为流,这样就实现了字符串的空格切割. C++引入了ost ...

  7. Python3基础 for-else break、continue跳出循环示例

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  8. glib 检索地址

    http://ftp.acc.umu.se/pub/GNOME/sources/glib/

  9. DataWorks2.0——DataStudio简单对比使用上手

    1.原先的数据管理去哪里了? 悬停在此图标上即可:  2.项目模式有何不同?

  10. Qt编写自定义控件67-通用无边框

    一.前言 在之前的一篇文章中写过一个通用的移动控件,作用就是用来传入任意的widget控件,可以在父类容器中自由移动.本篇文章要写的是一个通用的无边框类,确切的说这不叫控件应该叫组件才对,控件是要看得 ...