JAVA堆,栈的区别,用AarrayList、LinkedList自定义栈
大家都知道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自定义栈的更多相关文章
- C语言中堆和栈的区别
原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...
- LinkdList和ArrayList异同、实现自定义栈
//.LinkdList和ArrayList异同 //ArrayList以连续的空间进行存储数据 //LinkedList以链表的结构存储数据 //栈 先进后出 最上面是栈顶元素 arrayLiat自 ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- Java中的堆和栈的区别
当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...
- Java堆和栈的区别和介绍,JVM的堆和栈
一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于存储实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. ...
- 【转】Java运行时数据区简介及堆与栈的区别
理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...
- java堆和栈的区别
java 的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这 ...
- java堆、栈、堆栈的区别
1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...
- java 堆与栈的区别
1. 堆与栈的区别? 1-1. 数据存放位置: 数据都存放于RAM (Random Access Memory). 1-2. 存放数据的类型:stack栈中保存方法中的基本数据类型(int, do ...
随机推荐
- appium+python 微信小程序的自动化
sudo kill -9 $(lsof -i:8889 -t) mitmweb -p 8889 -s addons.py mitmdump -q -p 8889 -s addons.py http: ...
- python 输出‘\xe8\xb4\x9d\xe8\xb4\x9d’, ‘\xe6\x99\xb6\xe6\x99\xb6’, ‘\xe6\xac\xa2\xe6\xac\xa2’]
如上代码块,结果输出为: [‘\xe8\xb4\x9d\xe8\xb4\x9d’, ‘\xe6\x99\xb6\xe6\x99\xb6’, ‘\xe6\xac\xa2\xe6\xac\xa2’] 北京 ...
- 根据udev的信息判断设备物理路径
udev会生成by-path路径,根据这个就可以判断 dev目录下 [toybrick@localhost dev]$ find | grep platform-fe3c0000 ./disk/by- ...
- SpringBoot整合Quartz和H2的例子
话不多说,直接上代码: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- AndoridSQLite数据库开发基础教程(9)
AndoridSQLite数据库开发基础教程(9) 添加视图 视图是从一个或几个基本表(或视图)中导出的虚拟的表.通过视图可以看到表的内容.下面为数据库添加视图,操作步骤如下: (1)打开的数据库,单 ...
- python中的raise用法
date ; 2019-08-22 15:10:56 try: s = None if s is None: print("s shi kong de ") raise NameE ...
- MySQL远程连接和备份还原
连接远程数据库 mysql -h 数据库地址 -P 端口号 -u 用户名 -p mysql -h -u root -p 备份数据库, 热备份 mysqldump -h 127.0.0.1 -u roo ...
- Spring cloud微服务安全实战-4-7重构代码以适应真实环境
现在有了认证服务器,也配置了资源服务器.也根据OAuth协议,基于令牌认证的授权也跑通了.基本的概念也有了简单的理解. 往下深入之前,有几个点,还需要说一下 使用scopes来控制权限,scopes可 ...
- Spring cloud微服务安全实战-3-6API安全机制之数据校验
校验:非空.唯一性等校验 密码的加密:密码加密来存储. 如何做https的访问 校验 一个层面是接口层面,另外一个层面是数据库层面. Springboot给我们提供了简单的封装 校验的包里面还有其他的 ...
- EasyNVR是怎么做到Web浏览器播放RTSP摄像机直播视频延时控制在一秒内的
背景说明 由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合也是大势所趋.传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都是都需要OCX Web插件进行直播.对 ...